Несколько лет назад я создал блог-движок. Его целью является размещение статей блога, а для каждой статьи - хранение разных версий, метаданных, статистики посещений и т. Д.
Это может быть сохранено в виде набора таблиц, но при попытке построить модель она очень быстро увеличивается до десятка таблиц, если не больше. Некоторые SQL-запросы могут выглядеть ужасно с большим количеством join
s, и ... ну, вы поняли картину.
Проблема здесь в том, что есть центральная вещь - статья в блоге - и есть все эти вещи вокруг статьи, что делает ее хорошо подходящей для баз данных на основе документов. С MongoDB моделирование базы данных было чрезвычайно простым: одна коллекция содержит статьи блога, а вторая крошечная коллекция содержит список пользователей, которым разрешено писать статьи. Каждый документ в первой коллекции будет содержать всю информацию, необходимую для отображения статьи, будь то имя автора или теги.
Теперь представьте себе совершенно другой проект. Есть некоторые пользователи, которые могут писать вещи и делиться вещами, написанными другими пользователями. На странице пользователя вы ожидаете найти и то, что написал этот пользователь, и то, что он опубликовал. Есть одно ограничение: когда кто-то редактирует то, что он написал в прошлом, это изменение появляется везде, где был опубликован исходный текст.
При основанном на документе подходе трудно найти то, что было бы документом. Пользователь может быть? Ну, это хорошее начало. Пользовательский документ будет содержать все, что написал этот пользователь. Но как насчет вещей, которыми она поделилась?
Возможный способ - поместить эти вещи в один и тот же документ. Проблема с этим подходом состоит в том, что, если кто-то редактирует запись, приложение должно просматривать каждый пользовательский документ в базе данных, чтобы редактировать каждое вхождение старой записи. Не считая дублирования данных.
Альтернативой может быть сохранение в пользовательском документе только списка записей, которыми поделился этот пользователь (с идентификатором упомянутого пользователя и записью). Но теперь может возникнуть другая проблема: если пользователь поделится тысячами записей от тысяч пользователей, ему потребуется открыть тысячи документов, чтобы получить эти записи.
Или мы можем смоделировать нашу коллекцию вокруг самих записей, каждая запись ссылается на своего автора и имеет список пользователей, которые поделились ею. Здесь опять проблемы с производительностью могут стать заметными, когда вам нужно будет просмотреть все документы, чтобы показать те, которые опубликованы данным пользователем.
Сколько таблиц вам понадобится, если вы используете реляционную базу данных? Хорошо, три. Это было бы просто моделировать, а также просто использовать.