Многопользовательская база данных. Одна коллекция или один дБ на одного арендатора?
Для многопользовательской архитектуры для веб-приложения, использующего базу данных, ориентированную на документы, я вижу два возможных варианта:
- Наличие одной базы данных на каждого арендатора, а коллекции логически разделяют различные типы объектов.
- Наличие одной коллекции на каждого арендатора, и все пользовательские данные хранятся в одной базе данных, с каким-либо флагом или идентификатором типа объекта в каждой записи.
Были ли проведены какие-либо исследования или была подготовлена какая-либо документация относительно этих двух вариантов и различий между ними?
Существует ли какой-то определенный стандарт или веская причина, по которой кто-то, разрабатывающий веб-приложение, позволяющее нескольким пользователям хранить совершенно разные виды данных, выбрал бы одно из другого?
Помимо вопросов скорости / эффективности, можно ли сказать что-то еще об этом, что могло бы повлиять на решение?
РЕДАКТИРОВАТЬ Я знаю, что некоторые термины могут быть специфичны для базы данных, так что для всех интересно, я конкретно имею в виду MongoDB.
1 ответ
Я бы не хотел, чтобы коллекции для конкретного арендатора. В моем приложении я обычно использую имена в жестком коде, точно так же, как я бы использовал имена таблиц в жестком коде, если бы я использовал таблицы SQL. Там будет один comments
Коллекция, которая хранит все комментарии для блога. Я не хотел бы иметь дело с именами коллекций, как comments_tenant_1
а также comments_tenant_2
, потому что 1) это кажется подверженным ошибкам, и 2) сделало бы код приложения более сложным (имена коллекций пришлось бы заменить функциями, которые вычисляли имя коллекции). И 3) количество коллекций в одной базе данных может вырасти огромным, что сделает список всех коллекций выглядящим пугающим, а также MongoDB не создан для того, чтобы иметь очень много коллекций (см. Ссылку в комментарии ниже вашего вопроса, которая Дэвид Б. опубликовал сообщение https://docs.mongohq.com/use-cases/multi-tenant.html).
Однако имена баз данных не связаны со структурами данных приложений, и вы можете предоставлять разрешения для баз данных (но не для отдельных коллекций). Таким образом, одна база данных на арендатора может быть разумной. Как может быть за документ tenant_id
поле в единой базе данных для всех арендаторов (см. вышеупомянутую ссылку).