【发布时间】:2014-03-30 21:02:56
【问题描述】:
我遇到了一个包含以下关系的数据库模式:
人(ID,姓名) 朋友(ID1,ID2)
ID1 和 ID2 是 Person.ID 的外键
朋友是一种无向关系(即它是双向的)。在模式中,对于从 ID 123 到 ID 456 的给定友谊,它存储为两个元组:(123, 456) 和 (456, 123)。
在我看来,将单个概念实体存储在两个元组中并不好:数据可能会变得不一致;并且数据集中存在重复。
除非我弄错了,我们应该可以对数据库做任何我们想做的事情,即使只有一个元组。在最坏的情况下,可以轻松地重新创建表的版本:
SELECT *
FROM Friend
UNION
SELECT ID2 as ID1, ID1 as ID2
FROM Friend
所以我的问题是:存储无向多对多关系的最佳做法是什么?为什么?
如果将信息存储在两个元组中是最好的处理方式,那么 INSERT INTO、UPDATE 和 DELETE 查询是更改两条记录,还是依靠触发器来保持一致性更好?
【问题讨论】:
-
这里不需要存储两个元组。你可以通过只存储一个关系来做你想做的一切。您必须修改查询以检查两个方向,仅此而已。