我在postgresql中有一个项目,可以从多个模式创建DWH。模式具有相同的结构(表,约束)。 我坚持这个问题:我将在DWH中使用的所有模式中都有一个表“employees”。 schema1表雇员中的第一个条目是1 John Dow,schema2表雇员中的第一个条目是1 Mary Jane(id列是自动增量)。 有没有办法用这种结构创建DWH?有没有办法对模式数据进行分区? 谢谢。
答案 0 :(得分:0)
将主键重新计算为
<id> * <# of schemas> + <schema number>
例如,如果您有三个模式,则第一个模式中的数字7将变为7 * 3 + 1 = 22,而第三个模式中的数字5将变为5 * 3 + 3 = 18。
通过这种方式,您可以轻松地以无碰撞的方式翻译所有数字。
答案 1 :(得分:0)
最简单的方法可能是将密钥的一些最重要的位分配为源ID,从而使您的密钥在所有源数据库中都是唯一的。例如。假设您将永远不会有超过100个数据库存储,因此7位数据库标识符就足够了。
INTEGER
(32位)密钥将留下24位,允许最多16777215次插入,BIGINT
(64位)密钥将留下56位,允许最多72057594037927935次插入。 (请注意ALTER TABLE ... ALTER COLUMN SET DATA TYPE
需要完整的表重写,对于高容量表来说可能非常慢。)DB_ID << 24
(对于32位密钥)或DB_ID << 56
(对于64位密钥)。例如。对于ID为13和32位的DB,您可以为每个键值添加218103808。CHECK CONSTRAINT
添加到每个表格中,确保其密钥位于[(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
,min_val = (DB_ID << 24) + 1
,max_val = ((DB_ID+1) << 24) - 1
和start_val = currval(SEQUENCE_NAME)
。