只将一个表用于多重继承是不是一种糟糕的做法



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

这个想法是在表的创建过程中应用类似于单一责任原则的东西。

我的一个主要问题是,表address是否会导致性能的显著损失,因为它每次都会变大。

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

通过对地址ID的外键引用,使用传统的关系模型会更好地做到这一点。

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

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

除了@Craig关于技术优点的回答外,还应该考虑一下这也是一个糟糕的设计:继承被用来表示"is-a"关系。您的客户不是地址。

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

如果的意图是复制表布局,基本想法是好的,但继承是一种误解。

从另一个表复制 表模式的想法是合理的(如果您真的需要副本)。但是使用

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);

最新更新