我想知道像Facebook这样的按钮的数据库结构或Google +1等等。
喜欢按钮是社交网站的常见元素。用户可以喜欢和不同于消息来显示他们对消息的支持。
系统必须先检测用户喜欢或不喜欢此消息,以显示用户点击的不同或喜欢按钮。
但是这个功能如何工作以及数据库结构是什么?
我想出了这个方法:
每封邮件/帖子都有赞列,可以像数据一样保存序列化用户。
Post table
id content like(serialized user_id)
1 hi world a:4:{i:0;i:234;i:1;i:32;i:2;i:423;i:3;i:4215;}
2 this is a good day a:2:{i:0;i:2324;i:1;i:342;}
并在输出帖子之前反序列化并检测user_id
while($row=mysql_fetch_row($sqlresult))
{
$like_data_array = unserialize($row['like']);
if( in_array( $user_id , $like_data_array ) )
{
echo 'you liked this post';
echo '<button>unlike</button>';
}
else
{
echo '<button>like</button>';
}
}
但我认为这种方法对于大量的喜欢来说太慢了。特别是这个帖子超过10万以上。
有更高效的设计吗?
答案 0 :(得分:3)
在规范化的数据库中,这个东西是用三个表完成的:
用户 - 包含列:id,name等。
帖子 - 包含列:id,内容等。
喜欢 - 有列:user_id,post_id(user_id是来自用户的外键,post_id是来自帖子的外键)
因此,如果您想查看用户是否喜欢某个帖子,您可以执行类似以下命令的操作:
SELECT * FROM likes WHERE post_id = 123456 AND user_id = 1000
答案 1 :(得分:1)
如果我想用MySQL(或任何其他关系数据库)做到这一点,我肯定会像安德烈建议的那样做。这是“正确”的方式!实际上,这就是我们拥有关系数据库的原因。 如果设计正确,使用缓存(memcached et similia,还有MySQL的查询缓存),这实际上效率不高。
anlai,由于各种原因,您提议添加带有序列化数据的列是“错误的”:
无论如何,这里的每个人都回答了对RDMBS的思考......但是如果Facebook没有使用RDBMS呢? (可能他们不是!) 我们在2011年,我们也有“NoSQL”数据库:)
以MongoDB为例。通过无模式页面,您可以创建“帖子”集合,例如:
posts.url = url of the like
posts.likes = array of users who liked (for example posts.like = [{name: "john Doe", uid: 12}, {name: "Mario", uid: 43}] ).
通过这种方式,您不必查询其他表。 更新(在posts.like数组中插入新元素)是原子操作,因此您不必担心并发问题。 这就是MongoDB(或其他非关系型DBMS)的设计目标。
答案 2 :(得分:0)
必需品在那里。我认为这个操作只受数据库提取的限制,所以你要做的就是优化你的查询,只获得该帖子上与该用户相关的内容,如果你有太多的计算字段,你应该考虑一个计算操作的冗余表。 / p>
我真的不认为Facebook对“赞”按钮进行了特殊优化,不同于为用户区域分配缓存(例如,为已登录的用户提供了预先设置的数据集)。 Facebook拥有真正庞大的用户群。