2010-05-05 48 views
0

我已经阅读了许多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

回答

1

我的评论:

  • 无论是对关键的做法是好的。我宁愿compound keysurrogate key以节省空间,避免额外的指标
  • 你可能需要一个代理键,但 - 些DALS不复合键的作用

更新:

你可以考虑那种友谊是双向的。仅仅因为UserA已经和UserB交友,并不意味着UserB已经和UserA交友了。如果你跟踪双方,它会让你的查询更容易。在这种情况下,您可以这样做:

Friend 
------- 
UserID 
FriendUserID 

因此,您只在UserID列上匹配以获取用户的朋友列表。如果两个用户互相友好,则在表格中放置两行。如果一个用户不满意另一个用户,则删除该行。

+0

我确实考虑过最后一点......但如果用户都是奇数或偶数呢? – Mark 2010-05-05 11:50:00

+0

@mark:好点,没有咖啡...更新 – RedFilter 2010-05-05 11:51:32

+3

好点,因为经常有两个奇怪的人会成为朋友... – 2010-05-05 11:51:55

0

尽管从设计的角度来看复合钥匙解决方案似乎更加优雅,乍看之下耗费的空间更少,但在某些情况下,我会用personnaly替代自动递增的数字ID。

如果友谊在其他地方被引用,那么从长远来看它将节省更多的空间,使得引用表中的单个数字ID作为外键而不是化合物ID。另外,如果您经常查询友谊ID,则单个id上的索引将比(复合索引)更短且更快。