可以为自己提供一个具有引用完整性的表吗?

时间:2011-05-13 18:59:49

标签: mysql sql

是否可以为自己设置一个带有循环引用完整性密钥的表?例如,如果我有一个名为Container的表

ObjectId  ParentId
1         1
2         1
3         2

ObjectId 1引用自身。 Id的2和3引用了他们各自的父母,他们也在同一张桌子上。如果不删除2,就不可能删除3而不删除1,并且删除1是不可能的。

我知道我可以通过交叉引用表来完成同样的事情,例如,

   ObjectId  ContainerId
   1         1
   2         2
   3         3

   ContainerId  ObjectId
   1            1
   2            1
   3            3

但我对第一种完成它的方式感兴趣,因为它会消除可能不必要的表。这可能吗?

4 个答案:

答案 0 :(得分:4)

是的,自引用表格很好。

它们是表示深层嵌套层次结构的经典方式。

只需将子列从子列设置为父列(因此,子列中的值必须存在于父列中)。

答案 1 :(得分:3)

第一种方式可行,但是如果您尝试存储任意深度的树,则递归查询将很慢。您可以查看存储邻接列表或其他方法(请参阅http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/)。

我们做的一件事是在每个对象及其所有后继者中存储(在一个单独的表中),并在主表中有一个“父”指示符,我们用它来在应用程序中构建树。 / p>

答案 2 :(得分:3)

我已多次这样做了。但要注意,如果你真的在管理数据的层次结构,那么SQL就不擅长树状查询。一些SQL供应商有SQL扩展来帮助解决这个问题,但是Joe Celko的'嵌套集'是猫的喵喵。你会在搜索中获得很多点击量。

目前,我使用嵌套集方法,并将自引用'parentID'作为引用的快捷方式:

  • 谁是我的父母?
  • 我的直系孩子是谁?

其余的是嵌套集查询。

答案 3 :(得分:0)

目标,乔治,在使用自引用嵌套集方法时不是要消除不必要的表。相反,它是处理一个事先不知道深度的层次结构:你老板的老板老板的老板。谁知道组织树有多深?如果您事先知道层次结构的深度,并且不经常更改,那么使用单独的表会更好,因为编写针对嵌套集的查询是最好的避免。简单性比复杂性更好。