Как исправить мои отношения в nosql (mongodb)? - PullRequest
2 голосов
/ 21 декабря 2011

Сначала я пытаюсь составить базу данных (вы знаете автомобили с водителями ...).У меня есть две коллекции: drivers { name, address, sex, ... }, а затем еще одна tournaments { name, location, price, ... }

Я стараюсь, чтобы все было просто.В турнире должны быть водители (потому что турнир без водителей ... ну, это не приятно ^^).И есть моя проблема, в обычной базе данных sql я мог бы выбрать два первичных ключа (скажем, имя в драйверах и имя в турнирах - просто для простоты, я знаю, что имя в качестве первичного ключа не подходит).И поскольку это отношение m..n (верно?), Я бы составил 3. таблицу с двумя первичными ключами.ОК, это было бы легко.Но как мне решить эту проблему в mongodb.Я думал что-то вроде: tournaments { name, location, price, ... drivers { driver_1, ..., driver_n } }, но я не уверен.Я использую Java, чтобы я мог сделать некоторые специальные классы, какой из них решает эту проблему отношений?Я не понимаю другие учебники mongodb.Есть идеи?Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

Есть несколько способов сделать это:

  1. Как описывает @Gianluca, вы можете выполнить это связывание вручную, добавив _id ObjectId водителя или другое идентифицирующее свойство (вероятно, с вашим уникальным индексом) в массив "drivers" в документе турнира. например турнир: { ... drivers : ["6019235867192384", "73510945093", ...]}
  2. Еще одна опция, специально созданная для этой ссылки, - это спецификация DBRef, которая предоставляет более формальный метод, вероятно, более похожий на тот, который вы знакомы в мире SQL. DBRef поддерживается драйвером java и позволяет вам охватить вашу ссылку на коллекцию (в основном говоря, откуда взялась эта ссылка). Я не удивлюсь, если в будущих версиях MongoDB будут поддерживаться перекрестные запросы, хотя в настоящее время они не поддерживаются.

Подробнее здесь .

Также, если вы не используете инфраструктуру DAO, я бы предложил Morphia , которая поддерживает DBRef с хорошей @Reference аннотацией.

2 голосов
/ 21 декабря 2011

Я решил проблему, используя поле _id, которое есть у каждого документа и является уникальным.

Так что в вашем случае вам просто нужно создать коллекцию, которая имеет ObjectId из torunaments и некоторый ObjectId из драйверов коллекции.Или вы можете просто поместить ObejctId драйвера прямо в коллекцию torunaments.Возможно, не лучшее решение, но оно работает

Джанлука

1 голос
/ 21 декабря 2011

Добавьте поле массива drivers в типе trournaments и поместите туда _id драйверов.

Чтобы добавить / удалить драйверы, просто обновите поле.Нет необходимости в промежуточной таблице отображения N: M, если массив не становится действительно огромным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...