社交网站的数据库关系或朋友表设计

Dom*_*Dom 6 php mysql database database-design

您好我正在创建一个社交网站,我想知道如何创建用户之间的关系.许多网站都说我应该创建一个关系/朋友表,但我展望未来并相信这将是无效的.这个想法可能像Facebook一样受欢迎,我想为那么多用户做好准备.Facebook有4亿用户,所以朋友表至少是其中的150倍.我想,对一些朋友进行查询会很慢.那么解决方案是否是包含其朋友ID的每个用户的单独表格.或包含ID的关联CSV文件.任何帮助将非常感谢我的网站的设计.谢谢

Fra*_*mer 32

构建您今天需要的架构,而不是您认为5年后需要的架构.

你认为Facebook设计他们的架构在第一天支持4亿用户吗?当然不是.建立这种规模是复杂,昂贵,老实说,如果你现在尝试,你可能会错了,无论如何必须重做它.

说实话:你有更好的机会赢得彩票,而不是很快就会有4亿用户.即使你这样做,你的项目也将拥有数百名工程师 - 为重新设计模式提供足够的带宽.

现在是构建简单的时候了.

编辑以添加一些可靠的示例:

Youtube:

他们经历了一个共同的演变:单个服务器,转到具有多个读取从属的单个主服务器,然后对数据库进行分区,然后采用分片方法.

把事情简单化!简单性使您可以更快地重新架构,以便您可以对问题做出响应.确实,没有人真正知道简单是什么,但如果你不害怕做出改变,那么这就是简单易行的好兆头.

Livejournal还从单个服务器上的单个数据库发展到多个分片复制数据库

我相信你可以在高度可扩展性博客上找到更多的例子


OMG*_*ies 7

当你想到最终支持数百万用户,你只看到过一个特定的人的朋友列表-限制数据的实际量大幅 ...

为了在数据库中维护规范化的友谊关系,您需要两个表:

USERS

  • user_id(主键)
  • 用户名

FRIENDS

  • user_id(主键,USERS的外键(user_id))
  • friend_id(主键,USERS的外键(user_id))

这将阻止重复(IE:1,2)发生,但不会因为(2,1)有效而停止反转.您需要一个触发器来强制执行关系中只有一个实例...


Nov*_*kov 5

在您的代码中,将关系插入表时,请遵循约定.

issueSQLQuery("INSERT INTO relationships (friend1, friend2) 
    VALUES (?, ?)", min(friend_1_ID, friend_2_ID), max(friend_1_ID, friend_2_ID))
Run Code Online (Sandbox Code Playgroud)

对于检索也是如此.当然,这可以在存储过程中完成.