Как синхронизировать структуры базы данных PostgreSQL между схемами - PullRequest
0 голосов
/ 10 декабря 2018

Я создаю приложение, в котором будет много клиентов (более 200), и мы подумываем об использовании схем PostgreSQL для их разделения.

Теперь мой вопрос: когда я внесу изменение в одно из них?таблицу (например, добавление столбца), как мне заставить все другие схемы синхронизировать их структуру таблицы с желаемой?

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

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

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

Чтобы узнать больше о RLS, CrunchyData имеет некоторую полезную информацию, такую ​​как этот пост от Caleb Brewer .

Почему бы не несколько схем с наследованием таблиц?

Навигация / исследование вашей базы данных становится утомительным с таким количеством схем.Независимо от инструмента (psql, PgAdmin и т. Д.), Попытка просмотра / поиска схем в списке из 200+ является жалкой.Это влияет на ваших разработчиков, администраторов и аналитиков, делая каждую их жизнь менее увлекательной и менее продуктивной.Это значительно увеличивает стоимость обслуживания.

Второе: производительность!Индексы в родительской таблице не наследуются их дочерними таблицами.Если вам нужен индекс для столбца, который наследуется каждой схемой, вам нужно явно создать эти индексы в версии таблицы каждой схемы.Таким образом, для одной таблицы, для которой требуется 3 индекса, теперь требуется более 200 * 3 индексов.Нужно удалить индекс .... это 200+ раз, когда вам нужно удалить этот индекс.

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

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

Автоматизация - лучший подход

Если вам нужно развернуть одну схему для каждого клиента, автоматическое развертывание должно быть вашей целью.Даже если вы решите использовать RLS и хранить все данные в одном наборе таблиц, автоматизация все равно должна быть главным приоритетом.Такие инструменты, как Ansible и Sqitch могут быть неоценимыми для этого.Используя этот подход, вы могли бы написать свой DDL со схемой, заданной в качестве параметра (переменной), которая заполняется только во время развертывания.Таким образом, каждая схема будет развернута как точная версия с всеми объектами в вашей базе данных, включая индексы и контрольные ограничения для таблиц, представлений и функций.

0 голосов
/ 10 декабря 2018

Если вы хотите повторить ту же структуру, вам, вероятно, нужно использовать наследовать

https://www.postgresql.org/docs/11/ddl-inherit.html

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- in feet
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

В этом случае вы можете создать таблицу JhonCustomer на основе оригинальной CustomerТаблица.Если Customer таблица изменится, тогда JhonCustomer также изменится.

Но я все же думаю, что вы должны добавить custumer_id в свои таблицы вместо создания 200 схем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...