存储用户关系的最佳方式是什么,例如友谊,必须是双向的(你是我的朋友,因此我是你的朋友)。数据库,例如MySQL的?
我可以想到两种方式:
当然有更好的东西?
答案 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。