【发布时间】:2013-03-31 18:13:37
【问题描述】:
我有一个带有主键 _id 的用户的 MySQL 表,我想将友谊(在其他用户的朋友列表上的可见性)表示为带有 userId 外键对的表。我在想这样的事情:
CREATE TABLE UserFriendships (
userIdA INT NOT NULL,
userIdB INT NOT NULL,
PRIMARY KEY (userIdA, userIdB),
FOREIGN KEY (userIdA) REFERENCES Users(_id)
FOREIGN KEY (userIdB) REFERENCES Users(_id)
)
据我了解,这将允许将 (userIdA = 2, userIdB = 7) 和 (userIdA = 7, userIdB = 2) 作为不同的行插入。我希望每个友谊一行,即每对 userId 一行。
有谁知道我可以如何改进这一点?即使满足上述约束条件,要获取用户 foo 的所有朋友的列表,我也必须进行联合,例如:SELECT userIdB AS friendUserId WHERE userIdA = foo UNION SELECT userIdA WHERE userIdB = foo。这是完成该查询的最佳方式,还是我应该考虑更改我的架构?
【问题讨论】:
-
互惠怎么处理?
-
使用任何其他 DBMS 会很容易,但使用 MySQL 我只能想到一个触发解决方案来防止这种情况。
-
@Strawberry 我没有想到这一点,但我可能会包含一个单独的 FriendRequests 表,一旦得到回报,就会插入到 UserFriendships 中。尽管它们将包含相同的数据,所以这似乎是多余的不是吗...
-
@Strawberry 我还可以向 UserFriendships 添加另外两个字段,confirmedByUserA 和 confirmByUserB。好友请求的发送者设置了他们的确认标志,没有设置的就是接收者。
-
好的。很好,你正在考虑这个。下一个问题“我想要每个友谊一行,也就是说每对 userId 一行。”为什么?为什么不是两个?这样我就可以“解除”你的好友(即禁止你查看我的个人资料/更新),而你不会自动“解除”我的好友。
标签: mysql sql union composite-primary-key