将表仅用于多重继承是不好的做法吗?

时间:2014-09-01 14:33:38

标签: sql postgresql inheritance postgresql-9.2 postgresql-8.4

对PostgreSQL数据库建模,创建一个表来为另一个表提供服务是不好的做法?例如,创建一个包含默认地址字段的表。

CREATE TABLE address (
    zipcode char(8) NOT NULL,
    street varchar(80) NOT NULL,
    number varchar(10) NOT NULL,
    city varchar(60) NOT NULL,
    state char(2) NOT NULL
);

然后在每个使用这些字段的表中继承它。例如:

CREATE TABLE customer (
    id integer PRIMARY KEY,
    name varchar(80)
) INHERITS (address);

CREATE TABLE company (
    id integer PRIMARY KEY,
    name varchar(80)
) INHERITS (address);

CREATE TABLE building (
    id integer PRIMARY KEY,
    name varchar(80)
) INHERITS (address);

这个想法在表创建过程中应用了类似Single responsibility principle的东西。

我的一个主要问题是表格address是否会导致表现有意义的损失,因为它会逐渐变大。

3 个答案:

答案 0 :(得分:2)

这不是一个好主意。查询address表将向您显示来自所有来源的一堆混乱地址,但没有任何内容可以将它们连接到其他任何有用的地址。

通过传统的关系模型,通过对地址ID的外键引用,可以做得更好。

另一种选择是将地址定义为复合类型并将其嵌入到每个表中。你会发现很多客户端驱动程序不太喜欢复合类型,因此使用它会很笨拙。

真的,在这里坚持使用简单的关系方法。

答案 1 :(得分:2)

除了@ Craig关于技术优点的答案之外,还要考虑它的设计也不好:继承用于表示" is-a"关系。您的客户一个地址。

贵公司可能有也可能没有一个或多个地址。这是一个经典的" has-a"关系,这是外键的构建。

答案 2 :(得分:1)

如果的目的是复制表格布局,基本想法很好,但 inheritance 是一个误解。

从另一个表中 复制 表格架构的想法是合理的(如果你真的需要副本)。但是使用

CREATE TABLE new_table (LIKE template_table);

或者

CREATE TABLE new_table (LIKE template_table INCLUDING ALL);

这是不同的基本CREATE TABLE语句的内置功能。复制架构(带或不带选定的详细信息),但结果是独立的表。
最近相关答案的更多细节:

您还可以添加列,例如您的示例中的继承:

CREATE TABLE new_table (LIKE template_table INCLUDING ALL, name text);