Нормализация MongoDB, внешний ключ и присоединение



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



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



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



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




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


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


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


1188   2  

2 ответов:

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

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

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

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

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

смотрите страницу руководства MongoDB для 'ссылки на руководство' и DBRefs для дальнейшей конкретики и примеров

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

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

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

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

Comments

    Ничего не найдено.