【问题标题】:Can a binary tree or tree be always represented in a Database as 1 table and self-referencing?二叉树或二叉树是否可以在数据库中始终表示为 1 个表和自引用?
【发布时间】:2010-06-06 06:46:36
【问题描述】:

之前没感觉过这个规则,但是好像是二叉树或者任意树(每个节点可以有很多孩子但孩子不能指向任何一个父节点),那么这个数据结构可以表示为1个表一个数据库,每一行都有一个自己的ID和一个指向父节点的parentID

这实际上是经典的员工 - 经理图:一个老板可以在他下面有很多人......每个人可以在他下面有n人等。这是一个树形结构,在数据库书籍中表示作为单表的常见示例Employee

【问题讨论】:

  • 您可以使用 Employee-to-Employee 表而不是 parentID 列。我不知道哪个更好。

标签: mysql database-design tree schema-design binary-tree


【解决方案1】:

您的问题的答案是“是”。

Simon 关于你的树变成循环图的警告也是正确的。

关于“您必须手动确保不会发生这种情况,即 DBMS 不会自动为您执行此操作,因为您不会破坏任何完整性或引用规则。”的所有内容,是错误的。

只要您只考虑 SQL 系统,这句话和相应的 cmets 都是正确的。

存在可以纯声明方式为您执行此操作的系统,即您无需编写任何*任何*代码。该系统是 SIRA_PRISE (http://shark.armchair.mb.ca/~erwin)。

【讨论】:

    【解决方案2】:

    是的,您可以通过自引用表来表示层次结构。请注意这种情况:

    Employee    Supervisor
    1           2
    2           1
    

    【讨论】:

    • 那是错误的。你可以检查一下。只是效率很低。
    • 我写道:“您必须手动检查”...我的意思是 DBMS 无法为您做到这一点。
    • 可以。只是不是很快(例如你需要一个循环)
    • 是的...但是您必须对循环进行编程,例如在存储过程中。我的意思是,您仍然需要手动注入一些逻辑。您不能依赖引用/完整性规则。
    【解决方案3】:

    是的,没错。 Here's a good reference

    请注意,您通常需要一个循环来展开树(例如查找传递关系)

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2012-06-05
      • 1970-01-01
      • 2017-04-14
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      相关资源
      最近更新 更多