具有继承的视图和分区之间的差异

时间:2015-10-26 09:11:42

标签: postgresql inheritance

我在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)

将每个国家/地区的数据插入其表格。

我想了解每种方法的好处和缺点。例如,在第二种方法中,我可以设置一些触发器来自动管理插入,这样界面也可以用于插入。我想这个视图的方法会慢得多,因为每当我需要一些信息时,我就强迫一个联盟,即使它只来自一个国家。是吗?

由于

1 个答案:

答案 0 :(得分:0)

我想总结评论中的陈述和我自己的发现: (如果您愿意,请随时在此处添加/更正/详细说明 - 稍后我会这样做) (我试图更喜欢填充 Pros 方而不是相反的 Cons 方面以避免重复和一致性。而是添加到 View Depends 而不是 Pratitioning取决于

我在这里假设一个典型的场景,我们希望使用抽象视图/主表来处理硬分区数据!基于语句partitioning overview松散地处理:

  

只有当一张桌子非常大时才能获得好处。表从分区中受益的确切点取决于应用程序,但经验法则是表的大小应超过数据库服务器的物理内存。

摘要

(以下)

  • 继承/分区的最大优势是,如果检查条件相当简单,优化器似乎在分区上工作得更好
    • 所以我们有一个“小增值”继承/分区功能让我们感到有点遗憾,我们可以通过更简单的现有union all功能来优化这些updatable view视图
  • 另一个分区优势是 insert update delete 操作应该对分区主表开箱即用
  • 继承/分区的最大缺点是不能轻易确保参照完整性(请参阅下面的详细信息)=>所以它基本上可以是更低级别(存储/优化)的优势,但具有相当高的影响/努力/复杂性: - /

1。通过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")

查看专业版

  • 对某些ddl结构更改更灵活(例如重新排列列)
  • 动态计算/更改现有列(例如带窗函数的小计,字符串/数学函数,......)
  • (另请参阅分区缺点)

查看Con

  • (另请参阅分区专业人员)

视图取决于

  • 两者都不是(直接)可引用/可索引的,因为索引/外键无论如何都必须在继承表上运行
  • 在添加新分区时重新创建视图(如提及@a_horse_with_no_name)对我来说似乎不是一个大缺点

    • 还提到view alternative
        

      但是,重新创建视图的需要增加了额外的步骤   并删除数据集的各个分区。在实践中这个   与使用继承相比,method几乎没有推荐它。

  • (另请参阅分区取决于

2。通过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)

分区专业人员

  • 一般插入,更新和删除操作自动工作,只要它们不违反分区约束
  • 优化由优化程序提供简单分区条件partitioning caveats
  • concurreny /锁定,批量和维护操作通常应该更好地工作
  • 数据约束,例如唯一性,可以强制执行
  • (另见查看缺点)

分区缺点

  • 无法直接引用(例如通过外键):inheritance caveats
  • 无法确保参照完整性和列唯一性,因为主服务器上的唯一/主要索引不可能/无法管理
  • 不支持自动保留约束匹配分区内的行(插入/更新后)(必须通过触发器/规则自行移动数据)
  • (另请参阅专业版)

分区取决于

  • (另请参阅视图取决于