分区 Postgres 表

Posted

技术标签:

【中文标题】分区 Postgres 表【英文标题】:Partitioning Postgres table 【发布时间】:2019-07-14 03:16:11 【问题描述】:

我正在 Postgres 11 中构建一个数据库,我想通过分区表来分割信息。约会表已经按日期范围进行了分区,我也想对患者表进行分区;每个医生对患者的分区。

问题是:如何使用列表分区对患者表进行分区?也就是说,对于这张表,我必须与医生表建立直接的分区关系,或者我必须使用中间表,因为这两个表之间存在多对多的关系。

附上一张说明图。

【问题讨论】:

"我还要对患者表进行分区;每个医生对患者的分区。"当同一个病人可以分配给多个医生时,这将如何工作?你想通过对表进行分区来实现什么? 您预计有多少患者和医生?如果表中只有几百万行,则不需要分区(也没有帮助) 【参考方案1】:

对于多对多关系,您需要一个映射表,无论是否分区。 我不会为映射表使用人工主键,而是id_doctorid_patient 的组合(无论如何它们都是人工的)。 appointment 表也是如此。

由于id_doctor 不是患者表的一部分(也不应该是),因此您不能对每个医生的patient 表进行分区。你为什么想这么做?分区主要用于批量删除(并在一定程度上加速顺序扫描)——这就是你的目标吗?

有一个广泛的假设,即更大的表应该仅仅因为它们很大就被分区,但事实并非如此。对分区表的索引访问(如果有的话)比对非分区表的索引访问稍慢。您有数十亿患者吗?

【讨论】:

阅读我看到在这种情况下使用分区不方便的答案,@LaurenzAlbe 你能告诉我一个正确的方法来做多对多关系吗?谢谢! 我可以告诉你认为什么是好的。例如在doctor_patient 中,删除id_doctor_patient 并改为在(id_doctor, id_patient) 上声明主键(或相反)。这样可以为您节省一列,并确保每个医患组合只能有一个条目。

以上是关于分区 Postgres 表的主要内容,如果未能解决你的问题,请参考以下文章

Spring-JPA 可以与 Postgres 分区一起使用吗?

PG基础篇--逻辑结构管理(表继承分区表)

直接按块范围索引(BRIN)标识符查询 Postgres 表

Postgres中用户定义的连接功能?

如何判断 Postgres 表何时聚集以及使用了哪些索引

Postgres 忽略表约束,即使约束不匹配也会扫描所有继承的表