php - 数据库设计 - "Push"模型,或写时扇出

标签 php mysql database database-design database-schema

背景信息:

我正在尝试从我关注的人那里检索图像,按最近时间排序。这就像推特新闻提要,它们会显示您 friend 的最新提要。

计划:

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

http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed

我个人认为实时拉取所有信息的“拉取”模型或加载时扇出比推模型更差。因为想象我有 100 个追随者,我将不得不按时间获取和排序。 (如果我错了请告诉我,例如,读取比写入(推送模型)好 100 倍

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

Table users_feed(ID, User_ID, Image_ID,datetime)

选项 1:存储 Image_ID 列表

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

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

问题一

因为当用户关注用户将项目添加到他们的“收藏”中时,我必须将其推送到他们的每个关注者的提要中。写入不会有问题吗? 200 位关注者 = 200 次写入?

问题二

考虑到我只有一种数据类型,即图像,哪种方法对我来说更好。图像源。

问题三

如果我选择提前存储提要(推送方法),我如何将它实际写入我所有的 friend ?

Insert xxx into feeds whereIn (array of FriendsID)?

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

最佳答案

我建议您使用拉式方法而不是推式方法,原因如下:

  • 它为 future 的可扩展性提供了更多的自由。

  • 较少的写入次数(假设有 1000 万关注者,那么必须有
    1000 万篇文章)。

  • 您可以简单地通过类似于以下的查询来获取用户的所有提要:

    SELECT * FROM users_feed as a WHERE a.user_id in ( )

    (语法不遵循表格 追随者的结构未知)

关于php - 数据库设计 - "Push"模型,或写时扇出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833650/

相关文章:

php - 如何使用 php preg_replace 替换 HTML 标签

php - PDO插入不同的int值

python - xDjango 使用查询集内连接表

c# - 如何在sql查询之间使用日期时间的最后一个条目?

数据库优化 - 编码字段

php - 修改 php natcasesort 所以 'letters only' 先来

php - Magento 中的动态条款和条件

PHP 独有 IP 内容

mysql - #1054 - 'group statement' 中的未知列

mysql - 每个表中超过 500 万条记录的数据库缓慢检索/更新/插入问题