Дизайн базы данных Facebook? - PullRequest
128 голосов
/ 17 июня 2009

Мне всегда было интересно, как Facebook разработал отношения между друзьями <->.

Я полагаю, что таблица пользователя выглядит примерно так:

user_email PK
user_id PK
password 

Я рисую таблицу с данными пользователя (пол, возраст и т. Д., Связанные с электронной почтой пользователя, я бы предположил)

Как он связывает всех друзей с этим пользователем?

Как то так?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

Вероятно, нет. Потому что количество пользователей неизвестно и будет расширяться.

Ответы [ 13 ]

2 голосов
/ 17 июня 2009

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

0 голосов
/ 29 октября 2011

Вероятно, существует таблица, в которой хранится отношение друга <->, скажем, "frnd_list", имеющее поля 'user_id', 'frnd_id'.

Всякий раз, когда пользователь добавляет другого пользователя в друзья, создаются две новые строки.

Например, предположим, что мой идентификатор 'deep9c', и я добавляю пользователя с идентификатором 'akash3b' в качестве моего друга, затем в таблице "frnd_list" создаются две новые строки со значениями ('deep9c', 'akash3b') и ( 'akash3b', 'deep9c').

Теперь, при отображении списка друзей для конкретного пользователя, простой sql сделает это: "выберите frnd_id из списка frnd_list, где user_id =" где - идентификатор зарегистрированного пользователя (хранится как атрибут сеанса).

0 голосов
/ 18 июня 2009

Что касается производительности таблицы «многие ко многим», если у вас есть 2 32-разрядных целых числа, связывающих идентификаторы пользователей, базовое хранилище данных для 200 000 000 пользователей, в среднем 200 друзей на человека, составляет чуть менее 300 ГБ.

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

...