Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为facebook风格的walling页面提高数据库性能_Php_Mysql_Facebook_Database Design_Social Networking - Fatal编程技术网

Php 为facebook风格的walling页面提高数据库性能

Php 为facebook风格的walling页面提高数据库性能,php,mysql,facebook,database-design,social-networking,Php,Mysql,Facebook,Database Design,Social Networking,这是关于一个社交网站。让Facebook成为我们的榜样 mysql服务器中有一个表:“posts”用于保存所有post的预记录(为了简单起见,不包括注释)。其栏目包括: id、post、用户id、第一个id、第二个id id:主键,自动递增 帖子:写在墙上的帖子(无论是登录用户的帖子还是他/她的朋友的帖子) user_id:登录用户的id(假设为A) friend_id_1:登录用户的朋友(假设为B)。当A在B的墙上写字时,使用此字段 friend_id_2:登录用户的朋友的朋友(假设为C) A

这是关于一个社交网站。让Facebook成为我们的榜样

mysql服务器中有一个表:“posts”用于保存所有post的预记录(为了简单起见,不包括注释)。其栏目包括:

id、post、用户id、第一个id、第二个id

id:主键,自动递增

帖子:写在墙上的帖子(无论是登录用户的帖子还是他/她的朋友的帖子)

user_id:登录用户的id(假设为A)

friend_id_1:登录用户的朋友(假设为B)。当A在B的墙上写字时,使用此字段

friend_id_2:登录用户的朋友的朋友(假设为C)

A和B之间是否有任何消息对应关系,并相应地记录在mysql表中

假设B在C的墙上写了一些东西,那么B的朋友们会在他们各自的墙上看到。假设B有100个朋友。我们可以这样在上述表格中记录:frnd_id_2将用于记录C的id

如果frind_2有一个“0”记录,则消息对应关系仅在用户id和frnd_id_1之间,否则将意味着frnd_id_1已写在frnd_id_2的墙上,frind_id_1是用户id的朋友

到目前为止,我认为,一切都与FACEBOOK完全相似

但是-

假设B有100个朋友。在这种情况下,如果B写在C的墙上(假设所有隐私设置r对朋友的朋友开放)。如果采用上述策略,表中将有101条记录:

1) 一条记录仅仅意味着B已经张贴在C的墙上(frnd_id_2=0)。(让我们称之为主记录)

2) B的100个朋友的另外100条记录。(frnd_id_2!=0)

这就是我脑子里的想法。我可以通过在“post”列中插入(或将“post”列保留为空并创建另一个列,即“main_record_id”)来改进它,不是完整的消息,而是主记录的id

但问题是:对于单个post,需要执行101个db查询(在本例中)。还有其他方法可以提高数据库性能吗


我使用PHP作为脚本语言。

或一个数据库查询,它在一次网络往返中返回所有信息。我会将它们批处理到一个JOIN查询中

如果你想保存这些记录,你就不能不保存它们,但你可以控制如何访问它们


要记住的另一个想法是控制返回的结果集的大小。你真的需要同时拥有100个朋友吗?一次十个你能做得好吗?当您有1000或10000条记录要返回时,这将变得特别重要

一个简短的回答:不要将MYSQL用于类似于facebook的wall——这对于这样的目的是非常无效的

不使用sql数据库,例如MongoDB。我保证你会惊讶地发现,对于使用不同对象的实时新闻源来说,它是多么方便


您还可以组合两个DBs:MongoDB用于newsfeed,MySQL用于其他任何内容。

为什么要使用负标记?有什么解释吗?一开始我误解了这个问题。别担心。你不能取消-ve评级吗?现在我想我不想了。除非有足够多的人同意我的意见,你的问题应该结束,否则你不会受到惩罚。不要再担心了。1个数据库查询可以在一次网络往返中返回所有信息。我会把它们分批放到一个加入查询中。“请解释一下,因为我不明白。”。要加入哪些表格?”一次处理10条记录也可以,剩下的90条记录何时处理?第一条记录是Google for SQL JOIN。我假设用户和朋友或用户和帖子之间存在一对多的关系。剩下的90条记录怎么办?首先,编写查询以便不返回它们。第二,为用户提供一个“next10”链接,这样他们就可以获得记录11-20、21-30等等。我知道SQLJoin。对于所有用户,墙中的帖子将存储在一个表中。那么要加入哪些表呢?至于90条记录,我并不是说一次显示墙上的所有帖子。相反,当B在C的墙上写东西时,对于B拥有的100条Firnd,需要将100条记录插入数据库中,以便100个朋友在查看墙壁时可以在墙上看到它们。“100条记录”是关于在墙上显示这些记录的,我想@duffymo试图说,与其插入100条记录,不如只插入一条,然后根据你的朋友使用“加入”在墙上显示帖子。换句话说,规范化数据库你能帮助规范化这里所述的表吗?在这种情况下,应该做些什么来规范化db(插入101查询)?