Есть ли у многопользовательских БД несколько баз данных или общих таблиц?


25

Является ли многопользовательская база данных:

  • Сервер БД, который имеет разные (идентичные) базы данных / схемы для каждого клиента / арендатора ?; или
  • Сервер БД с базой данных / схемой, в которой клиенты / арендаторы обмениваются записями внутри одних и тех же таблиц?

Например, в варианте 1 выше, я мог бы иметь сервер MySQL, скажем mydb01.example.com, и он мог бы иметь customer1базу данных внутри него. Эта customer1база данных может иметь, скажем, 10 таблиц, которые служат моим приложением для данного конкретного клиента (Клиент № 1). В ней также может быть customer2база данных с теми же 10 таблицами, но содержащая только данные для клиента №2. Это может быть customer3база данных, customer4база данных и так далее.

В варианте № 2, выше, будет только одна база данных / схема, скажем myapp_db, снова с 10 таблицами в ней (те же, что и выше). Но здесь данные для всех клиентов находятся внутри этих 10 таблиц, и поэтому они «разделяют» таблицы. И на уровне приложений, логика и контроль безопасности, к которым клиенты имеют доступ, к каким записям в этих 10 таблицах, и большое внимание уделяется тому, чтобы Клиент № 1 никогда не заходил в приложение и не видел данные Клиента № 3 и т. Д.

Какая из этих парадигм представляет собой традиционную многопользовательскую базу данных? И если нет, то кто-то может предоставить мне пример (используя сценарии, описанные выше), что такое многопользовательская БД?


«мультитенант» подразумевает строгую безопасность - реализованную где-то - так что один арендатор не может видеть данные другого, не может изменять их, не может запретить доступ к ним и т. д. Эта безопасность должна быть каким-то образом реализована. Опции # 1 и # 2 OP работают, но анализ безопасности и работа, необходимая для реализации безопасности, различны. Что бы это ни стоило, я работал в стартапе, который реализовал многопользовательский режим с помощью опции # 2, где таблицы - со строками, принадлежащими нескольким арендаторам - были скрыты (через разрешения) от всех конечных пользователей, и безопасность была полностью реализована в хранимых процедурах.
Давидбак


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

Ответы:


30

Какая из этих парадигм представляет собой традиционную «многопользовательскую» БД

Обе концепции называются мультитенантностью, поскольку это просто логическая концепция, «в которой один экземпляр программного обеспечения работает на сервере и обслуживает нескольких арендаторов» (из Википедии ). Но как вы реализуете эту концепцию «физически», зависит от вас.

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

Чтобы быть точным, можно создать мультитенантное приложение с не мультитенантной БД, предоставляя отдельный экземпляр БД для каждого клиента. Однако это исключает возможность совместного использования любых ресурсов БД напрямую между арендаторами, и прикладной уровень должен убедиться, что подключен правильный арендатор к правильной базе данных.


Спасибо @Doc Brown (+1), но тогда, как вы могли бы иметь какую-либо базу данных, которая не была мультитенантной?!?
Смееб

4
@smeeb: многопользовательский режим - это свойство приложения, которое используется разными арендаторами, а не база данных «позади» приложения. Конечно, концепция БД должна поддерживать многопользовательский режим, чтобы сделать это возможным.
Док Браун

4
@smeeb: предположим, у вас есть таблица User с ограничением на уникальность имени пользователя, и теперь некоторые сотрудники арендатора больше не могут использовать имя пользователя только потому, что его уже использует другой человек, работающий с другим арендатором.
RemcoGerlich

5
@smeeb: если единственный способ обслуживания двух арендаторов - это установить и запустить приложение дважды, на двух разных серверах, с двумя отдельными базами данных, я думаю, что один из них не будет называться мультитенантным.
Док Браун

1
Некоторое время назад я отправился на презентацию Azure, в которой говорилось, что MYOB запускает свое облачное решение на Azure, и каждый арендатор получает свою собственную БД (и, вероятно, веб-серверы тоже); у них просто есть несколько отличных инструментов автоматизации для управления сотнями экземпляров БД, которые могут потребоваться. С другой стороны, организация, в которой я в настоящее время работаю, запускает сотни клиентов из единой базы данных, в программном обеспечении достаточно много работы для обеспечения изоляции данных клиентов. Мы также рассмотрели гибрид, где наши крупнейшие клиенты получат свои собственные БД, а другие поделились оригиналом.
Дэвид Кивини

36

Согласно Microsoft, этот термин имеет 3 возможных значения (одна база данных для всех арендаторов или одна база данных на каждого арендатора).

Если использовать ваш пример, у каждого клиента будет свой арендатор.

  1. База данных на каждого арендатора (клиента)

    • Каждый арендатор изолирован от других (нет случайного доступа к данным других арендаторов)
    • Изоляция также облегчает управление восстановлением данных, а также адаптацию потребностей хранилища для потребностей арендаторов.
  2. Общая база данных, отдельная схема.

    • Каждый арендатор имеет свою собственную схему, а его данные находятся в собственных таблицах.
    • Восстановление может занять больше времени, так как все находятся в одной базе данных, вы не можете просто восстановить базу данных в более раннюю резервную копию (это откатит данные каждого арендатора). Один из вариантов - восстановить новую базу данных, а затем объединить / скопировать только данные 1 арендатора.
  3. Общая база данных, общая схема.

    • Данные каждого арендатора находятся в тех же таблицах. Например, если вы отслеживаете заказы, заказы каждого арендатора будут находиться в «dbo.Orders».
    • Данные арендаторов разделены столбцом в каждой таблице (может быть TenantId), который показывает владельца строки.

Есть плюсы и минусы для каждого, хорошо объясненные в этой статье: https://msdn.microsoft.com/en-us/library/aa479086.aspx

Бонус: вы можете думать об этом как о жилом помещении (чрезвычайно упрощенном).

  1. У каждого арендатора есть свой дом. Они могут делать все, что захотят, и если это сгорит, это никого не затронет.

  2. Каждый арендатор находится в одном здании, но имеет собственную квартиру.

  3. Все живут в одной квартире, и все вещи помечены наклейкой, чтобы показать, кому принадлежит.


2
Спасибо за ваш ответ. Не могли бы вы немного проработать свой ответ. Это создаст лучший ответ.
Томас Джанк

1
Ваш бонусный пример потрясающий @ imms90
Аравин

3
Microsoft удалила страницу, на которую вы ссылались из MSDN. Машина обратного пути все еще имеет копию.
Майк Шеррилл 'Cat Recall'

1
Аналогичная статья от MS (возможно, та же самая, что была перенесена): docs.microsoft.com/en-us/azure/sql-database/…
Пьер Генри
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.