PHP新闻Feed数据库&设计

时间:2010-05-14 14:53:01

标签: php mysql performance social-networking news-feed

我正在使用类似于Facebook的PHP / MySQL设计新闻Feed系统。

之前我曾问过类似的问题,但现在我改变了设计,我正在寻找反馈。

示例新闻:

  

User_A User_B 的新相册发表了评论。

  "Hey man nice pictures!"
     

User_B 在[他/她] 个人资料中添加了新的照片

     [show photo thumbnail]

最初,我使用Obj1:Type1 |的过多列实现了这个Obj2:Type2 |等。

现在使用几个特殊关键字和演员/接收者关系设置设计。我的数据库使用在包含userid,actionid,receiverid,receiverObjectTypeID,

的表上连接的消息表

以下是加入后的简洁版本:

News_ID | User_ID |                  Message                   |     Timestamp

  2643       A       %a commented on %o's new %r.                  SomeTimestamp
  2644       B     %a added a new %r to [his/her] profile.         SomeTimestamp

%a =执行操作的人的User_ID

%r =接收对象

%o =接收对象的所有者(例如专辑的所有者)(如果%r是用户,则为NULL)

问题:

  1. 这是一种智能(高效/可扩展)的前进方式吗?

  2. 如何存储“活动预览”?例如,如果我想显示User_A对User_B发表的评论(如上所述,以及Facebook的新闻Feed)。我考虑过仅使用相关数据的编码副本..例如JSON编码注释文本或照片html ..但这似乎很脆弱(用户可能会删除照片,而它仍在另一个用户的Feed中)

  3. 如何显示以下消息:“User_B为他添加了4张新照片 个人资料。“有照片的缩略图?

4 个答案:

答案 0 :(得分:12)

刚刚建立了类似的东西,我建议的一件事是将如何存储数据和性能的想法分开。在我的情况下,用户需要能够返回并查看任何时间段的新闻,因此arnorhs的假设不起作用(无论如何,没有理由存储HTML,如果你不必 - 留下外部格式化)。

我发现我将这些内容存储在几个类ActivityTypeActivity中。 ActivityType保存消息的格式(如'%a commented on %o's new %r'),并指示它是代表实际活动还是对其他人的活动发表评论(因此我知道要链接到哪个对象,演员的活动或被注释的活动的参与者)和Activity存储对象的参与者,受害者,主键,如果它存在则存储被评论对象的主键以及它何时发生的时间戳。

这一切都很棒,并且会产生很好的标准化数据。一旦你有六个朋友就会慢慢爬行(性能很复杂,事实上整个事情是基于位置的,所以我正在查找每个用户离你不远的距离)。现在每个人都在寻找借助NoSQL存储系统的借口,但这实际上是一个很好的借口。您将不得不对数据进行去标准化,以便从关系数据库中获得不错的性能。由于关系的各种交叉,这些东西难以缓存。考虑将数据存储在MySQL中,但将其从NoSQL存储系统中取出。

答案 1 :(得分:3)

我在Stackoverflow上有类似的问题和类似的问题 - 我们的问题看起来几乎一样:)检查一下 - getting JSON data-tree from MySQL

但我试图用一个不同的方法解决问题:我正在创建JSON对象。 所以我的新闻源表看起来像这样:

news_type   | datetime_added  | params
------------+-----------------+--------------------------------------------------------
new_photos  | 2010.12.01      | {user_id: "12", photo_id: "26", photo_url: "/images/photo.jpg"} 
new_comment | 2010.12.01      | {owner_id: "12", photo_id: "26", photo_url: "/images/photo.jpg", commenter_id: 25, comment_text: "Nice!"}

然后我在php中使用json_decode来创建数组。 然后根据news_type我创建所需的HTML。

答案 2 :(得分:1)

  1. 是的,这是前进的方法。这些消息可以在很短的时间内存在,因此如果您对存储的消息的HTML进行更改,您将永远不必及时更新它们。所以您应该保持良好状态。

  2. 只需使用纯HTML即可。这将是快速的,你将不得不在以后执行任何关系,你将永远不必能够更新那些或类似的东西。

  3. 编辑:我实际上误解了,我不知道你打算将那些%s的东西作为你引用的对象的特殊符号。我只想在该文本中放置纯HTML通知。

答案 3 :(得分:0)

当你谈论Facebook时,你必须考虑发送者和接收者。

说你想看到B的所有消息/提要?那么你必须发起一个查询吗?我认为你的表似乎很好,但也为接收者的ID添加了列。也许你可以把它保存在单独的表中。

这样您就可以轻松找到所有Feed 用户B 从用户B 从用户A到用户B

希望这可能对您有所帮助。

但如果您只想专注于Feed,请忽略这一点。那么你只想要最新的。我的想法是什么。 Facebook,我们可以看到任何人的配置文件与他从diff得到的墙壁。用户。

感谢。