来自多个模式的 DWH
DWH from multiple schemas
我在 postgresql 中有一个项目,用于从多个模式创建 DWH。模式具有相同的结构(tables,约束)。
我被这个问题困住了:我将在 DWH 中使用的所有模式中都有一个 table "employees"。 schema1 table employees 中的第一个条目是 1 John Dow,schema2 table employees 中的第一个条目是 1 Mary Jane(id 列是自动递增的)。
有没有办法用这种结构创建 DWH?有没有办法对模式数据进行分区?
谢谢。
重新计算主键为
<id> * <# of schemas> + <schema number>
例如,如果您有三个模式,第一个模式中的数字 7 将变为 7 * 3 + 1 = 22,第三个模式中的数字 5 将变为 5 * 3 + 3 = 18。
这样您就可以轻松地以无冲突的方式转换所有数字。
最简单的方法可能是分配密钥的一些最高有效位作为源 ID,从而使您的密钥在所有源数据库中都是唯一的。例如。假设您存储的数据库永远不会超过 100 个,因此 7 位数据库标识符就足够了。
- 确保数据库中所有具有连续整数主键或引用这些主键的外键的 table 使用相同的数据类型。此数据类型必须足够大以保存任何 table 上所有行的值,而不会触及最高有效 8 位。因此
INTEGER
(32 位)密钥将保留 24 位剩余,最多允许 16777215 次插入,而 BIGINT
(64 位)密钥将保留 56 位剩余,最多允许 72057594037927935 次插入。 (请注意,ALTER TABLE ... ALTER COLUMN SET DATA TYPE
需要完全 table 重写,并且对于大量 tables 来说可能非常慢。)
- 为每个数据库分配一个唯一的 7 位数据库标识符,该标识符将占据每个键的最高 8 位。你只能得到 7 位,而不是 8 位,因为最高位是签名位,你不能碰它。
- 对于数据库中引用它的每个整数主键和外键,更新它,添加
DB_ID << 24
(对于 32 位键)或 DB_ID << 56
(对于 64 位键)。例如。对于具有 ID 13 和 32 位键的数据库,您需要将 218103808 添加到每个键值。
- 可选地,向每个 table 添加
CHECK CONSTRAINT
s,确保它们的密钥在 [(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1]
. 范围内
- 重新启动每个 table 的 PK 序列,使用:
ALTER SEQUENCE :seq_name MINVALUE :min_val MAXVALUE :max_val START WITH :start_val RESTART WITH :start_val
,其中 min_val = (DB_ID << 24) + 1
、max_val = ((DB_ID+1) << 24) - 1
和 start_val = currval(SEQUENCE_NAME)
。
我在 postgresql 中有一个项目,用于从多个模式创建 DWH。模式具有相同的结构(tables,约束)。 我被这个问题困住了:我将在 DWH 中使用的所有模式中都有一个 table "employees"。 schema1 table employees 中的第一个条目是 1 John Dow,schema2 table employees 中的第一个条目是 1 Mary Jane(id 列是自动递增的)。 有没有办法用这种结构创建 DWH?有没有办法对模式数据进行分区? 谢谢。
重新计算主键为
<id> * <# of schemas> + <schema number>
例如,如果您有三个模式,第一个模式中的数字 7 将变为 7 * 3 + 1 = 22,第三个模式中的数字 5 将变为 5 * 3 + 3 = 18。
这样您就可以轻松地以无冲突的方式转换所有数字。
最简单的方法可能是分配密钥的一些最高有效位作为源 ID,从而使您的密钥在所有源数据库中都是唯一的。例如。假设您存储的数据库永远不会超过 100 个,因此 7 位数据库标识符就足够了。
- 确保数据库中所有具有连续整数主键或引用这些主键的外键的 table 使用相同的数据类型。此数据类型必须足够大以保存任何 table 上所有行的值,而不会触及最高有效 8 位。因此
INTEGER
(32 位)密钥将保留 24 位剩余,最多允许 16777215 次插入,而BIGINT
(64 位)密钥将保留 56 位剩余,最多允许 72057594037927935 次插入。 (请注意,ALTER TABLE ... ALTER COLUMN SET DATA TYPE
需要完全 table 重写,并且对于大量 tables 来说可能非常慢。) - 为每个数据库分配一个唯一的 7 位数据库标识符,该标识符将占据每个键的最高 8 位。你只能得到 7 位,而不是 8 位,因为最高位是签名位,你不能碰它。
- 对于数据库中引用它的每个整数主键和外键,更新它,添加
DB_ID << 24
(对于 32 位键)或DB_ID << 56
(对于 64 位键)。例如。对于具有 ID 13 和 32 位键的数据库,您需要将 218103808 添加到每个键值。 - 可选地,向每个 table 添加
CHECK CONSTRAINT
s,确保它们的密钥在[(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1]
. 范围内
- 重新启动每个 table 的 PK 序列,使用:
ALTER SEQUENCE :seq_name MINVALUE :min_val MAXVALUE :max_val START WITH :start_val RESTART WITH :start_val
,其中min_val = (DB_ID << 24) + 1
、max_val = ((DB_ID+1) << 24) - 1
和start_val = currval(SEQUENCE_NAME)
。