0

我有一个表必须引用另一条记录,但属于同一个表。这是一个例子:

Customer
********
ID
ManagerID (the ID of another customer)
...

我对这样做有一种不好的感觉。我的另一个想法是只有一个单独的表来存储关系。

CustomerRelationship
***************
ID
CustomerID
ManagerID

我觉得我可能把这样一件微不足道的事情复杂化了,但是,我想对这个特定场景的最佳方法有一些想法?

谢谢。

4

8 回答 8

3

第一个设计没有错。第二个,你有一个“中间”表,用于多对多关系,我认为这不是你的。

顺便说一句,该中间表没有自己的 ID。

于 2009-08-25T23:00:55.370 回答
2

为什么你对此有一种“不好的感觉”?表引用自己的主键是完全可以接受的。引入辅助表只会增加查询的复杂性并对性能产生负面影响。

于 2009-08-25T23:01:28.893 回答
2

一个客户可以有多个经理吗?如果是这样,那么您需要一个单独的表。否则,一个表就可以了。

于 2009-08-25T23:01:44.150 回答
2

您可以使用第一种方法。另请参阅使用自联接

于 2009-08-25T23:03:23.180 回答
2

第一种方法绝对没有问题,事实上,Oracle 至少从第 6 版开始就包含了 SQL 的“CONNECT BY”扩展,旨在直接支持这种类型的层次结构(如果您愿意,可能会使 Oracle 值得考虑作为您的数据库)将会做很多这样的事情)。

您需要在没有类似内容的数据库中进行自联接,但这也是一个非常好的标准解决方案。

于 2009-08-25T23:05:37.403 回答
0

作为一名程序员,我喜欢第一种方法。我喜欢少一些桌子。在这里,我们甚至没有谈论规范化,为什么我们需要更多的表?那只是我。

于 2009-08-25T22:59:52.393 回答
0

在这里遵循 KISS 原则:保持简单,(傻 | 愚蠢 | 梭哈 | [无论你喜欢什么以 S 开头的绰号])。一张桌子去,除非你有理由需要更多。

请注意,如果一对多/多对多关系最终成为这种情况,您可以将现有列提取到自己的表中,然后填写新条目。

于 2009-08-25T23:04:23.630 回答
0

我建议避免使用这种自引用表的唯一原因是 SQL Server 确实有一些地方存在自引用表的限制。

一方面,如果您碰巧需要索引视图,那么您会发现如果视图定义中使用的表之一确实是自引用的,您将无法创建集群您的观点索引:-(

但除此之外 - 设计本身是合理且绝对有效的 - 去吧!我总是喜欢让事情尽可能简单(但不会比这更简单)。

马克

于 2009-08-26T05:08:42.853 回答