2010-07-28 43 views
1

我打算使用spring/hibernate创建一个web应用程序。我应该添加一个类型列来设计postgreSQL中的继承吗?

我应该如何设计我的postgresql数据库以支持继承?
假设我有以下表格:super_table,sub_table_1,sub_table_2。
然后sub_table_1和subtable_2会继承super_table。

我应该添加一个类型列(如char或int),以便我知道
如果super_table中的行是sub_table_1或sub_table_2?

请指教。谢谢。

+1

你有什么问题? Spring/Hibernate中的继承与PostgreSQL中的继承有不同的范围。不要试图解决你没有的问题,最终会遇到真正的问题。 – 2010-07-28 09:00:01

回答

3

当然您也可以例如这样做是为了强制执行,只有一个子表可以参考给定的行:

CREATE TABLE Super_Table (
    super_id SERIAL PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    UNIQUE KEY (super_id, sub_type) 
); 

CREATE TABLE Sub_Table_A (
    super_id PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    CHECK (sub_type = 'A'), 
    FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type) 
); 

CREATE TABLE Sub_Table_B (
    super_id PRIMARY KEY, 
    sub_type CHAR(1) NOT NULL, 
    CHECK (sub_type = 'B'), 
    FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type) 
); 

现在也没有办法在Super_Table行可以通过行两个子表中引用。 Super_Table中的行必须具有'A'或'B',因此只有一个子表可以满足外键引用。


回复您的评论:

我的理解是,继承了当前PostgreSQL的实现允许一些相关的指标,独特constaints和外键约束异常。使用此功能非常棘手且容易出错。

基本上,因为索引只存在于一张表上,所以如果你的父表上有一个唯一的约束,那么它如何能够强制父对象及其所有子对象的唯一性?孩子可以将值插入父表中已存在的表中,或者父母可以插入其中一个孩子中已经存在的值。

同样,外键不能引用父表和/或其子,因为如果在具有相同主键或唯一值的父/子中可以存在多行,那么引用哪个行是不明确的。

这些是PostgreSQL中INHERITS的已知和未解决的限制。我上面显示的设计解决了主键的问题,但不能解决次要唯一键。

http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php

+0

我正在考虑使用INHERITS。这可能吗? – geffchang 2010-07-28 05:16:55

+0

阅读http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch可能会清除一两件事 – AlexRednic 2010-07-29 06:54:54