4

В настоящее время у нас есть система, в которой каждый из наших пользователей получает базу данных. Теперь мы переходим к схеме с несколькими арендаторами с одной базой данных, поэтому в одной базе данных могут размещаться многие клиенты.Преобразование единой клиентской базы данных SQL Server в одну базу данных с несколькими арендаторами

Несколько вопросов:

  1. Является ли инструмент преобразования многопользовательских в существовании? Или это просто процесс создания таблицы Tenant и добавление TenantID к каждой другой таблице?

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

    У нас есть Odata.svc, который делает все разговоры с базой данных (наши интерфейсные клиенты варьируются от .net-интерфейсов до iOS-устройств). Я немного читал об использовании федерации для фильтрации в предикате tenantID, поэтому код вообще не нужно менять. Это возможно?

  3. Есть ли рекомендуемый лимит на количество арендаторов в базе данных?

Я собираю это глупый вопрос (как долго является частью строки). Скорее всего, мы будем принимать окончательное решение на Azure.

С нетерпением ждем любых советов, которые могут мне дать. Мы делаем фундаментальные изменения в наших процессах, поэтому я хочу быть наверху, пока мы не находимся под ним.

ответ

2

Автоматизация?

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

Идея о ручном преобразовании

Start путем разработки новой схемы базы данных многопользовательской. (Это означает объединение всех схем баз данных с одним арендатором с любыми разделяемыми схемами, которые у вас есть). Я хотел бы сделать это так, как если бы он был разработан без каких-либо устаревших соображений.

Вам, очевидно, нужна таблица Tenant, на которую должны ссылаться многие ваши существующие таблицы с одним арендатором с колонкой Tenant_id. Например, таблица с пользователями потребует, чтобы это уникально связывало пользователей с арендатором.

В случае простой Products таблицы (с Product_id в качестве первичного ключа), это должно быть возможным, чтобы добавить Tenant_id колонки, получая таблицу с составным ключом (Tenant_id и Product_id). Но если вы написали приложение с нуля, я считаю, что таблица Product без ссылки на арендатора является правильным способом. Это также позволяет арендаторам делиться продуктами, а не добавлять дубликаты. Поскольку один арендатор может иметь продукты с Product_id 1,2,3 и еще 1,2, вы не можете просто объединить таблицы, потому что вы не можете использовать один и тот же идентификатор дважды - вам нужны уникальные значения первичного ключа. Один из способов решения этой проблемы - написать программу (на Java или другом языке высокого уровня), которая считывает все данные из базы данных арендатора в объекты в памяти, а затем записывает данные в схему с несколькими арендаторами. Процесс повторяется для следующей базы данных арендатора и т. Д. Таким образом, вы имели бы Product_id значения 1,2,3,4,5. Быстрый и грязный способ состоит в том, чтобы добавить число, скажем 1000, 2000 и так далее, ко всем значениям идентификатора в каждой схеме и просто пересечь пальцы, чтобы не возникало конфликтов.

код, который взаимодействует с базой данных

Вам нужно будет переписать большинство запросов к базе данных, чтобы учесть тот факт, что база данных в настоящее время многопользовательский. Это сложная задача, особенно учитывая последствия введения ошибки, которая позволяет одному арендатору возиться с данными другого арендатора. Однако некоторые методы могут облегчить эту задачу. Например, Tenant View Filter может значительно сократить объем требуемой работы.

ограничение на количество жильцов

Я никогда не видел рекомендацию, чтобы ограничить число жильцов в структуре с несколькими арендаторами. Напротив, strength of the multi-tenant approach - его масштабируемость. Сегодня вы можете легко создавать кластеры серверов баз данных или использовать облачные решения, чтобы при необходимости добавлять дополнительную аппаратную мощность.

Звенья интерес

2

Чтобы быть честным, по моему опыту вы не можете автоматизировать это. Вы перемещаете очень важные данные из своей инфраструктуры в свою модель данных. Каждый запрос был написан в предположении, что арендатор уже установлен. Поэтому каждый запрос & SP будет заменен на ссылку обратно на вашу таблицу арендаторов и параметризован.

Вы спрашиваете в Q1, если вы просто добавляете идентификатор tenantID в каждую таблицу. Это был бы один подход, но не тот, кого я защищал. Это приводит вас к открытому доступу к неправильным данным (без соблюдения того, что у детей есть те же идентификаторы tenantID, что и у родителя, или даже в том, что они все одинаковые!) Вам нужно обязательно добавить таблицу арендаторов, а затем тщательно выбрать, какие таблицы должны обратитесь к нему. Это не будет каждый. Некоторые из них потребуют этого, некоторые из них, возможно, захотят поместить его там по соображениям производительности. Если вы решите на последнем, вам, несомненно, потребуются дополнительные механизмы проверки, чтобы ваши данные были значимыми.

Если вы были в Oracle, что вы может быть в состоянии сделать это переделывает каждую таблицу в представление (по-прежнему делает все выше), то засуньте tenantID в сессию и сделать некоторый мелкозернистый доступ на нем скрыть большую часть деталей от клиента. Трудно сделать хорошо, хотя и я не уверен, что такое SQL-эквивалент. Может стоить каких-то исследований.

В чем причина слияния БД? Вам нужен отчет о кросс-DB или что-то еще? В противном случае у одного арендатора есть много преимуществ (множественное обновление расписаний простоя, производительность может быть лучше в зависимости от того, как [de] нормализовался, простота извлечения/отчетности отдельных арендаторов, простота удаления, когда вы теряете арендатора). Облако решение & один арендатор может потенциально работать в вашу пользу здесь.