Facebook-подобная стена - PullRequest
       39

Facebook-подобная стена

1 голос
/ 19 июля 2011

Я сейчас работаю над проектом социальной сети, созданным с нуля.Мне нужно создать стену, которая показывает сообщения и комментарии пользователя и его друзей, а также «лайки» и вложения.В настоящее время лайки, вложения и комментарии возвращаются в циклах для каждого сообщения:

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

, что приводит к огромному количеству запросов.по крайней мере дополнительно 3 за каждое сообщение, содержащее не менее 15 сообщений на стене.поэтому я хочу уменьшить количество запросов, создав более сложные запросы и объединив их на программном уровне следующим образом:

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

это выглядит уродливо и сложно, особенно если предположить, что мне также нужно получать лайки и вложениятаким образом.так есть ли лучшая идея, как справиться с этим?

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Есть много возможных способов подойти к этому. Перечисляя некоторые из немногих,

Умный дизайн базы данных

Посмотрите, как Facebook показывает сообщения. Не все комментарии всех сообщений отображаются. Что вы можете сделать, это добавить дополнительный столбец в таблице сообщений, который поддерживает количество комментариев, и еще один для количества лайков. Это позволяет вам показывать сообщения с количеством комментариев и по клику использовать ajax для загрузки комментариев.

Кэширование

Большинство веб-сайтов имеют 95% + чтения. Таким образом, кэширование на нескольких уровнях в приложении - это всегда способ снизить нагрузку на базу данных. Используйте решение, такое как memcache, для хранения результатов нескольких запросов для сообщений или зайдите в кеш, сохранив всю стену в кэше.

Другой способ хранения данных

Вы можете попробовать любое из решений NoSQL, которые обеспечивают очень быстрый поиск ключей, как и большинство сообщений, лайков и комментариев. Также смотрите - Как FriendFeed использует MySQL для хранения данных без схемы

Возможно, стоит использовать комбинацию этих подходов.

0 голосов
/ 19 июля 2011

Я не вижу проблем с этим. В настоящее время я работаю над тем же, и это почти то же самое, что я делаю для получения комментариев. Я еще не думал о том, как я хочу делать «лайки». Я, вероятно, не буду называть это «Мне нравится», потому что я не хочу полностью копировать Facebook.

...