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

Sql 仅将表用于多重继承是一种不好的做法吗?,sql,postgresql,inheritance,postgresql-9.2,postgresql-8.4,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 ); 然后在使用这些字段的每个表中

为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);
其思想是在表创建过程中应用类似的内容


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

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

使用传统的关系模型,通过对地址ID的外键引用,可以更好地实现这一点

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


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

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

使用传统的关系模型,通过对地址ID的外键引用,可以更好地实现这一点

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


<> P.>这里坚持简单的关系方法。

< P>除了克雷格对技术优点的回答之外,还认为这也是一个糟糕的设计:继承被用来表示IS-A关系。您的客户不是一个地址


您的公司可能有一个或多个地址,也可能没有。这是一个经典的HAS-A关系,这是外键的构建。

< P>除了克雷格的技术优点的回答之外,还认为这也是一个糟糕的设计:继承被用来表示IS-A关系。您的客户不是一个地址

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

如果目的是复制表布局,基本思想是好的,但这是一个误解

如果您确实需要复制,那么从另一个表复制表模式的想法是合理的。但是使用

CREATE TABLE new_table (LIKE template_table);

这是basic语句的一个不同的内置特性。复制包含或不包含选定详细信息的架构,但结果是一个独立的表。 在最近的相关回答中有更多详细信息:

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

CREATE TABLE new_table (LIKE template_table INCLUDING ALL, name text);
如果意图是复制表格布局,基本想法是可以的,但这是一种误解

如果您确实需要复制,那么从另一个表复制表模式的想法是合理的。但是使用

CREATE TABLE new_table (LIKE template_table);

这是basic语句的一个不同的内置特性。复制包含或不包含选定详细信息的架构,但结果是一个独立的表。 在最近的相关回答中有更多详细信息:

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

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

我会很好地避开这一点;你可能会有很多问题,包括如果你有一个客户也为公司工作。如果你不太小心的话,可能会引起一些碰撞@jbutler483,在这种情况下没有问题,PostgreSQL可以轻松处理这种情况,我会很好地避免这种情况;你可能会有很多问题,包括如果你有一个客户也为公司工作。如果你不太小心的话,可能会引起一些碰撞@jbutler483,在这种情况下不存在问题,PostgreSQL可以轻松处理这种情况,感谢您的解释!我会听从你的建议。我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗。谢谢你的解释!我会听从你的建议。我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗。很好的附加评论,谢谢!我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗。很好的附加评论,谢谢!我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗。很高兴再次见到你,欧文!谢谢你的建议!我的意图是在地址结构中进行更改时传播这些更改。但是地址似乎会变大,这会严重影响性能。你同意吗?@MarcioSimao:哦,如果这是你的意图,那就走吧
然后添加外键,就像克雷格已经建议的那样。继承将是一个错误的工具。我将使用规范化,谢谢!我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗@MarcioSimao:基本上,在你处理继承之前,要仔细研究这个问题。如果你在那里什么也没找到,那就试试看。很高兴再次见到你,欧文!谢谢你的建议!我的意图是在地址结构中进行更改时传播这些更改。但是地址似乎会变大,这会严重影响性能。你同意吗?@MarcioSimao:哦,如果这是你的意图,那就按照克雷格的建议,使用外键并添加外键。继承将是一个错误的工具。我将使用规范化,谢谢!我正在使用另一种技术,我不确定这是否是一种好的做法,还有另一个问题,你能看看它并告诉我你的想法吗@MarcioSimao:基本上,在你处理继承之前,要仔细研究这个问题。如果你在那里找不到任何东西,试试看。