Я только начал использовать базу данных на основе документов NoSQL (MongoDB), и мне интересно узнать о передовых методах проектирования баз данных.
Я предполагаю, что архитектура должна отличаться от реляционных баз данных? Должен ли я по-прежнему стремиться к нормализованной базе данных?
Например, у меня есть конкретный случай использования;
У меня есть пользователь с историей проката (массив адресов), должен ли этот массив быть массивом для пользователя или отдельной коллекцией с общим ключом?
Ответы:
Подходящим подходом для проектирования баз данных NoSQL является DDD ( Domain Driven Design ). Для некоторых людей, которые раньше проектировали СУРБД, NoSql выглядит как анти-паттерны Sql, и это имеет больше смысла, если рассматривать его в рамках DDD.
В зависимости от использования адресов, вы можете определить его как объект стоимости внутри вашей модели / объекта истории проката.
Вот некоторые ссылки, которые могут прояснить мысли о дизайне с NoSQL:
источник
TL; DR
Нормализация в RDBMS позволяет использовать сильные стороны реляционной парадигмы.
Денормализация в NoSQL позволяет вам использовать сильные стороны парадигмы NoSQL.
Длинный ответ
СУБД хороши тем, что позволяют моделировать уникальные структурированные объекты (изменяемые или нет) и их отношения друг с другом. Это означает, что очень легко работать на уровне сущностей, обновляя их свойства, вставляя другое, удаляя одно и т. Д. Но это также отлично подходит для их динамического объединения: собака с ее владельцем, собака с домами, в которых она проживает, и т. Д. СУРБД предоставляет вам инструменты для облегчения всего этого. Он присоединится к вам, он будет обрабатывать атомарные изменения между вами и т. Д.
Базы данных NoSQL хороши тем, что позволяют моделировать полу / неструктурированные агрегаты и динамические объекты. Это означает, что очень легко моделировать постоянно изменяющиеся объекты, объекты, которые не все имеют одинаковые атрибуты и иерархические агрегаты.
Чтобы моделировать для NoSql, вы должны думать с точки зрения иерархии и агрегатов, а не сущностей и отношений. Таким образом, у вас нет человека, арендных адресов и отношений между ними. У вас есть записи об аренде, которые агрегируют для каждого человека, какие адреса аренды у них были.
Вам нужно спросить, какие данные мне нужно будет изменить вместе. Какие данные логически группируют другие данные. В вашем случае человек звучит как хороший агрегат. Какова логическая точка входа к остальным данным.
NoSQL, скажем так, хранит вещи, которые имеют другие вещи, которые имеют свои собственные вещи. Верните мне всю иерархию вещей. Позвольте мне изменить это, как мне угодно, теперь замените всю иерархию вещей на мою измененную. Это почти все, что вам дает. Почему это полезно? Если то, что у вас есть, это иерархия вещей, с которыми вы всегда взаимодействуете в целом. Или если вам нужно масштабировать.
Все, что дает СУБД, вам придется вручную реализовать в коде и в вашей схеме. Вы должны будете присоединиться к коду, если вам когда-либо понадобится совокупность агрегатов. Вам придется анализировать, если вам нужна только часть совокупности. Вам нужно будет проверить уникальность самостоятельно, если вы не хотите дублировать вещи. Вам нужно будет реализовать собственную транзакционную логику при работе с агрегатами и т. Д.
Таким образом, в NoSql есть одна большая таблица со всем, что вам нужно. Поскольку атомарность гарантируется только на этом уровне, и производительность тоже. Выяснить ваши отношения рано важно. Вот что такое денормализация.
В RDBMS денормализация эффективно превращает вашу БД в NoSQL. Так что обычно вы хотите противоположного, то есть нормализации. Если вы этого не сделаете, вы должны использовать NoSQL DB вместо этого. Если вам не нужно немного обоих.
источник