【问题标题】:Facebook-like wall脸书式的墙
【发布时间】:2011-10-08 16:59:01
【问题描述】:

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

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();
                }
            }

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

【问题讨论】:

    标签: php sql networking architecture social


    【解决方案1】:

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

    智能数据库设计

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

    缓存

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

    不同的数据存储方式

    您可以尝试提供非常快速的键查找的任何 NoSQL 解决方案,这是大多数消息、点赞和 cmets 的特性。另见-How FriendFeed uses MySQL to store schema-less data

    也许结合使用这些方法是可行的方法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多