来自多个模式的 DWH

DWH from multiple schemas

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

重新计算主键为

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

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

这样您就可以轻松地以无冲突的方式转换所有数字。

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

  1. 确保数据库中所有具有连续整数主键或引用这些主键的外键的 table 使用相同的数据类型。此数据类型必须足够大以保存任何 table 上所有行的值,而不会触及最高有效 8 位。因此 INTEGER(32 位)密钥将保留 24 位剩余,最多允许 16777215 次插入,而 BIGINT(64 位)密钥将保留 56 位剩余,最多允许 72057594037927935 次插入。 (请注意,ALTER TABLE ... ALTER COLUMN SET DATA TYPE 需要完全 table 重写,并且对于大量 tables 来说可能非常慢。)
  2. 为每个数据库分配一个唯一的 7 位数据库标识符,该标识符将占据每个键的最高 8 位。你只能得到 7 位,而不是 8 位,因为最高位是签名位,你不能碰它。
  3. 对于数据库中引用它的每个整数主键和外键,更新它,添加 DB_ID << 24(对于 32 位键)或 DB_ID << 56(对于 64 位键)。例如。对于具有 ID 13 和 32 位键的数据库,您需要将 218103808 添加到每个键值。
  4. 可选地,向每个 table 添加 CHECK CONSTRAINTs,确保它们的密钥在 [(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1].
  5. 范围内
  6. 重新启动每个 table 的 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)