【问题标题】:DWH from multiple schemas来自多个模式的 DWH
【发布时间】:2017-06-05 15:53:05
【问题描述】:

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

【问题讨论】:

  • 有什么理由不能简单地将所有这些员工数据合并到一个表中,添加一个捕获源模式名称的字段(如果需要),然后分配一个新的每条记录的ID?

标签: postgresql data-warehouse multiple-schema


【解决方案1】:

最简单的方法可能是将密钥的一些最高有效位分配为源 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. 使用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)

【讨论】:

  • 感谢您的回复。我正在努力完成这项工作。再一次感谢你。祝你有美好的一天!
【解决方案2】:

将主键重新计算为

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

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

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

【讨论】:

  • 感谢您的回复。我的问题是我的模式编号是动态的。它适用于应用程序,每次客户向我们注册帐户时,该应用程序都会为该客户生成一个架构。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多