我们的项目使用不同的模式来保持组织和安全。我们GRANT
访问整个模式,而不是选择可能导致无意中泄露数据的单个组件。此外,如果我们可以从单个模式编写查询,它将使我们的生活更轻松,因为它有助于可维护性和错误减少。
例如,schema_foo
和schema_bar
包含原始规范化数据(最终用户无法访问),schema_baz
包含从{{返回数据的函数(可由最终用户访问)的函数) 1}}和schema_foo
。当schema_bar
和schema_foo
中的数据在交付给最终用户之前需要处理时,这是有意义的;但是,在某些情况下,不需要额外的处理。
在这种情况下,在schema_bar
中简单地调用schema_baz
或schema_foo
中的表格来制作视图是否有意义?如果是,那么两者之间的性能差异/副作用是什么?
schema_bar
和
SELECT * FROM schema_foo.table_bin;
如果这是可以接受的,是否更好(出于任何原因)通过名称而不是CREATE VIEW schema_baz.view_bin AS SELECT * FROM schema_foo.table_bin;
SELECT * schema_baz.view_bin;
来识别每一列?
注意:生成的视图也会用于其他查询。我知道查询规划器很棒;但是,我担心(ab)使用视图可能会产生意想不到的后果,其唯一目的是使表格可以从另一个模式访问。
答案 0 :(得分:1)
我的经验倾向于"如果有疑问,请明确"。在生产系统中使用select *
通常只是在路上遇到麻烦。
此外,在Postgres的基表中添加列不会改变视图中的列 - 它们不会神奇地出现。举个例子:
(postgres@lh:5432) # create table foo (col1 integer, col2 text);
CREATE TABLE
(postgres@lh:5432) # create view bar as select * from foo;
CREATE VIEW
(postgres@lh:5432) # alter table foo add col3 date;
ALTER TABLE
(postgres@lh:5432) # insert into foo values (1, 'One', current_date);
INSERT 0 1
(postgres@lh:5432) [~] # select * from foo;
col1 | col2 | col3
------+------+------------
1 | One | 2017-08-17
(1 row)
(postgres@lh:5432) # select * from bar;
col1 | col2
------+------
1 | One
(1 row)
这是9.5版本,但如果其他版本的工作方式不同,我会感到惊讶。
答案 1 :(得分:0)
是的,表格经常可以改变。如果您只是编写*,那么如果在基表中添加或删除列会怎么样?您的视图会在您不知情的情况下发生变化。
最佳做法是在编写任何类型的视图时始终列出列名称。