Как спроектировать связи в MongoDB?

Решил БД карточной игры перевести на MongoDB, но в силу работы с реляционными БД не совсем понимаю как правильно (с точки зрения наименьшей нагрузки) это сделать.

Есть множество карт которые могут создавать игроки и добавлять себе в коллекцию, все карты кроме всего прочего объединены в группы (кланы).

Дано:
  • Документ cards - где список всех карт с их id
  • Документ players - где кроме всего прочего список имеющихся у игрока карт
  • Документ clans - где список карт определённого клана

В реляционной БД я бы просто хранил и для players и для clans список id по которым делал выборку из cards.
В документоориентированной БД более правильным путём (насколько я понимаю) было бы хранить в players и clans карту целиком, благодаря чему не пришлось бы делать лишних запросов.

Меня этот вариант устраивает, но получается что если карта обновится в cards, то мне придётся перебрать все документы чтобы привести копии этой карты к актуальному состоянию? Не будет ли это ещё более затратным чем постоянная выборка карт из одного документа по id?

Помогите разобраться, пожалуйста.
  • Вопрос задан
  • 11154 просмотра
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Решил БД карточной игры перевести на MongoDB

Зачем? Если у вас есть хотя бы 10% вероятность того что между записями появятся отношения/связи, то монга вам не подходит.

Монгу стоит использовать исключительно для хранения денормализованных данных. То есть обычно все хранят в реляционной базе и потом делают агрегации данных в денормализованном виде что бы ускорить выборки. В этом случае у нас может быть одна база данных в нормализованном виде (mysq/postgres/etc) и много инстансов монги из которой данные только читаются, но ничего не пишется (кроме как агрегации инициированные изменением данных в реляционной бд.

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

p.s. говорит человек который не понаслышке знает о том, насколько плохо живется если на проекте монга была выбранна основным хранилищем данных при наличии связей между ними.
Ответ написан
@aleks_raiden
Здесь, видимо, стоит смотреть на архитектуру сервера игры вообще. Например, может быть выгоден вариант, что эта коллекция карт загружается при старте и всегда хранится в памяти сервера, только синхронизируется с Mongo. Тогда у вас в документах на игрока будет список id карт, а дальше в приложении вы связываете его с актуальным списком карт с параметрами. Для большинства случаев это подойдет. дальше надо смотреть по количеству карт, юзеров, операций с ними, масштабирование - но это уже будет уровень тысяч игроков онлайн, что для игры будет просто супер-крутым взлетом.
Ответ написан
opium
@opium
Просто люблю качественно работать
ну глупо данные реляционные запихивать в документоориентированную монгу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы