MongoDB, Grails и отношения - PullRequest
       23

MongoDB, Grails и отношения

5 голосов
/ 06 марта 2011

Мне было интересно, как плагин MongoDB для Grails будет обрабатывать отношения.Чтобы проверить это, я сделал очень простое приложение с двумя классами доменов:

Author s имеют два поля: String firstName и String lastName

Book s имеют два поля: String title и Author author

После настройки MongoDB и Grails я сделал Author s и Book s и посмотрел, используя интерактивную оболочку MongoDB.Я обнаружил, что отношения обрабатываются так же, как и в реляционной базе данных: ссылки на поля идентификаторов других объектов.

Итак, вопросы:

  1. Для того, чтобы GORM это осуществил, нужно ли отдельное соединение для извлечения каждого документа?
  2. Если да, разве это не будет лучше в реляционной базе данных, такой как PostgreSQL или MySQL?
  3. Если ответ на два приведенных выше вопроса действительно «да», то существует ли лучший способ управления отношениями в базе данных документов, такой как MongoDB?Я понимаю, что MongoDB не должен быть реляционным, но есть некоторые вещи, которые я не вижу, как обойти отношения без дублирования данных (таким образом, создавая ночные кошмары для обновления).: Я также только что заметил, что grails не сортирует должным образом свойство 'id' моих авторов.Это связано с использованием MongoDB?В оболочке я вижу, что свойство _id всех документов, созданных Grails, имеет тип данных NumberLong.

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

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

Тогда не парься. MongoDB не анти-реляционный, он ориентирован на документы.

В этом случае Книги и Авторы являются двумя объектами верхнего уровня. Неразумно вкладывать одну из них, они обе являются самостоятельными основными объектами.

В случае, если у каждой Книги есть только один Автор (N: 1), вполне разумно, чтобы Книга содержала «Ссылку» на Автор. Конечно, вам придется сделать два запроса. Но сильно ли это отличается от выполнения запроса на соединение? Запрос на соединение по-прежнему должен выполнить два просмотра индекса и два поиска данных. Значит, вы ничего здесь не стоите.

В случае, если каждая Книга поддерживает нескольких авторов (M: N), у вас есть несколько вариантов в зависимости от ваших потребностей.

Мне не нравится думать о MongoDB как о "нереляционном" , я думаю, что чистее было бы думать о MongoDB как о оптимизированном для запросов .

Я также только что заметил, что grails неправильно сортирует свойства id моих авторов ...

Я бы сверился напрямую с автором Grails. Похоже, они могут хранить «строки» вместо реальных ObjectIds (или MongoID). Хотя это и не критично, это может быть ошибкой.

1 голос
/ 09 ноября 2011

Что касается свойства id, то в документации теперь показано, что вы можете поместить объявление ObjectId id или String id в свой класс домена, чтобы не использовать реализацию GORM по умолчанию с использованием итерации long.Просто объявите поле в вашем классе, а плагин позаботится обо всем остальном.

...