Как сайты социальных сетей вычисляют обновления друзей?

Zipcode - это сильно локализованное поле, во многих странах есть символы в своих почтовых индексах, например, в Великобритании, Канаде. Поэтому в этом примере вы должны использовать поле string / varchar для его сохранения, если в любой момент вы будете отправлять или получать пользователей / клиентов / клиентов / etc из других стран.

Однако в общем случае вам следует используйте рекомендуемый ответ (printf("%05d", number);).

24
задан Marc Climent 8 February 2013 в 11:57
поделиться

4 ответа

Many of the social networking sites like Twitter don't use an RDBMS at all but a Message Queue application. A lot of them start out with a already present application like RabbitMQ. Some of them get big enough they have to heavily customize or build their own. Twitter is in the process of doing this for the second time.

A message queue application works by holding messages from one service for one or more other services. For instance say service Frank is publishing messages to a queue foo. Joe and Jill are subscribed to Franks foo queue. the application will keep track of whether or not Joe or Jill have recieved the messages and once every subscriber to the queue has recieved the message it discards it. Frank fires messages and forgets about it. Joe and Jill ask for messages from foo and get whatever messages they haven't gotten yet. Joe and Jill do whatever they need to do with the message. Perhaps keeping it around perhaps not.

The message queue application guarantees that everyone who is supposed to get the message can and will get the message when they request them. The publisher can send the messages confident that subscriber can get them eventually. This has the benefit of being completely asynchronous and not requiring costly joins.

EDIT: I should mention also that usually the storage for these kind of things at high scale are heavily denormalized. So Joe and Jill may be storing a copy of the exact same message. This is considered ok because it helps the application scale to billions of users.

Other reading:

  1. http://www.rabbitmq.com/
  2. http://qpid.apache.org/
40
ответ дан 28 November 2019 в 23:13
поделиться

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

Два популярных способа представления графиков - это списки смежности и матрицы смежности .

Список смежности - это просто список ребер на графе. Рассмотрим пользователя с целочисленным идентификатором пользователя.

User1, User2
  1      2
  1      3
  2      3

Ненаправленная интерпретация этих записей заключается в том, что пользователь 1 дружит с пользователями 2 и 3, а пользователь 2 также дружит с пользователем 3.

Представить это в таблице базы данных тривиально. Мы знакомы с таблицей соединений «многие ко многим». Запросы SQL для поиска друзей определенного пользователя довольно легко написать.

Теперь, когда вы знаете друзей конкретного пользователя, вам просто нужно присоединить эти результаты к таблице обновлений. В этой таблице содержатся все обновления пользователя, проиндексированные по идентификатору пользователя.

Если все эти таблицы правильно проиндексированы, вам будет довольно легко создавать эффективные запросы для ответов на интересующие вас вопросы.

Представление этого в таблице базы данных тривиально. Мы знакомы с таблицей соединений «многие ко многим». Запросы SQL для поиска друзей определенного пользователя довольно легко написать.

Теперь, когда вы знаете друзей конкретного пользователя, вам просто нужно присоединить эти результаты к таблице обновлений. В этой таблице содержатся все обновления пользователя, проиндексированные по идентификатору пользователя.

Если все эти таблицы правильно проиндексированы, вам будет довольно легко создавать эффективные запросы для ответов на интересующие вас вопросы.

Представление этого в таблице базы данных тривиально. Мы знакомы с таблицей соединений «многие ко многим». Запросы SQL для поиска друзей определенного пользователя довольно легко написать.

Теперь, когда вы знаете друзей конкретного пользователя, вам просто нужно присоединить эти результаты к таблице обновлений. В этой таблице содержатся все обновления пользователя, проиндексированные по идентификатору пользователя.

Если все эти таблицы правильно проиндексированы, вам будет довольно легко создавать эффективные запросы для ответов на интересующие вас вопросы.

8
ответ дан 28 November 2019 в 23:13
поделиться

Для небольших компаний, объединяющих users.friends и users. Кэширование событий и запросов, вероятно, хорошо, но замедляется довольно быстро по мере роста числа друзей и событий. Вы также можете попробовать модель, основанную на событиях, в которой каждый раз, когда пользователь создает событие, в таблице соединений создается запись (возможно, называемая "friends_events"). Таким образом, всякий раз, когда пользователь хочет увидеть, какие события создали его друзья, он может просто сделать соединение между своим собственным идентификатором и таблицей friends_events и выяснить это. Таким образом, вы избегаете захвата всех пользователей с друзьями и последующего присоединения их друзей к таблице событий.

0
ответ дан 28 November 2019 в 23:13
поделиться

Трэвис написал отличный пост по этому поводу,

Журналы активности и ленты друзей на Rails & pfeed

2
ответ дан 28 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: