使用继承进行元数据迁移是否安全?
Is it safe to use inheritance for meta-data migration?
为元数据创建模板模式以便其他包含数据的模式可以从它继承是否安全?
优点:对于多租户场景,迁移将是无缝的。
缺点:?
示例:
hello=# CREATE SCHEMA template;
hello=# CREATE TABLE template.cities (
name text,
population real,
altitude int;
hello=# CREATE SCHEMA us;
hello=# CREATE TABLE us.cities () INHERITS (template.cities);
hello=# \d us.cities;
Table "us.cities"
Column | Type | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
Inherits: template.cities
hello=# CREATE SCHEMA eu;
hello=# CREATE TABLE eu.cities () INHERITS (template.cities);
hello=# \d eu.cities;
Table "eu.cities"
Column | Type | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
Inherits: template.cities
hello=# ALTER TABLE cities ADD COLUMN state varchar(30);
hello=# \d us.cities;
Table "us.cities"
Column | Type | Collation | Nullable | Default
------------+-----------------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
state | character varying(30) | | |
Inherits: template.cities
我认为继承是解决这个问题的好方法。
我能想到两个缺点:
可以为继承子项创建额外的列。如果您控制 DDL,您可能可以避免这种情况。
您仍然需要单独创建和修改所有继承子项的索引。
如果您使用的是 PostgreSQL v11 或更高版本,则可以通过使用分区来防止这两个问题。单个 table 将成为“模板”table 的分区。这样,您可以通过在模板 table 上创建分区索引来集中创建索引。缺点(可能使此解决方案无法实现)是您需要 table.
中的分区键列
为元数据创建模板模式以便其他包含数据的模式可以从它继承是否安全?
优点:对于多租户场景,迁移将是无缝的。
缺点:?
示例:
hello=# CREATE SCHEMA template;
hello=# CREATE TABLE template.cities (
name text,
population real,
altitude int;
hello=# CREATE SCHEMA us;
hello=# CREATE TABLE us.cities () INHERITS (template.cities);
hello=# \d us.cities;
Table "us.cities"
Column | Type | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
Inherits: template.cities
hello=# CREATE SCHEMA eu;
hello=# CREATE TABLE eu.cities () INHERITS (template.cities);
hello=# \d eu.cities;
Table "eu.cities"
Column | Type | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
Inherits: template.cities
hello=# ALTER TABLE cities ADD COLUMN state varchar(30);
hello=# \d us.cities;
Table "us.cities"
Column | Type | Collation | Nullable | Default
------------+-----------------------+-----------+----------+---------
name | text | | |
population | real | | |
altitude | integer | | |
state | character varying(30) | | |
Inherits: template.cities
我认为继承是解决这个问题的好方法。
我能想到两个缺点:
可以为继承子项创建额外的列。如果您控制 DDL,您可能可以避免这种情况。
您仍然需要单独创建和修改所有继承子项的索引。
如果您使用的是 PostgreSQL v11 或更高版本,则可以通过使用分区来防止这两个问题。单个 table 将成为“模板”table 的分区。这样,您可以通过在模板 table 上创建分区索引来集中创建索引。缺点(可能使此解决方案无法实现)是您需要 table.
中的分区键列