使用继承进行元数据迁移是否安全?

时间:2019-12-03 13:56:42

标签: postgresql inheritance database-migration multi-tenant

为元数据创建模板架构是否安全,以便其他包含数据的架构可以从中继承?

优势:对于多租户方案,迁移将是无缝的。

缺点:?

示例:

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


1 个答案:

答案 0 :(得分:0)

我认为继承是解决此问题的好方法。

我可以想到两个缺点:

  • 可以为继承子代创建其他列。如果您控制DDL,则可以避免这种情况。

  • 您仍然必须分别在所有继承子级上创建和修改索引。

如果使用的是PostgreSQL v11或更高版本,则可以通过使用分区来防止这两个问题。各个表将成为“模板”表的分区。这样,您可以通过在模板表上创建分区索引来集中创建索引。缺点(可能使该解决方案无法实现)是您需要在表中使用分区键列。