mysql v mongodb - лучшее решение для сложного ориентированного на пользователя сайта? - PullRequest
3 голосов
/ 18 февраля 2011

Я провел несколько дней, исследуя плюсы и минусы mysql против nosql решений (в частности, mongodb ) для моего проекта.

Проект должен иметь возможность в конечном итоге масштабироваться для обработки десятков тысяч одновременных пользователей - в общей сложности миллионов пользователей.Сайт ориентирован на пользователей и будет взаимодействовать с базой данных в той же мере, если не больше, чем сайт, такой как Facebook - он очень реляционный, все функции зависят от отношения к пользователю и его отношений с другими пользователями.Это также большой объем данных - много файлов, изображений, аудио, сообщений, личных новостей и т. Д.

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

Однако мне очень удобно использовать mysql и мне нравится его реляционный аспект.Я просто волнуюсь, без большой работы будут проблемы с масштабируемостью в этом проекте - хотя, возможно, с memcached и sharding это не будет проблемой?

Я хотел бы знать об этом тех, кто имеет опыт работы сдве базы данных для крупных проектов, из mysql и mongodb , который является подходящим инструментом для этой конкретной работы?

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

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

Что касается масштабирования, то это скорее компонент создания приложения, чем выбранный вами бэкэнд. У вас есть надежная схема? У вас есть сильный слой кэша с сквозным кэшированием? Получаете ли вы доступ к бэкэнду максимально эффективно (запросы и тому подобное)? Можете ли вы осквернить на основании вашего заявления?

Это те вопросы, которые уместны здесь. Не "что будет лучше для меня". А не «который является правильным инструментом». Оба могут справиться с работой. Что лучше, зависит от вас ...

4 голосов
/ 18 февраля 2011

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

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

Хорошо, я бы хотел, чтобы вы представили, что в реляционной базе данных 100 миллионов пользователей, и начните строить эту модель.Давайте попробуем что-нибудь простое, возьмем имена друзей пользователя.

Как вы получаете друзей пользователя?Ну, вы идете к столу users_friends.Если у каждого пользователя хотя бы 10 друзей, эта таблица содержит миллиард строк.Если у пользователей более разумных 100 друзей, у вас теперь есть 10B строк.

Итак, теперь у вас есть пользователь и список идентификаторов их друзей.Как мы можем получить имена их друзей?Ну, вы идете по списку из 100 удостоверений личности и опускаете каждого из друзей.Отлично.

Итак, теперь, если вы хотите показать одному пользователю имена всех его друзей, все, что вам нужно сделать, это присоединить таблицу записей 100M к таблице записей 10B. Это не простая задача.Масштабирование объединений становится экспоненциально сложнее и дороже с ростом набора данных.

Итак, чтобы упростить эту задачу, вы, вероятно, собираетесь запустить цикл for и вручную собирать записи для каждого друга.Вы должны сделать это, потому что друзья разбросаны по нескольким серверам, поэтому каждый «поиск» должен выполняться индивидуально.

Уже вы нарушили свою «реляционную модель».

Как насчетсписок друзей?Действительно ли практично хранить таблицу из 10B записей?Почему бы просто не хранить список идентификаторов друзей у каждого пользователя?Зачем делать дополнительный запрос.

Если вы заметили здесь паттерн, мы в основном разбили «очень реляционную» модель на что-то, что фактически является поиском по значению ключа.Конечно, модель ключ-значение будет масштабироваться намного лучше.И вот, MongoDB выглядит здесь как нельзя кстати.

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

0 голосов
/ 18 февраля 2011

Не существует закона, согласно которому вы должны создавать приложение с точно одной базой данных.Часто бывает так, что для выполнения определенных задач используются специальные бэкэнды.Например, в контексте приложения, подобного Facebook, может иметь смысл работать с базой данных графа для хранения отношений между пользователями - каждая база данных имеет свои плюсы и минусы и только дураки реализуют большие бэкэнды только с RDBMS или только с NoSQL DBтолько потому, что они не знают лучше.

...