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