DWH

2017-06-04 39 views
1

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

+0

是否有任何理由不能简单地将所有员工数据合并到一个表中,添加一个捕获源模式名称的字段(如果需要),然后为每个数据分配一个新的ID记录? – RADO

回答

0

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

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

感谢您的回复。我正在努力完成这项工作。再一次感谢你。祝你有美好的一天 ! – k4br4s

0

重新计算作为

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

例如主键,如果有三个模式中,从第一模式号7将成为7 * 3 + 1 = 22,并且从第三模式号5将成为5 * 3 + 3 = 18。

这样,你可以很容易地在无碰撞的方式转换所有的数字。

+0

谢谢你的回应。我的问题是我的模式编号是动态的。它适用于应用程序,每当客户注册我们的帐户时,应用程序都会为该客户端生成架构。 – k4br4s

相关问题