友谊表的最佳主键

时间:2010-05-05 11:41:12

标签: mysql primary-key

我已经阅读了一些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

2 个答案:

答案 0 :(得分:1)

我的评论:

  • 关键的任何一种方法都可以。我希望compound key超过surrogate key以节省空间并避免使用其他索引
  • 您可能需要代理键 - 某些DAL不能使用复合键

<强>更新

你可能会认为友谊是双向的。仅仅因为UserA已经与UserB交往并不意味着UserB已经与UserA建立了联系。如果您跟踪双方,则可以更轻松地查询。在这种情况下,您可以:

Friend
-------
UserID
FriendUserID

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

答案 1 :(得分:0)

虽然从设计的角度来看,复合键解决方案似乎更优雅,乍看之下耗费的空间更少,但在某些情况下,我个人会改为使用自动递增的数字ID。

如果在其他地方引用了友谊,那么从长远来看,它将节省更多空间,以便在引用表中将单个数字ID作为外键而不是复合ID。另外,如果您经常查询友谊ID,单个ID的索引(略微)会比复合索引更短更快。