MongoDB нормализация, внешний ключ и присоединение - PullRequest
64 голосов
/ 30 апреля 2011

Перед тем, как я углубился в MongoDB на несколько дней, я подумал, что задам довольно простой вопрос о том, должен ли я в него погружаться или нет. У меня практически нет опыта работы с nosql.

Я немного прочитал о некоторых преимуществах баз данных документов, и я думаю, что для этого нового приложения они будут действительно хороши. Делать избранное, комментарии и т. Д. Всегда сложно для многих типов объектов (множество взаимосвязей m-to-m) и подклассов - с этим трудно справиться.

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

Но я запутался в нескольких вещах.

  1. Желательно ли по-прежнему нормализовать вашу базу данных? Я действительно не хочу обновлять несколько записей. Это все еще как люди подходят к дизайну базы данных в MongoDB?

  2. Что происходит, когда пользователь добавляет книгу в избранное, и этот выбор все еще сохраняется в пользовательском документе, но затем книга удаляется? Как отношения обособляются без внешних ключей? Я сам несу ответственность за удаление всех ссылок?

  3. Что произойдет, если пользователь выбрал книгу, которой больше не существует, и я запросил ее (какое-то соединение)? Должен ли я делать здесь отказоустойчивость?

Ответы [ 2 ]

63 голосов
/ 30 апреля 2011

MongoDB не поддерживает взаимосвязи внешних ключей на стороне сервера, нормализация также не рекомендуется.Если возможно, вы должны встроить свой дочерний объект в родительские объекты, это повысит производительность и сделает ненужными внешние ключи.Тем не менее, это не всегда возможно, поэтому существует специальная конструкция DBRef, которая позволяет ссылаться на объекты в другой коллекции.Тогда это может быть не так быстро, потому что БД должна делать дополнительные запросы для чтения объектов, но допускает ссылки на внешние ключи.

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

Если ваша схема более сложная, то, вероятно, вам следует выбрать реляционную базу данных, а неnosql.

Существует также книга о проектировании баз данных MongoDB: Дизайн документов для MongoDB

ОБНОВЛЕНИЕ Книга, указанная выше, больше не доступна, но покаиз-за популярности MongoDB довольно много других.Я не буду связывать их все, так как такие ссылки могут измениться, простой поиск на Amazon показывает несколько страниц, поэтому их не должно быть проблемой.

См. Справочную страницу MongoDB для «Ручные ссылки» и DBRefs для получения дополнительной информации и примеров

19 голосов
/ 16 января 2015

выше, @TomaaszStanczak заявляет

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

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

В другом классе отношений две сущности существуют независимо - имеют независимые времена жизни и отношения. Монго желает, чтобы такого рода отношения не существовали, и разочарованно молчит, как именно с этим бороться. Встраивание это просто не решение. Нормализация не поощряется и не поощряется. Монго просто дает вам два механизма, чтобы справиться с этим; Ручные ссылки (аналог ключа с ограничением внешнего ключа, связывающего две таблицы) и DBRef (другой, немного более структурированный способ сделать то же самое). В этом случае базы данных SQL выигрывают.

...