数据库设计 - “推送”模型,或扇出写入

时间:2014-02-17 15:58:01

标签: php mysql database database-design database-schema

背景信息:

我正在尝试从我关注的人那里检索图像,按最新时间排序。它就像是一个Twitter新闻源,它们可以显示您朋友的最新信息。

计划:

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

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

我个人觉得“拉”模型,或者我实时提取所有信息的风扇输出将比推模型更差。因为想象我有100个追随者,我将不得不按时间取物和排序。 (让我知道如果我错了,例如,Read比Write(Push Model)好100倍

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

Table users_feed(ID, User_ID, Image_ID,datetime)

选项1:存储Image_ID列表

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

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

问题1

因为当用户跟随​​用户将一个项目添加到他们的“集合”中时,我必须将其推入他们的每个跟随者的源中。写不会有问题吗? 200粉丝= 200写?

问题2

考虑到我只有一种类型的数据是图像,哪种方法对我来说会更好。图片供稿。

问题3

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

Insert xxx into feeds whereIn (array of FriendsID)?

非常感谢任何形式的建议。提前谢谢!

1 个答案:

答案 0 :(得分:2)

我建议您按照推送方法而不是推送方式,原因如下:

  • 它为将来提供更大的自由度。

  • 写入次数减少(想象一下,1000万粉丝必须有 10M写的只有1个帖子。

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

    SELECT * FROM users_feed as WHERE a.user_id in(< // select all    在用户中隐藏的关注者的user_id //> )

    (语法未跟随表格 追随者的结构未知)