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