在两个mysql表中设计“Friend”关系

时间:2013-08-13 19:03:06

标签: mysql sql normalization relationship

我有用户表和连接表来记录用户之间的“友谊”。我有一个关于如何记录“友谊”关系的问题。

User Table
u_ID  | u_Name
-------------
1     |  bob
2     |  jill

让我们说bob和jill是朋友。联接表应该记录两个方向的友谊吗?

双向关系??

Friends Table
f_ID | u_ID1 | u_ID2
--------------------
1    |   1   |   2
2    |   2   |   1

或单一方向关系就足够了?

Friends Table
f_ID | u_ID1 | u_ID2
--------------------
1    |   1   |   2

我的用例与Facebook上的朋友关系很接近。如果我是你的朋友,那么你就是我的朋友(我们都需要认可这种关系)。 TX。

2 个答案:

答案 0 :(得分:3)

由于朋友关系总是双向关系,因此您不得存储两行,而只能存储一行。

  1. 选项:

    您可以决定表格中的第一个字段是发起友谊的字段。我还要再添加两行:date和confirm。

  2. 在第一个字段中存储较低的user_id,在第二个字段中存储较高的user_id。这允许您定义unique index (field1, field2)constraint field1 < field2。这样就可以强化友谊关系的独特性。

    另一方面,你需要一个aditional字段来存储发起友谊的人(使用0/1,而不是user_id)

答案 1 :(得分:2)

您可以将分数字段添加为int吗?

  • 设为1,id1 - &gt; id2被接受,
  • 2是id2 - &gt; ID1。
  • 如果您之后需要更多类型的关系,请使用更高的数字(其数学位数,所以4,8,16等)。

这是稍微多一点的操作代码,但在磁盘空间中效率很高。您需要处理多少百万行?

列出id1的朋友

select u_id, u_name from users join Friends on u_id=id2 where id1= @X and (score % 2) =1;

列出id2的

select u_id, u_name from users join Friends on u_id=id1 where id2= @X and (score & 1)=1;

这两个陈述都可以用bitmaths编写。