Для приложения Facebook я должен сохранить список друзей пользователя в моей базе данных MySQL. Этот список запрашивается из моей базы данных, по сравнению с другими данными и т. Д.
В настоящее время я храню этот список друзей в своей пользовательской таблице, идентификаторы друзей объединяются в одно текстовое поле с символом «|». в качестве разделителя. Например:
ID - UID - ИМЯ - ДРУЗЬЯ => 1 - 123456789 - Джон Доу - 987654321 | 123456 | 765432
Мой PHP-файл запрашивает эту строку и извлекает список друзей, взорвав это поле ('|'). Все это прекрасно работает, каждые 1000 пользователей занимают около 5 МБ дискового пространства.
Теперь проблема:
Для дополнительной функции мне также необходимо сохранить имена друзей пользователя. Я могу сделать это по-разному:
1) Сохраните эти данные в дополнительной таблице. Например:
ID - UID - NAME => 1 - 1234321 - Джейн Доу
Если мне нужно имя друга с идентификатором 1234321, я могу запросить имя из этой таблицы. Однако проблема в том, что эта таблица будет расти, пока все пользователи Facebook не будут проиндексированы (> 500 миллионов строк). Моему веб-хосту это не понравится! Такая таблица займет около 25 ГБ дискового пространства.
2) Другое решение - расширить данные, сохраненные в пользовательской таблице, добавив имя к UID в поле друзей (с дополнительным разделителем, давайте используем ','). Например:
ID - UID - ИМЯ - ДРУЗЬЯ => 1 - 123456789 - Джон Доу - 987654321, Майк Джонс | 123456, Том Брайт | 765432, Рик Смит
Для этого решения мне нужно изменить сценарий, добавить еще один разнесенный фрагмент (',') и т. Д. Я не уверен, сколько дополнительного дискового пространства это займет ... Но данные не получаются легко справиться с этим!
3) Третье решение дает хороший обзор всех данных, но приводит к огромному объему базы данных. В этом решении мы создаем таблицу друзей с рядом для каждой дружбы. Например:
ID - UID - FRIENDUID => 1 - 123456789 - 54321
ID - UID - FRIENDUID => 3 - 123456789 - 65432
ID - UID - FRIENDUID => 2 - 987654321 - 54321
ID - UID - FRIENDUID => 4 - 987654321 - 65432
Как вы можете видеть в этом примере, он дает очень хороший обзор всех дружеских отношений. Однако, имея около 500 миллионов пользователей, и скажем, в среднем 300 дружеских связей на пользователя, это создаст таблицу с 150 миллиардами строк. Моему хосту это точно не понравится ... И я думаю, что этот вид таблицы займет много места на диске ...
Итак ... Как решить эту проблему? Как вы думаете, как лучше всего хранить UID + имена друзей пользователя в Facebook? Как масштабировать данные такого рода? Или у вас есть другое (лучшее) решение, чем три, упомянутые выше?
Надеюсь, вы сможете мне помочь!