PHP新闻订阅数据库与设计

15

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

我以前问过一个类似的问题,但现在我已经改变了设计,希望得到反馈。

新闻示例:

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 = 执行操作的用户ID

%r = 接收对象

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

问题:

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

  2. 如何存储“事件预览”?例如,如果我想显示User_A对User_B的评论(就像上面和Facebook新闻动态中一样)。我考虑只编码相关数据的副本。例如,使用JSON编码评论文本或照片HTML。但这似乎很脆弱(用户可能在其他用户的动态中仍在查看照片时删除照片)

  3. 如何显示类似于:“User_B添加了4张新照片到他的个人资料。”并带有缩略图的消息?

4个回答

14

刚刚做过类似的东西,我建议将数据存储方式与性能分开考虑。在我的案例中,用户需要能够回溯查看任何时间段的新闻,因此 arnorhs 的假设不适用(而且如果不必要就没有理由存储 HTML - 把格式留在外面)。

我发现我将东西存储在几个类中,ActivityTypeActivityActivityType 保存消息的格式(例如您的 '%a commented on %o's new %r'),以及它表示实际活动还是对其他人活动的评论的指示符(这样我就知道链接哪个对象,演员的活动还是被评论的演员的活动),而 Activity 存储了演员,受害者,对象的主键,如果存在的话,则是被评论的对象的主键以及它发生的时间戳。

这非常好,结果是规范化的数据。但一旦有半打朋友,性能就会急剧下降(性能受到整个系统基于地理位置,所以我正在查找每个用户与您之间的距离而复杂化)。现在每个人都在寻找使用 NoSQL 存储系统的借口,但这实际上是一个好理由。您将不得不将数据去规范化以便从关系数据库中获得良好的性能。而且由于关系的各种交叉,这些东西很难缓存。考虑将数据存储在 MySQL 中,但从 NoSQL 存储系统中获取数据。


谢谢Tom,我开始根据你的建议研究NoSql。有没有一篇文章或其他资源可以帮助我理解/实现这样的策略?另外,我需要重新构建现有的关系型数据库以适应NoSql检索吗? - pws5068
1
我在http://delicious.com/yerfatma/nosql上有一些书签,列表中的最后一个声称是“必读的NoSQL”。数据库和nosql存储是两个独立的东西。它们根本不需要彼此了解。想法是尽可能少地从数据库中获取数据;一旦您在PHP代码中拥有数据,请将其缓存在nosql存储中,以便您可以从那里获取它,直到它失效。 - Tom
现在这个问题清晰多了,我会继续研究。谢谢你的帮助。 - pws5068

3

我在Stackoverflow上也有一个类似的问题和类似的问题 - 我们的问题看起来几乎一样:)请检查 - 从MySQL获取JSON数据树

但是我正在尝试用稍微不同的方法解决这个问题:我正在创建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。


1
  1. 是的,这是推进这个项目的最佳方式。这些消息只存在很短的时间,因此如果您对存储的消息的HTML进行更改等操作,则永远不必回溯更新它们。所以使用这种方法应该是没问题的。

  2. 只需使用纯HTML即可。它会很快,而且您将来不需要强制执行任何关系,也不需要更新它们或类似的操作。

编辑:实际上我误解了,我不知道您打算让那些 %s 东西成为您引用的某些对象的特殊符号。我建议在文本中放置纯HTML通知。


2
将每个对象的HTML链接存储和预览每个操作(以及链接每个图像)似乎是脆弱的。如果用户更改或删除他们的图片,则数据库将存储无效链接。 - pws5068
我的设计尽可能地近似于此,同时将可能发生更改的对象信息与特殊替换分开。但是,可能还有更传统(更好)的方法。 - pws5068
可能看起来有点“脆弱”,但事实是从活动发生到用户看到通知的时间很短,这种情况发生的概率很小。另外,你为什么提到图片?我们在谈论通知,类似于 Facebook 的通知吧?所以那只是用户名/用户ID,你的图像可能只是从ID/用户请求的,你无论如何不会引用文件名。 - arnorhs
我提到了照片这个案例,用户可以将图片添加到图库中,我希望能够在新闻动态中预览它们。因此,在Facebook上,一个事件可能会说:“Paul 在他的图库中添加了10张新照片”,并在动态中显示前4或5个缩略图。 - pws5068

0

当你谈论Facebook时,你必须考虑发件人和收件人。

比如说,如果你想查看所有发送给B的消息/动态,那么你必须发出一个查询,对吧?我认为你的表看起来不错,但是还需要增加一个接收者的ID列。也许你可以把它放在单独的表中。

这样,您就可以轻松地找到所有与B用户来自B用户从用户A到用户B的动态。

希望这对你有所帮助。

但是,如果你只想专注于动态,那就无视上面的建议,只看最新的动态即可。我的想法是基于Facebook,我们可以看到任何人的资料和他从不同用户那里获得的信息流。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接