Очевидно, здесь нет серебряной пули.Однако я бы хотел оспорить это предположение, которое вы сделали:
... оно очень реляционное, все функции зависят от отношения к пользователю и его отношения с другими пользователями ...
Хорошо, я бы хотел, чтобы вы представили, что в реляционной базе данных 100 миллионов пользователей, и начните строить эту модель.Давайте попробуем что-нибудь простое, возьмем имена друзей пользователя.
Как вы получаете друзей пользователя?Ну, вы идете к столу users_friends
.Если у каждого пользователя хотя бы 10 друзей, эта таблица содержит миллиард строк.Если у пользователей более разумных 100 друзей, у вас теперь есть 10B строк.
Итак, теперь у вас есть пользователь и список идентификаторов их друзей.Как мы можем получить имена их друзей?Ну, вы идете по списку из 100 удостоверений личности и опускаете каждого из друзей.Отлично.
Итак, теперь, если вы хотите показать одному пользователю имена всех его друзей, все, что вам нужно сделать, это присоединить таблицу записей 100M к таблице записей 10B. Это не простая задача.Масштабирование объединений становится экспоненциально сложнее и дороже с ростом набора данных.
Итак, чтобы упростить эту задачу, вы, вероятно, собираетесь запустить цикл for
и вручную собирать записи для каждого друга.Вы должны сделать это, потому что друзья разбросаны по нескольким серверам, поэтому каждый «поиск» должен выполняться индивидуально.
Уже вы нарушили свою «реляционную модель».
Как насчетсписок друзей?Действительно ли практично хранить таблицу из 10B записей?Почему бы просто не хранить список идентификаторов друзей у каждого пользователя?Зачем делать дополнительный запрос.
Если вы заметили здесь паттерн, мы в основном разбили «очень реляционную» модель на что-то, что фактически является поиском по значению ключа.Конечно, модель ключ-значение будет масштабироваться намного лучше.И вот, MongoDB выглядит здесь как нельзя кстати.
Не поймите меня неправильно, существует множество хороших вариантов использования реляционных баз данных.Но когда вы говорите об обработке миллионов индивидуальных запросов стиля ключ-значение, вы, вероятно, захотите взглянуть на базу данных NoSQL.