不同的模式意味着不同的表,所以如果你必须坚持这种结构,那就意味着联合,一种或另一种方式。那可能相当昂贵。如果您在通过搜索路径的便利进行分区之后,反转您的架构可能是有意义的:
在公共架构中存储一个大表,然后在每个单独的架构中提供视图。
查看这个演示我的概念的 sqlfiddle:
http://sqlfiddle.com/#!12/a326d/1
还为后代粘贴内联,以防 sqlfiddle 无法访问:
架构:
CREATE SCHEMA customer_1;
CREATE SCHEMA customer_2;
CREATE TABLE accounts(id serial, name text, value numeric, customer_id int);
CREATE INDEX ON accounts (customer_id);
CREATE VIEW customer_1.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 1;
CREATE VIEW customer_2.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 2;
INSERT INTO accounts(name, value, customer_id) VALUES('foo', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('bar', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('biz', 150, 2);
INSERT INTO accounts(name, value, customer_id) VALUES('baz', 75, 2);
查询:
SELECT SUM(value) FROM public.accounts;
SET search_path TO 'customer_1';
SELECT * FROM accounts;
SET search_path TO 'customer_2';
SELECT * FROM accounts;
结果:
425
1 foo 100
2 bar 100
3 biz 150
4 baz 75