我在PostgresSQL中为不同的国家/地区提供了相同的表格结构,我想为所有国家/地区提供相同的界面。据我所知,有两种主要方法可以实现,包括View和with table inheritance。
首先是:
CREATE VIEW all_countries as first_country union second_country ...
第二个选项是:
CREATE TABLE first_country INHERITS (all_countries)
CREATE TABLE second_country INHERITS (all_countries)
将每个国家/地区的数据插入其表格。
我想了解每种方法的好处和缺点。例如,在第二种方法中,我可以设置一些触发器来自动管理插入,这样界面也可以用于插入。我想这个视图的方法会慢得多,因为每当我需要一些信息时,我就强迫一个联盟,即使它只来自一个国家。是吗?
由于
答案 0 :(得分:0)
我想总结评论中的陈述和我自己的发现: (如果您愿意,请随时在此处添加/更正/详细说明 - 稍后我会这样做) (我试图更喜欢填充 Pros 方而不是相反的 Cons 方面以避免重复和一致性。而是添加到 View Depends 而不是 Pratitioning取决于)
我在这里假设一个典型的场景,我们希望使用抽象视图/主表来处理硬分区数据!基于语句partitioning overview松散地处理:
只有当一张桌子非常大时才能获得好处。表从分区中受益的确切点取决于应用程序,但经验法则是表的大小应超过数据库服务器的物理内存。
(以下)
union all
功能来优化这些updatable view
视图views
e.g。
create table men (...) ...
create table women (...) ...
create or replace view human as
select 'male' as gender, m.* from men m
UNION ALL select 'female' as gender, w.* from women w
-- (use "union all" to avoid "merge overhead")
在添加新分区时重新创建视图(如提及@a_horse_with_no_name)对我来说似乎不是一个大缺点
但是,重新创建视图的需要增加了额外的步骤 并删除数据集的各个分区。在实践中这个 与使用继承相比,method几乎没有推荐它。
(另请参阅分区取决于
inheritance
/ partitions
e.g。
create table human ( gender text, ...) ... -- normally not containing
-- data/indexes (like a view)
create table men ( gender text check( gender = 'male' ) ) inherits (human)
create table woman ( gender text check( gender = 'female' ) ) inherits (human)