繁体   English   中英

存储和查询无向多对多关系

[英]Storing and querying undirected many-to-many relationships

我遇到了一个数据库架构,其中包含以下关系:

人(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查询进行更改两个记录还是依靠触发器来保持一致性会更好吗?

好吧,在大多数数据库中,我可能会在以下两个条件下为“ Friends表排一行:

  • id1,id2上的唯一索引
  • 检查id1 <id2的约束

但是,在MySQL中,您无法实现检查约束。 因为您必须诉诸触发器,所以您可能还具有用于管理重复行的插入/更新/删除触发器。

两种方法都有优点和缺点。 例如,对于第一个,您需要注意插入值的顺序。 或者,您需要一个触发器。 或者,无论如何,我通常要做的是有一个存储过程,该过程包装数据库更改并照顾正确的插入顺序。 并且,获取X的所有好友需要更复杂的查询。

第二种方法使用更多的空间,这可能很麻烦。 但是,它更容易回答诸如“谁是您的朋友的朋友”之类的问题。 但是插入和更新会有更多开销。

最后,这实际上取决于您要运行哪种查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM