Безопасность на уровне строк со столбцом customer_id
, как я подхожу к этому.Я использовал эту модель , где вы доверяете приложению для обработки установки переменной сеанса для нужного клиента.Это действительно не должно сильно измениться в самом приложении, так как другой подход потребовал бы, чтобы приложение обрабатывало установку клиентской схемы.
Чтобы узнать больше о RLS, CrunchyData имеет некоторую полезную информацию, такую как этот пост от Caleb Brewer .
Почему бы не несколько схем с наследованием таблиц?
Навигация / исследование вашей базы данных становится утомительным с таким количеством схем.Независимо от инструмента (psql
, PgAdmin и т. Д.), Попытка просмотра / поиска схем в списке из 200+ является жалкой.Это влияет на ваших разработчиков, администраторов и аналитиков, делая каждую их жизнь менее увлекательной и менее продуктивной.Это значительно увеличивает стоимость обслуживания.
Второе: производительность!Индексы в родительской таблице не наследуются их дочерними таблицами.Если вам нужен индекс для столбца, который наследуется каждой схемой, вам нужно явно создать эти индексы в версии таблицы каждой схемы.Таким образом, для одной таблицы, для которой требуется 3 индекса, теперь требуется более 200 * 3 индексов.Нужно удалить индекс .... это 200+ раз, когда вам нужно удалить этот индекс.
Управление: что происходит, когда dev создает новую таблицу в схеме клиента ", потому что это важно для этого важного клиента прямо сейчас?»Подобные странности найти практически невозможно.Это еще одна область, где стоимость обслуживания может увеличиваться в геометрической прогрессии.
Если вы настаиваете на использовании одной схемы для каждого клиента, наследование таблиц , вероятно, не поможет больше, чем повредит.
Автоматизация - лучший подход
Если вам нужно развернуть одну схему для каждого клиента, автоматическое развертывание должно быть вашей целью.Даже если вы решите использовать RLS и хранить все данные в одном наборе таблиц, автоматизация все равно должна быть главным приоритетом.Такие инструменты, как Ansible и Sqitch могут быть неоценимыми для этого.Используя этот подход, вы могли бы написать свой DDL со схемой, заданной в качестве параметра (переменной), которая заполняется только во время развертывания.Таким образом, каждая схема будет развернута как точная версия с всеми объектами в вашей базе данных, включая индексы и контрольные ограничения для таблиц, представлений и функций.