我有一个 PHP Web 应用程序,它使用 MySQL 数据库进行对象标记,其中我使用了被接受为答案的标记结构这个问题.
我想实现一个标签层次结构,其中每个标签都可以有一个唯一的父标签。然后,搜索父标签 T 将匹配 T 的所有后代(即 T、父标签是 T(T 的子代)、T 的孙子等)。
最简单的方法似乎是在标签表中添加一个 ParentID 字段,其中包含标签的父标签的 ID,如果标签没有父标签,则添加一些幻数。然而,搜索后代需要重复对数据库进行全面搜索,以找到每个“一代”中的标签,这是我想避免的。
一种(大概)更快但不太标准化的方法是拥有一个包含每个标签的所有子代,甚至每个标签的所有后代的表。然而,这存在数据库中数据不一致的风险(例如,一个标签是多个父级的子级)。
有没有一种好方法可以让查询快速找到后代,同时保持数据尽可能规范化?
我使用两列来实现它。我在这里稍微简化了它,因为我必须将标签名称保留在单独的字段/表中,因为我必须将其本地化为不同的语言:
例如,查看这些行:
tag path
--- ----
database database/
mysql database/mysql/
mysql4 database/mysql/mysql4/
mysql4-1 database/mysql/mysql4-1/
oracle database/oracle/
sqlserver database/sqlserver/
sqlserver2005 database/sqlserver/sqlserver2005/
sqlserver2005 database/sqlserver/sqlserver2008/
etc.
使用like
路径字段上的运算符您可以轻松获取所有需要的标记行:
SELECT * FROM tags WHERE path LIKE 'database/%'
有一些实现细节,例如当您移动层次结构中的节点时,您也必须更改所有子节点等,但这并不难。
还要确保路径的长度足够长 - 在我的例子中,我没有使用路径的标签名称,而是使用另一个字段来确保路径不会太长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)