我已经阅读了许多mysql的Facebook友谊表的解决方案,并决定在一个相当简单的表中有两个字段user_a和user_b。然后,我会使用带有UNION的查询来获取所有用户朋友的列表(因为它们可能位于user_a或user_b中)。我现在的问题是...有一个自动递增唯一的ID或复合ID是更好吗?友谊表的最佳主键
表1)
USER_A,USER_B
表2)
UNIQUE_ID,USER_A,USER_B
我已经阅读了许多mysql的Facebook友谊表的解决方案,并决定在一个相当简单的表中有两个字段user_a和user_b。然后,我会使用带有UNION的查询来获取所有用户朋友的列表(因为它们可能位于user_a或user_b中)。我现在的问题是...有一个自动递增唯一的ID或复合ID是更好吗?友谊表的最佳主键
表1)
USER_A,USER_B
表2)
UNIQUE_ID,USER_A,USER_B
我的评论:
compound key
在surrogate key
以节省空间,避免额外的指标更新:
你可以考虑那种友谊是双向的。仅仅因为UserA已经和UserB交友,并不意味着UserB已经和UserA交友了。如果你跟踪双方,它会让你的查询更容易。在这种情况下,您可以这样做:
Friend
-------
UserID
FriendUserID
因此,您只在UserID列上匹配以获取用户的朋友列表。如果两个用户互相友好,则在表格中放置两行。如果一个用户不满意另一个用户,则删除该行。
尽管从设计的角度来看复合钥匙解决方案似乎更加优雅,乍看之下耗费的空间更少,但在某些情况下,我会用personnaly替代自动递增的数字ID。
如果友谊在其他地方被引用,那么从长远来看它将节省更多的空间,使得引用表中的单个数字ID作为外键而不是化合物ID。另外,如果您经常查询友谊ID,则单个id上的索引将比(复合索引)更短且更快。
我确实考虑过最后一点......但如果用户都是奇数或偶数呢? – Mark 2010-05-05 11:50:00
@mark:好点,没有咖啡...更新 – RedFilter 2010-05-05 11:51:32
好点,因为经常有两个奇怪的人会成为朋友... – 2010-05-05 11:51:55