【发布时间】:2011-08-24 12:22:56
【问题描述】:
我有几个人,一个人可以联系多个其他人,所以基本上“默认”表格是:
persons (id)
contacts (person1_id, person2_id)
使用此架构,我必须发出类似
的查询SELECT *
FROM contacts c
WHERE ( person1_id = *id of person1* AND person2_id = *id of person2* )
OR
( person1_id = *id of person2* AND person2_id = *id of person1* )
当我只插入一次这样的关系时得到两个人之间的关系。
处理这种情况的常见做法是什么?
- 插入一次数据并执行这样的 OR 查询
- 插入关系两次,这样person1_id = person1的id AND person2_id = person2的id就足够了
- 完全不同的方法?
假设:
- m:n 表实际上包含其他数据,因此如果我为这两种方式创建关系,则必须复制数据
- 这是应用程序的核心部分,大多数重要查询至少涉及一个子查询,用于确定是否存在此类关系
【问题讨论】:
-
阅读一下 SQL 中的无向图,这就是您的
contacts表所代表的内容。 -
确保这确实符合您的要求,这意味着当 person1 联系 person2 时,这与 person2 联系 person1 的含义相同。那可能不是您真正想要的;我有时将区别描述为 twitter “follow” 模型与 facebook “friends” 模型。
标签: postgresql database-schema