1

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

User Table
u_ID  | u_Name
-------------
1     |  bob
2     |  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 上的朋友关系。如果我是你的朋友,那么你就是我的朋友(尽管我们都需要认可这种关系)。德克萨斯州

4

2 回答 2

3

由于朋友关系总是双向的,所以不能存储两条线,而只能存储一条。

  1. 选项:

    您可以决定表中的第一个字段是启动友谊的字段。我会再添加两行:日期和确认。

  2. 选项

    在第一个字段中存储较低的 user_id,在第二个字段中存储较高的 user_id。这允许您定义 aunique index (field1, field2)和 a constraint field1 < field2。通过这种方式,您加强了友谊关系的唯一性。

    另一方面,您需要一个附加字段来存储谁发起了友谊(使用 0/1,而不是 user_id)

于 2013-08-13T19:11:02.673 回答
2

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

  • 设置为 1,接受 id1 -> id2,
  • 2 是 id2 -> 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;

这两个语句都可以用位数学编写。

于 2013-08-13T19:58:11.780 回答