Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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 数据库设计——”;推;模型,或在写入时扇出_Php_Mysql_Database_Database Design_Database Schema - Fatal编程技术网

Php 数据库设计——”;推;模型,或在写入时扇出

Php 数据库设计——”;推;模型,或在写入时扇出,php,mysql,database,database-design,database-schema,Php,Mysql,Database,Database Design,Database Schema,背景信息: 我试图从我跟踪的人那里检索图像,按最新时间排序。这就像一个推特新闻提要,在那里他们会显示你朋友的最新提要 计划: 目前我只需要考虑一件事,那就是图像。在未来,我计划分析用户的行为,并将他们可能喜欢的其他图像添加到他们的提要中,等等 我个人觉得“拉”模式,或者在我实时拉取所有信息的加载时扇出,比推模式更糟糕。因为假设我有100个追随者,我将不得不按时间取回和排序。(如果我错了,请告诉我,例如,读比写好100倍(推模式) 我想到的推送模型的当前设计如下 Table users_feed

背景信息:

我试图从我跟踪的人那里检索图像,按最新时间排序。这就像一个推特新闻提要,在那里他们会显示你朋友的最新提要

计划:

目前我只需要考虑一件事,那就是图像。在未来,我计划分析用户的行为,并将他们可能喜欢的其他图像添加到他们的提要中,等等

我个人觉得“拉”模式,或者在我实时拉取所有信息的加载时扇出,比推模式更糟糕。因为假设我有100个追随者,我将不得不按时间取回和排序。(如果我错了,请告诉我,例如,读比写好100倍(推模式)

我想到的推送模型的当前设计如下

Table users_feed(ID, User_ID, Image_ID,datetime)
选项1:存储图像ID列表

选项2:存储一个图像ID和重复行(相同用户ID但不同图像ID的多行)

计划是限制用户在此提要中可以拥有的每一行,这意味着,最多只能有50个图像。如果他们希望在新闻提要中的50个图像之外有更多的项目,他们就不能(我可能会编写一个替代方案来存储更多,以便他们将来可以查看更多)

问题1

因为当跟随用户的用户将一个项目添加到他们的“集合”中时,我必须将它推送到他们的每个跟随者的提要中。写入是否会有问题?200个跟随者=200次写入

问题2

考虑到我只有一种类型的数据,即图像。图像的提要,哪种方法对我更合适

问题3

如果我选择提前存储提要(推送方法),我如何将其写入我所有的朋友

Insert xxx into feeds whereIn (array of FriendsID)?

任何形式的建议都将不胜感激。提前感谢!

我建议您遵循拉法而不是推法,原因如下:

  • 它为将来的扩展提供了更多的自由

  • 更少的写入次数(想象一下1000万追随者,那么就必须有
    一篇文章可以写10万篇文章)

  • 您只需通过以下类似的查询即可获取用户的所有提要:

    选择*FROM users\u feed作为一个WHERE a.user\u id in(

    (语法未如表所示 追随者的结构(未知)


如果一个用户跟踪5000个用户,会发生什么情况?如果使用这种体系结构,可以通过首先选择所有跟踪用户的子集(通常是两个用户之间的某种亲缘关系)进行优化,然后仅为该子集加载帖子。即使一个用户跟踪5000个用户,也应该有效。在这种情况下,反馈的用户数会增加ems将是巨大的。随着用户群的增长,建议采用某种过滤/排名技术。关注者比关注者多的情况更常见。因为用户往往比关注者多:)@ChaudhryJunaidTwitter现在正在将这些东西混合在一起。拉方法适用于拥有多个追随者的人,推方法适用于拥有平均追随者数量的人。因此,当一个人获得feed时,通过pull方法,他将从名人那里获得物品,也将从他/她/那里获得物品。。拥有Bucket,然后根据分页的一些标准对它们进行聚合和混合。一些数据存储,例如Redis,更适合“推送”模型。然而,这完全取决于您的缩放需求。