来自多个模式的 DWH

k4br4s

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

大卫·斯嘉丽

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

  1. 确保数据库中具有连续整数主键或引用这些主键的外键的所有表都使用相同的数据类型。此数据类型必须足够大,以在不触及最高有效 8 位的情况下保存任何表中所有行的值。因此,INTEGER(32 位)密钥将剩余 24 位,最多允许插入 16777215 次,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 CONSTRAINTs添加到每个表,确保它们的键在范围内[(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_val,其中min_val = (DB_ID << 24) + 1max_val = ((DB_ID+1) << 24) - 1start_val = currval(SEQUENCE_NAME)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章