喜欢按钮的数据库结构(如Facebook喜欢或谷歌+1)

时间:2011-08-27 09:55:08

标签: php mysql facebook-like

我想知道像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万以上。

有更高效的设计吗?

3 个答案:

答案 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,由于各种原因,您提议添加带有序列化数据的列是“错误的”:

  1. 这在高并发环境中并不好,就像Facebook一样。由于您总是更新一行,因此您的流程如下:从MySQL读取值,在应用程序中更改它,更新MySQL中的值。为了防止并发问题,您必须在单个事务中执行此操作,从而将行锁定(相对)长时间。如果你有数以千计的并发请求想要做同样的事情,这真的很糟糕。
  2. “text”列具有最大长度。因此,您可以添加最多数量的“喜欢”。此外,通过不断扩大字段,您在数据库文件中引入了大量碎片。这真的很低效!
  3. 最后但并非最不重要的是,这不是使用RDMS(关系数据库管理系统)的正确方法,因为MySQL是“哲学上”的说法。
  4. 无论如何,这里的每个人都回答了对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拥有真正庞大的用户群。