在关系数据库中存储1:1用户关系的最佳方法

时间:2010-05-26 01:00:01

标签: mysql database database-design relational-database

存储用户关系的最佳方式是什么,例如友谊,必须是双向的(你是我的朋友,因此我是你的朋友)。数据库,例如MySQL的?

我可以想到两种方式:

  1. 每次用户与另一个用户交朋友时,我都会向数据库中添加两行,第一行包含启动用户的用户ID,后跟下一列中接受用户的UID。 B行将是相反的。
  2. 你只需添加一行,UID(发起用户),然后是UID(接受用户);然后在尝试确定用户1是否是用户2的朋友时,只搜索两列。
  3. 当然有更好的东西?

4 个答案:

答案 0 :(得分:8)

我会有一个朋友或者其他的链接表,其中2列都是PK,而且都是用户表的FK。

两列都是UID,每个朋友关系你有两行(A,B和B,A)。只要两列都是PK,它应该仍然是正常格式(尽管其他人可以自由纠正我)

它的查询稍微复杂一点,但没有任何东西不能被存储过程或某些业务逻辑抽象出来,而且它是普通格式的,这通常很好。

答案 1 :(得分:4)

您可以检查两个user_id中哪一个最低,并按特定顺序存储它们。这样,您不需要为一个友谊提供双行,并且仍然可以简化您的查询。

user_id_low | user_id_high

一个简单的查询来检查您是否已经与某人成为朋友:

<?php
$my_id = 2999;
$friend_id = 500;

$lowest = min($my_id, $friend_id);
$highest= max($my_id, $friend_id);

query("SELECT * FROM friends WHERE user_id_low=$lowest AND user_id_high=$highest");
?>

或者您可以使用mysql找到最低/最高的用户ID

<?php
query("SELECT * FROM friends WHERE user_id_low=LEAST($my_id, $friend_id) AND user_id_high=GREATEST($my_id, $friend_id)");
?>

让你所有朋友的身份

<?php

query("SELECT IF(user_id_low=$my_id,user_id_high,user_id_low) AS friend_id FROM friends WHERE $my_id IN (user_id_low, user_id_high)");

?>

答案 2 :(得分:3)

使用双行,在创建额外数据的同时,将大大简化您的查询并允许您进行智能索引。我还记得在Twitter的自定义MySQL解决方案中看到信息,其中他们使用了一个额外的字段(朋友#,基本上)来进行自动限制和分页。看起来很顺利: https://blog.twitter.com/2010/introducing-flockdb

答案 3 :(得分:-6)

使用键值存储,例如Cassandra。