Является ли моделирование отношений в MongoDB с использованием ODM (Ming) анти-паттерном?

Я заинтересован в использовании Ming для моделирования моего набора данных объемом более 100 ГБ, который в основном представляет собой нереляционные данные (сигналы, измеренные в лаборатории) с некоторыми "реляционными" метаданными (например, именем эксперимента) в MongoDB. Это не вопрос о том, должен ли я использовать базу данных NoSql.

Если моделирование отношений с использованием ODM (например , версии Ming здесь) является допустимым шаблоном проектирования, то почему ни один из других популярных ODM не предоставляет такую ​​функциональность? Я не видел это ни в одном из следующих:

Мангуст (MongoDB)

-кленгин (Кассандра)

Гектор (Кассандра)

доктрина (CouchDB)

1 ответ

Решение

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

В MongoDB общее решение (основанное на вашем случае использования) заключается в том, может ли быть более подходящим моделировать отношения, встраивая связанные данные в одну коллекцию или используя ссылку на документ (ы) в другой коллекции (см.: Проектирование модели данных в руководство MongoDB).

Отношения с внешним ключом обычно не заполняются или не обеспечиваются поддержкой со стороны сервера из распределенных баз данных NoSQL, поэтому декларативные ссылки в ODM часто транслируются в несколько запросов на сервере. Многократные запросы не обязательно плохие (хотя могут быть плохо написанные крайности), и объединение данных на уровне приложения с использованием ссылок может быть очень удобным.

В частности, для MongoDB существует тип поля BSON для ссылок на базы данных (DBRef). В настоящее время (как в MongoDB 2.6) не поддерживается расширение DBRef на стороне сервера, однако многие драйверы и ODM предоставляют удобные методы для следования и заполнения ссылок в этой стандартной нотации.

Вы можете видеть, что это используется в нескольких из упомянутых вами ODM:

  • Mongoose поддерживает заполнение документов из других коллекций
  • Doctrine ODM поддерживает отношения отображения ссылок на другие классы / коллекции

Обычно ODM предлагают на выбор либо автоматическое заполнение ссылок, либо отложенное заполнение (т. Е. По мере необходимости или доступ к нему в коде).

Я не знаком с библиотеками Cassandra, но не видел явного упоминания ссылок или связей в документации. Я бы предположил, что наличие (или отсутствие) функции взаимосвязи - это скорее выбор автора (ов) ODM, а не определенный шаблон / антипаттерн.

Другие вопросы по тегам