【问题标题】:Designing "Friend" relationships across two mysql tables跨两个 mysql 表设计“朋友”关系
【发布时间】:2013-08-15 13:00:08
【问题描述】:

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

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 上的朋友关系。如果我是你的朋友,那么你就是我的朋友(尽管我们都需要认可这种关系)。发送。

【问题讨论】:

  • 单向关系就够了。有可能成为她的朋友而她不是你的朋友吗?

标签: mysql sql normalization relationship


【解决方案1】:

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

  1. 选项:

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

  2. 选项

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

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

【讨论】:

  • @Declan_K 他没说应该存储两次。
【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多