PostgreSQL:如何跨多个 table 使用查找 table 到 select 数据?

PostgreSQL: How to use a lookup table to select data across multiple tables?

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

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

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

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

(如您所见,ID 在 table 中并不总是唯一的)然后 table 进行查找:

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

它将 select 来自 B 和 C 的内容(其中 id 为 6)。此外,它应该只对 B 和 C 进行索引扫描以减少搜索时间。再一次,有很多 table 并且它们非常大。到目前为止,大多数 ID 在 table 中都是唯一的。

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

PS table 的内容没有存储到单个 table 中,因为体积在不断增长 inserting/copying 进入这个索引 table 一段时间后变得非常慢。此外,通过截断单独的 tables 更容易删除特定数据。

您正在寻找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 快速访问,但可以简化联盟的管理和按国家/地区名称的查询。您仍然需要查找 table 个国家/地区:

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