Как я понимаю, для мультитенантного приложения существует 4 шаблона:
1. Выделенная модель / несколько производственных сред
В каждом экземпляре или экземпляре базы данных полностью размещаются разные приложения-арендаторы, и между ними ничего не распределяется.
Это приложение на 1 экземпляр и 1 база данных для 1 арендатора. Разработка будет простой, как если бы вы обслуживали только одного арендатора. Но для девопов будет кошмар, если у вас, скажем, 100 арендаторов.
2. Физическое разделение арендаторов
1 экземпляр приложения для всех арендаторов, но 1 база данных для 1 арендатора. Это то, что вы ищете. Вы можете использовать ActiveRecord::Base.establish_connection(config)
, или использовать гемы, или обновить до Rails 6, как предлагают другие. См. Ответ для (2) ниже.
3. Модель изолированной схемы / логические сегрегации
В изолированной схеме таблицы арендаторов или компоненты базы данных группируются в рамках логической схемы или пространства имен и отделяются от других схем арендаторов, однако схема размещается в тот же экземпляр базы данных.
1 приложение экземпляра и 1 база данных для всех арендаторов, как вы делаете с квартирой gem.
4. Частично изолированный компонент
В этой модели компоненты, имеющие общие функции, совместно используются арендаторами, в то время как компоненты с уникальными или несвязанными функциями являются изолированными. На уровне данных общие данные, такие как данные, идентифицирующие арендаторов, группируются или хранятся в одной таблице, в то время как данные арендатора c изолируются на уровне таблицы или экземпляра.
Что касается (1), ActiveRecord::Base.establish_connection(config)
не рукопожатие в дБ за запрос, если вы используете его правильно. Вы можете проверить здесь и прочитать все комментарии здесь .
Что касается (2), если вы не хотите использовать establish_connection
, вы можете использовать gem multiverse (работает для рельсов 4.2) или другие драгоценные камни. Или, как предлагают другие, вы можете обновить до Rails 6.
Редактировать: Multiverse gem использует establish_connection
. Он добавит database.yml
и создаст базовый класс так, чтобы каждый подкласс разделял одно и то же соединение / пул. По сути, это сокращает наши усилия по использованию establish_connection
.
Что касается (3), ответ:
Если у вас не так много арендаторов, а ваше приложение довольно сложное, Я предлагаю вам использовать шаблон Dedicated Model. Таким образом, вы go для 1 экземпляра приложения = одно указанное c подключение к одному указанному c арендатору. Вам не нужно усложнять свои приложения, добавляя несколько соединений с базой данных.
Но если у вас много арендаторов, я предлагаю вам использовать физическое разделение арендаторов или частично изолированный компонент в зависимости от вашего бизнес-процесса.
В любом случае, вы должны обновить / переписать ваше приложение, чтобы соответствовать новой архитектуре.