Я хотел бы создать приложение SaaS с мультитенантным сервером следующим образом:
- 1 база данных для всех клиентов
- 1 узел / express сервер для все клиенты
- разделяют данные клиентов, используя поле
tenant_id
во всех соответствующих таблицах
Прочитав различные обсуждения / форумы / статьи, я думаю, что у меня есть только 2 варианта:
- найти какой-то ORM, который гарантирует, что во всех моих запросах всегда есть предложение
tenant_id=XXX
WHERE
, без риска его забыть. - найти способ использовать MySQL
view
для каждого table
, который выполняет эту фильтрацию.
Однако у меня есть проблемы для обоих вариантов ...
- Я пробовал
Sequelize
и сталкиваются с проблемами со сложными запросами, которые ведут себя плохо. Я также посмотрел на Objection.js
и Knex
, но не смог определить, смогли ли они систематически добавлять предложение WHERE
для фильтрации на tenant_id
. - . Я хотел бы найти способ дать параметр арендатора при запросе представлений, но это кажется невозможным, за исключением глобальных MySQL переменных. Таким образом, я думаю, что вещи могут быть ошибочными, если 2 запроса для 2 разных клиентов происходят одновременно. Другой вариант - создать представление для каждой таблицы И для каждого клиента, но я нахожу это довольно тяжелым и сложным в обслуживании. Особенно, если мне нужно добавить поле в таблицу, мне придется перестроить все представления, связанные с этой таблицей. Кроме того, я не знаю, как сохранить 100 подключений к базам данных на сервере, если одновременно открыто 100 клиентских сессий (рекомендуется ли это делать?)
Может ли пожалуйста, помогите мне с рекомендациями и / или инструментами?
И, между прочим, я также пытаюсь добиться контроля версий моей базы данных MySQL, как и для моего кода JavaScript, но я Пока что не удалось найти что-то замечательное, так как это может быть связано с некоторыми функциями ORM, пожалуйста, дайте мне знать! Моя основная цель заключается в том, чтобы убедиться, что я изменяю производственную базу данных точно так же, как база данных разработки (и не забудьте, например, добавить поле в производство).
Редактировать: решение, указанное в Могу ли я создать представление с параметром в MySQL? здесь не работает, потому что переменная p1
впоследствии сохраняет свое значение. Поэтому я должен подумать о том, чтобы сбрасывать его после каждого запроса, но риск, который я забыл, велик. И если я забуду, последствия будут даже хуже, чем бездействие: один клиент увидит данные другого клиента.