使用 PostgreSQL 的数据仓库中分区事实数据表中主键的最佳实践

Best practices for primary keys in partitioned fact tables in a data warehouse with PostgreSQL

提问人:kirill fedorov 提问时间:11/13/2023 更新时间:11/14/2023 访问量:35

问:

我正在寻求有关在使用 PostgreSQL 时在数据仓库中实现分区表的最佳实践的建议。我目前的理解是,按时间戳列对事实表进行分区是有意义的,因为分析查询通常按时间间隔进行过滤。从语义上讲,将 event_id 作为主键是正确的。但是,PostgreSQL 要求在主键或唯一约束中包含分区列,从而导致错误:time

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.

如果我选择创建一个复合主键 including 和 ,我将面临一个新问题,即维度表无法仅引用事实数据表中的 ,因为缺少与给定键匹配的唯一约束:event_idtimeevent_id

ERROR: there is no unique constraint matching given keys for referenced table "earthquake_events"

此约束将迫使我创建包含多个维度表的复合外键,这在语义上似乎不正确且过于复杂。event_idtime

使用 PostgreSQL 在 DWH 的分区事实数据表中设计主键和引用外键的推荐方法是什么?有没有更好的方法来保持主键的语义完整性,同时又遵守 PostgreSQL 的分区要求?

感谢您的见解。

PostgreSQL 数据库设计 分区数据 仓库

评论

1赞 AdamKG 11/13/2023
自从添加了本机分区支持以来,我就没有使用过 PG 分区,但是当基于继承的分区是标准时,您通常不会进行引用分区表的外键检查。我犹豫要不要说明这一点,因为我自己还没有验证过,但我不明白你怎么能只使用event_id来获得外键 - PG 需要验证关联的行是否存在,并且在不知道时间的情况下,它不知道要检查哪个分区,并且像检查所有分区这样的回退似乎太慢了,不可行。
1赞 Frank Heikens 11/13/2023
事实数据表中的 FK 指向维度表中的主键。不太可能必须对维度表进行分区。您能分享一些 DDL 吗?(以纯文本形式,作为您问题的更新)

答:

2赞 Laurenz Albe 11/14/2023 #1

在数据仓库中继续操作的正确方法是不要创建外键。数据源自保证引用完整性的事务数据库,ETL 过程不应将其搞砸。外键不仅不能很好地处理分区表,而且还会在一定程度上减慢数据加载速度。