来自多个模式的DWH

时间:2017-06-04 18:11:17

标签: postgresql data-warehouse multiple-schema

我在postgresql中有一个项目,可以从多个模式创建DWH。模式具有相同的结构(表,约束)。 我坚持这个问题:我将在DWH中使用的所有模式中都有一个表“employees”。 schema1表雇员中的第一个条目是1 John Dow,schema2表雇员中的第一个条目是1 Mary Jane(id列是自动增量)。 有没有办法用这种结构创建DWH?有没有办法对模式数据进行分区? 谢谢。

2 个答案:

答案 0 :(得分:0)

将主键重新计算为

<id> * <# of schemas> + <schema number>

例如,如果您有三个模式,则第一个模式中的数字7将变为7 * 3 + 1 = 22,而第三个模式中的数字5将变为5 * 3 + 3 = 18。

通过这种方式,您可以轻松地以无碰撞的方式翻译所有数字。

答案 1 :(得分:0)

最简单的方法可能是将密钥的一些最重要的位分配为源ID,从而使您的密钥在所有源数据库中都是唯一的。例如。假设您将永远不会有超过100个数据库存储,因此7位数据库标识符就足够了。

  1. 确保数据库中具有连续整数主键的所有表或引用它们的外键使用相同的数据类型。此数据类型必须足够大,以保存任何表上所有行的值,而不会触及最重要的8位。因此INTEGER(32位)密钥将留下24位,允许最多16777215次插入,BIGINT(64位)密钥将留下56位,允许最多72057594037927935次插入。 (请注意ALTER TABLE ... ALTER COLUMN SET DATA TYPE需要完整的表重写,对于高容量表来说可能非常慢。)
  2. 为每个数据库分配一个唯一的7位数据库标识符,该标识符将占用每个密钥的最高8位。你只得到7位,而不是8位,因为最高位是签名位,你不能触及它。
  3. 对于在数据库中引用它的每个整数主键和外键,更新它,添加DB_ID << 24(对于32位密钥)或DB_ID << 56(对于64位密钥)。例如。对于ID为13和32位的DB,您可以为每个键值添加218103808。
  4. 或者,将CHECK CONSTRAINT添加到每个表格中,确保其密钥位于[(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1]范围内。
  5. 使用以下内容重新启动每个表的PK序列:ALTER SEQUENCE :seq_name MINVALUE :min_val MAXVALUE :max_val START WITH :start_val RESTART WITH :start_valmin_val = (DB_ID << 24) + 1max_val = ((DB_ID+1) << 24) - 1start_val = currval(SEQUENCE_NAME)