如何在数据库中实现可定制的树形数据结构(即一个未知级别的树形结构)是最佳方式?
我曾经使用一个带有指向其自身的外键的表来完成此操作。
你能想到其他的实现方式吗?这种实现方式是否合理?
如何在数据库中实现可定制的树形数据结构(即一个未知级别的树形结构)是最佳方式?
我曾经使用一个带有指向其自身的外键的表来完成此操作。
你能想到其他的实现方式吗?这种实现方式是否合理?
1) 结构变化频率——树的实际结构变化频率如何。某些模型提供更好的结构更新特性。然而,将结构变化与其他数据变化分开是很重要的。例如,您可能希望对公司的组织图进行建模。有些人会使用邻接表来进行建模,使用员工ID将员工与其主管链接起来。这通常是一种次优的方法。一个经常更好的方法是将组织结构单独建模,并将员工作为该结构的属性进行维护。这样,当员工离开公司时,组织结构本身不需要改变,只需要更改与离开的员工的关联。
2) 树是否读写频繁——某些结构在读取结构时效果非常好,但在向结构写入时会产生额外的开销。
3) 你需要从结构中获取哪些类型的信息 - 一些结构优于提供特定类型的有关结构的信息。例如,查找节点及其所有子节点,查找节点及其所有父节点,查找符合某些条件的子节点计数等。您需要知道将需要哪些信息才能确定最适合您需求的结构。
请查看MySQL中管理分层数据。它讨论了在关系数据库中存储和管理分层(树形)数据的两种方法。
第一种方法是邻接列表模型,这正是您所描述的:具有指向表本身的外键。虽然这种方法很简单,但对于某些查询,如构建整个树状结构,它可能非常低效。
文章中讨论的第二种方法是嵌套集模型。 这个方法更有效和灵活。 详细的解释和示例查询请参考文章内容。
如果你必须使用关系型数据库来组织树形数据结构,那么Postgresql具有很酷的ltree模块,提供了表示存储在分层树状结构中的数据标签的数据类型。 你可以从那里获得想法。(更多信息请参见:http://www.postgresql.org/docs/9.0/static/ltree.html)
通常,LDAP用于组织以分层结构存储的记录。
我觉得有一个表与自己的外键是有意义的。
然后你可以使用SQL中的公共表表达式或Oracle中的connect by prior语句来构建你的树形结构。
更多信息请参见https://learn.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server