2009-09-14 1 views
4

Вы когда-нибудь замечали, как facebook говорит «3 друзьям и 33 другим понравилось»? Мне было интересно, какой лучший способ сделать это. Я не думаю, что просматриваю список друзей, и список пользователей, которые «понравились» и сравнивая их, эффективен вообще! Они отслеживают это в базе данных? Это сделает размер базы данных очень большой. Что вы, ребята, думаете?Как Facebook это делает?

Спасибо!

ответ

8

Я бы предположил, что они внешние присоединяются к их таблице friends с их таблицей likes, чтобы подсчитывать как регулярные симпатии, так и друг любит в то же время.

С надлежащими индексами это не будет медленным запросом вообще. Огромные базы данных не обязательно медленны, поэтому нет причин не хранить всю эту информацию в базе данных. Фокус в том, чтобы убедиться, что индексы и разделы (если они есть) настроены хорошо.

+0

как насчет создания таблицы «статистики», которая содержит [UserId, LikedItemId, NumberOffriendsLiked]. Но, честно говоря, я не чувствую себя хорошо по этой причине, это создаст огромное количество строк в этой таблице! – OneDeveloper

4

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

Что касается масштабируемости, я уверен, что они используют много кеширования.

Вот пример:

Если у вас есть 1 миллион строк, чтобы пройти, индекс может выполнить O (LogN) = 20 операций (в худшем случае) только найти то, что вам нужно.

Для 2 миллионов вам потребуется всего 21 операция (в худшем случае), чтобы найти то, что вам нужно.

Каждый раз, когда вы удваиваете количество пользователей для прохождения, вам просто нужно всего лишь 1 операцию (в худшем случае) с индексом O (logn).

Они также имеют распределенную архитектуру или кластерную базу данных.

0

Каждая запись, которая может кому-то понравиться, вероятно, содержит список всех, кому это нравится (все это, конечно, в базе данных). Когда вы просматриваете эту запись, они соответствуют ей в списке друзей, чтобы узнать, кто из них ваш друг. Вуаля.

+0

соответствует списку людей, которым понравился предмет против всего списка друзей на лету. Я думаю, что это очень дорогостоящая операция. Особенно, если вы выполняете подобную шкале времени. – OneDeveloper

+0

Это O (n), где n - это min (количество людей, которым это нравится, количество людей в списке ваших друзей). Они также могут кэшировать результат после вычисления его один раз. – patros

2

При разработке программного обеспечения для социальных сетей (mothsorchid.com) я нашел единственный способ адресовать это, чтобы предварительно кэшировать потоки уведомлений. Один из них не запрашивает базу данных во время загрузки страницы, чтобы подсчитать, сколько друзей и других понравилось », когда кто-то« любит »что-то, что записано на объекте, и при извлечении объекта можно сравнить с текущим пользователем список друзей. Если кто-то обновляет свой профиль/делает комментарий/etc, он отправляет объекты уведомлений друзьям, которые предварительно кэшируются в своих каналах. Резко сокращает работу базы данных за счет дискового пространства, но дисковое пространство дешево.

Что касается Facebook, они используют СУБД Cassandra, что, вероятно, немного отличается от того, что вы имеете в виду.

5

Facebook использует Cassandra, базу данных NoSQL, по крайней мере, для некоторых вещей. Вот более подробное обсуждение того, что некоторые из самых больших социальных медиа сайтов сделать, чтобы решить эти проблемы:

http://www.25hoursaday.com/weblog/2009/09/10/BuildingScalableDatabasesDenormalizationTheNoSQLMovementAndDigg.aspx

Много интересного чтения в там, если вы будете следовать по ссылкам из него в блоге Digg, и т.д.

+0

Неправильно, они используют его только для функции поиска Inbox. Cf: http://www.facebook.com/note.php?note_id=24413138919 –

1

Имейте в виду, что Facebook сильно использует memcached, поэтому они сохраняют много данных в памяти и только обновляют их, когда это абсолютно необходимо. Смотрите этот блог для некоторой масштабируемости дискуссии вокруг этого:

http://www.facebook.com/note.php?note_id=39391378919

3

Facebook должен использовать триггер (который автоматически запускается, как только происходит событие).

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^