我目前正在从事从头开始创建的社交网络项目。 我需要创建一个墙,显示用户及其朋友的消息和评论以及“喜欢”和附件。目前喜欢,附件和评论在每个消息的循环中返回:
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();
}
}
它看起来很丑陋和复杂,特别是假设我还需要以这种方式获得喜欢和附件。所以有什么更好的想法如何处理这个?
答案 0 :(得分:0)
我没有看到问题。我目前正在做同样的事情,这几乎就是我为检索评论所做的。我还没有想过我想怎么做“喜欢”。我可能不会称之为“赞”,因为我不想完全复制脸书。
答案 1 :(得分:0)
有很多方法可以解决这个问题。列出一些少数,
看看facebook显示消息的方式。并非显示所有消息的所有注释。您可以做的是在消息表中添加一个用于维护注释计数的附加列,另一列用于依赖计数。这允许您显示带注释计数的消息,然后单击,使用ajax加载注释。
大多数网站都有95%以上的读取数据。因此,在应用程序中的多个级别进行缓存始终是减少数据库负载的一种方法。使用memcache等解决方案来存储消息的多查询结果,或者将整个墙存储在缓存中。
您可以尝试任何提供非常快速的密钥查找的NoSQL解决方案,这是大多数消息,喜欢和评论的内容。另请参阅 - How FriendFeed uses MySQL to store schema-less data
也许使用这些方法的组合是可行的方法。