对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
是否会导致表现有意义的损失,因为它会逐渐变大。
答案 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);