【问题标题】:PostgreSQL: How to use a lookup table to select data across multiple tables?PostgreSQL:如何使用查找表跨多个表选择数据?
【发布时间】:2021-06-15 16:19:33
【问题描述】:

我有一个包含许多大表的架构,它们都具有相同的结构。每个表的 id 都有一个索引。我还有一个单独的表,其中包含其他表中的所有 id,指向它们的表名;例如,架构中的表:

Table 'A'
id     content
1      ...
2      ...
3      ...

Table 'B'
id     content
4      ...
5      ...
6      ...

Table 'C'
id     content
5      ...
6      ...
7      ...

(如您所见,表中的 id 并不总是唯一的)然后是带有查找的表:

Table 'lookup'
id     tablename
1      'A'
2      'A'
3      'A'
4      'B'
5      'B'
5      'C'
6      'B'
6      'C'
7      'C'

现在,我该如何制作这样的视图?

SELECT 
    id, content
FROM 
    view
WHERE 
    id = 6

它将从 B 和 C 中选择内容(其中 id 为 6)。此外,它应该只对 B 和 C 进行索引扫描以减少搜索时间。再一次,有很多桌子,而且很大。到目前为止,大多数 id 在表格中都是唯一的。

我该怎么做? (或者,我应该这样做吗?)

PS 表的内容没有存储到单个表中,因为卷在不断增长,并且在一段时间后插入/复制到该索引表中变得非常缓慢。此外,只需截断单独的表即可更轻松地删除特定数据。

【问题讨论】:

  • 如果您使用继承或分区来构建表结构会容易得多。
  • (SELECT * FROM 'A' WHERE id <= 3) UNION ALL (SELECT * FROM 'B' WHERE id >= 4 AND id <= 6) UNION ALL (SELECT * FROM 'C' WHERE id >= 5) 可能会起作用。但正如 Bernando 所说,这听起来像是一个完美的分区用例——除了你一次在多个表中有一些行!为什么?
  • @Bergi 只是为了提供一些上下文:每个表指的是一个地理区域,而行指的是这些区域内的几何对象。一个对象可能存在于多个区域(在边界上)。它的对象 ID 会出现在多个表中,但几何形状不同。我想创建一个高效的视图来选择所有这些表中任意对象 id 的所有行(数百个,每个表有多个 GB)
  • @BernardoJerez 我不熟悉继承和分区,所以会研究一下。非常感谢。
  • @pklaassen 这两个对象在两个表中的内容是否相同?这听起来像是一个标准化问题。

标签: postgresql psql


【解决方案1】:

您正在寻找table partitioning:

CREATE TABLE object (
    country text,
    id bigint,
    content bytea,
    PRIMARY KEY (country, id)
) PARTITION BY LIST (country);


CREATE TABLE object_a PARTITION OF object FOR VALUES IN ('A');
CREATE TABLE object_b PARTITION OF object FOR VALUES IN ('B');
CREATE TABLE object_c PARTITION OF object FOR VALUES IN ('C');

仅此一项不会让您通过 id 快速访问,但可以简化管理 union 和按国家名称查询。您仍然需要国家/地区的查找表:

CREATE MATERIALIZED VIEW lookup AS SELECT country, id FROM object;

那你就可以了

SELECT content
FROM object
JOIN lookup ON object.country = lookup.country AND object.id = lookup.id
WHERE lookup.id = 6

【讨论】:

  • 是的,我认为这就是我所需要的,至少对于解决部分问题。回答您之前的问题:不,两个对象在两个表中永远不会具有相同的内容。假设一个 id 为 6 的对象位于 A 和 B 两个国家的边界​​上。然后它将在表 A 中有一行 id 为 6 和对象 6 的几何形状的一个 part位于A作为其内容;它还会在表 B 中有一行 ID 为 6 以及位于 B 中的对象 6 的几何形状的 其他部分。这听起来可能含糊不清,但解释整个上下文需要太多时间词。
猜你喜欢
  • 2018-03-15
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2014-03-29
  • 2011-08-29
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多