我正在寻求关于在使用PostgreSQL时在数据仓库中实现分区表的最佳实践的建议。我目前的理解是,通过时间戳列time
对事实表进行分区是有意义的,因为分析查询通常通过时间间隔进行过滤。从语义上讲,将event_id作为主键是正确的。然而,PostgreSQL要求在主键或唯一约束中包含分区列,导致错误:
ERROR: unique constraint on partitioned table must include all partitioning columns
DETAIL: PRIMARY KEY constraint on table "earthquake_events" lacks column "time" which is part of the partition key.
字符串
如果我选择创建一个包含event_id
和time
的复合主键,我将面临一个新的问题,即维度表不能只引用事实表中的event_id
,因为缺少匹配给定键的唯一约束:
ERROR: there is no unique constraint matching given keys for referenced table "earthquake_events"
型
这个约束将迫使我创建复合外键,在众多的维度表中同时包含event_id
和time
,这在语义上似乎是不正确的,而且过于复杂。
在使用PostgreSQL的DWH中设计主键和引用已分区事实表中的外键的推荐方法是什么?是否有更好的方法来维护主键的语义完整性,同时还遵守PostgreSQL的分区要求?
谢谢你的见解。
1条答案
按热度按时间dgjrabp21#
在数据仓库中进行操作的正确方法是 * 不要 * 创建外键。数据来自保证引用完整性的事务数据库,ETL过程不应该搞砸。外键不仅不能很好地与分区表一起工作,还会在一定程度上减慢数据加载。