1

我目前正在从事从头开始创建的社交网络项目。我需要创建一堵墙,显示用户和他的朋友的消息和评论以及“喜欢”和附件。当前为每条消息循环返回的喜欢、附件和评论:

foreach ($messages as $message) {
    $message->get_likes();
    $message->get_comments();
    ...
} 

这会导致大量查询。对于在墙页上至少有 15 条消息的每条消息,至少额外 3 条。所以我想通过创建更复杂的查询并将它们合并到程序级别来减少查询的数量,如下所示:

$arr = array();
        foreach ($messages as $message) {
            $arr[$message->id] = $message->as_array();
            $arr[$message->id]['comment'] = array();
            foreach ($comments as $comment) {
                if ($comment->message_id == $message->id) {
                    $arr[$message->id]['comment'][$comment->id] = $comment->as_array();
                }
            }

它看起来丑陋而复杂,特别是假设我也需要以这种方式获得喜欢和附件。那么有没有更好的方法来处理这个问题?

4

2 回答 2

0

有很多可能的方法来解决这个问题。列举几个,

智能数据库设计

看看 facebook 显示消息的方式。并非所有消息的所有评论都会显示。您可以做的是在消息表中添加一个额外的列来维护评论计数和另一个用于喜欢计数的列。这允许您显示带有评论计数的消息,并在单击时使用 ajax 加载评论。

缓存

大多数网站的阅读量超过 95%。因此,在应用程序中进行多个级别的缓存始终是减少数据库负载的一种方法。使用 memcache 之类的解决方案来存储消息的多查询结果,或者将整个墙存储在缓存中。

不同的数据存储方式

您可以尝试任何提供非常快速的键查找的 NoSQL 解决方案,这是大多数消息、点赞和评论的内容。另请参阅 - FriendFeed 如何使用 MySQL 存储无模式数据

也许使用这些方法的组合是要走的路。

于 2011-07-19T17:59:07.283 回答
0

我看不出有什么问题。我目前正在做同样的事情,这几乎正是我为检索评论所做的事情。我还没有想过我想如何做“喜欢”。我可能不会称它为“喜欢”,因为我不想完全复制 Facebook。

于 2011-07-19T16:57:17.457 回答