Применение мультитенантных рельсов: каковы плюсы и минусы разных технологий? - PullRequest
11 голосов
/ 10 августа 2011

Первоначально я написал свое приложение Ruby on Rails для одного клиента. Теперь я изменяю его, чтобы его можно было использовать для разных клиентов. Моя конечная цель состоит в том, чтобы какой-то пользователь (не я) мог нажать кнопку и создать новый проект. Затем генерируются все необходимые изменения (новая схема, новые таблицы, обработка кода), и мне не нужно никому редактировать файл database.yml или добавлять новые определения схемы. В настоящее время я использую доступ SCOPED. Итак, у меня есть модель проекта, а другие связанные модели имеют столбец project_id.

Я посмотрел другие посты, касающиеся мультитенантных приложений в Rails. Многие люди, кажется, предлагают создавать разные схемы для каждого нового клиента в Postgres. Для меня, однако, не очень полезно для нового клиента иметь другую схему с точки зрения модели данных. У каждого клиента будут одинаковые таблицы, строки, столбцы и т. Д.

Мое видение для каждого клиента состоит в том, что в моей производственной базе данных сначала есть таблица различных проектов / клиентов. И каждая из этих таблиц связана с набором таблиц, которые практически совпадают с разными данными. Другими словами таблица таблиц. Или, другими словами, первая таблица будет сопоставлена ​​с другим набором данных для каждого клиента, имеющего такую ​​же структуру.

То, как я объяснил свое видение, похоже на то, как Postgres реализует разные «схемы»? Это похоже на вложенные таблицы? Или Postgres все равно должен запрашивать всю информацию в базе данных? В настоящее время я не использую Postgres, но я бы хотел узнать, подходит ли он для дизайна. Если вам известно о программном обеспечении для баз данных, которое работает с Rails и соответствует моим потребностям, сообщите мне.

Прямо сейчас я использую области для выполнения мультитенантных приложений, но он не чувствует себя масштабируемым или чистым. Тем не менее, нетехническому пользователю очень легко создать новый проект, если я предоставлю ему заполняемую информацию. Знаете ли вы, возможно ли с помощью определения нескольких схем Postgres, чтобы он работал автоматически после того, как пользователь нажимает кнопку? И я бы предпочел, чтобы это обрабатывалось Rails, а не внешним скриптом, если это возможно? (пожалуйста, сообщите в любом случае)

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

Любой совет, касающийся мультитенантных приложений или моей ситуации, приветствуется. Любые вопросы для уточнения или дополнительные советы приветствуются.

Спасибо, --Dave

Ответы [ 3 ]

8 голосов
/ 10 августа 2011

MSDN имеет хорошее введение в мультитенантную архитектуру данных .

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

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

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

Это звучит , как будто вы говорите об одной схемена одного арендатораОбратите особое внимание на разрешения (операторы SQL GRANT и REVOKE . И ALTER DEFAULT PRIVILEGES .)

5 голосов
/ 24 октября 2012

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

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

Здесь также есть хорошая презентация по multitenancy-with-rails .

1 голос
/ 10 августа 2011

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

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

...