Подтвердить что ты не робот

Как создать базу данных mysql с несколькими арендаторами

Скажем, мне нужно создать базу данных, в которой будут размещаться данные для нескольких компаний. Теперь для целей безопасности и администрирования мне нужно убедиться, что данные для разных компаний должным образом изолированы, но я также не хочу запускать 10 процессов mysql для размещения данных для 10 компаний на 10 разных серверах. Каковы наилучшие способы сделать это с помощью базы данных mysql.

4b9b3361

Ответ 1

Существует несколько подходов к мультитенантным базам данных. Для обсуждения их обычно разбивают на три категории.

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

В MSDN есть хорошая статья о плюсах и минусах каждого проекта, а также примеры реализации.


Microsoft, очевидно, удалила страницы, на которые я ссылался, но они есть на archive.org. Ссылки были изменены, чтобы указать там.

Это оригинальная ссылка на вторую статью

ОБНОВЛЕНИЕ: это ссылка на archive.org для второй статьи: примеры реализации

Ответ 2

Простым способом является: для каждой общей таблицы добавьте столбец SEGMENT_ID. Назначение соответствующего SEGMENT_ID каждому клиенту. Затем создайте представления для каждой клиентской базы в SEGMENT_ID, эти представления будут хранить данные отдельно от каждого клиента. С помощью этого метода информация может быть разделена, сделать ее простой и для работы, и для разработки (хранимая процедура также может быть разделена) простой.

Ответ 3

Предполагая, что вы запустите одну базу данных MySQL на одном экземпляре MySQL - существует несколько способов различать то, что принадлежит кому. Наиболее очевидным выбором (по крайней мере для меня) было бы создание составного первичного ключа, например:

CREATE TABLE some_table (
id int unsigned not null auto_increment,
companyId int unsigned not null,
..
..
..,
primary key(id, company_id)
) engine = innodb;

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

Если это не то, что вы искали - мои извинения за непонимание вашего вопроса.

Ответ 4

Учитывая конкретного пользователя БД, вы можете указать членство в группе, в которой указаны компании, чьи данные им разрешены для доступа.

Я предполагаю, что у вас будет таблица Companies, так что просто создайте отношения "один ко многим" между Companies и MySQLUsers или что-то подобное.

Затем, как условие всех ваших запросов, просто сопоставьте CompanyID на основе UserID

Ответ 5

Рассматривали ли вы создание другой схемы для каждой компании?

Вам следует попытаться более точно определить, чего вы хотите достичь.

Если вы хотите убедиться, что сбой HW не компрометирует данные для нескольких компаний, например, вам нужно создать разные экземпляры и запустить их на разных узлах.

Если вы хотите убедиться, что кто-то из компании A не может видеть данные, принадлежащие компании B, вы можете сделать это на уровне приложения в соответствии с ответом Matthew PK, например

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

Если вы хотите иметь возможность резервировать данные самостоятельно, чтобы вы могли безопасно резервировать компанию C в понедельник и компанию A в воскресенье и иметь возможность восстановить только компанию C, то опять же чисто прикладное решение не поможет.

Ответ 6

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

Это может быть сделано:

  1. Добавить столбец tenant_id в каждую таблицу
  2. Используйте триггер, чтобы заполнить tenant_id текущим именем пользователя базы данных при вставке
  3. Создайте представление для каждой таблицы, где tenant_id = current_database_username
  4. Используйте только представления в вашем приложении
  5. Подключитесь к базе данных, используя имя пользователя

Я полностью задокументировал это в своем блоге: https://opensource.io/it/mysql-multi-tenant/