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
我有一个包含许多大 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