Преобразование одной клиентской базы данных SQL Server в одну мультитенантную базу данных - PullRequest
4 голосов
/ 13 октября 2011

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

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

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

  2. Существует ли простой способ реализации мультитенанта без необходимости рефакторинганаш код, который связывается с базой данных?

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

  3. Существует ли рекомендуемое ограничение на количество арендаторов в базе данных?

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

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

Ответы [ 2 ]

3 голосов
/ 25 сентября 2012

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

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

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

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

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

В случае простой таблицы ProductsProduct_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 может существенно сократить объем требуемой работы.

Ограничение на количество арендаторов

Я никогда не виделрекомендация ограничить количество арендаторов в мультитенантной структуре.Напротив, преимуществом мультитенантного подхода в является его масштабируемость.Сегодня вы можете легко создавать кластеры серверов баз данных или использовать облачные решения для беспрепятственного увеличения мощности оборудования при необходимости.

Интересующие ссылки

2 голосов
/ 23 января 2012

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

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

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

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

...