在数据库中使用继承有哪些优缺点

时间:2011-04-28 00:59:41

标签: database database-design postgresql inheritance relational-database

我正在Postgresql中设计一个数据库。我想知道使用继承的优点和缺点。

我还想了解以下内容:

  1. 对数据库性能的影响(即插入,更新,删除,索引等)?

  2. 父/子是否意味着重复输入[内部]?

  3. 它是否在Postgresql数据库中常用?

  4. 除了易用性之外,它比使用FK更好吗?

  5. 是否应该合理地使用它来存储整个数据库中使用的通用和重复属性(例如id,名称,时间戳等)

3 个答案:

答案 0 :(得分:2)

  

对数据库性能的影响(即   插入,更新,删除,索引等)?

受影响不大,因为达到相同结果的其他技术也会对性能产生影响。

  

父/子是否意味着重复   输入[内部]?

你的意思是重复的数据?否。

  

它是否在Postgresql中常用   数据库?

不是我所知道的,但公平地说并没有那么多。

  

如何比使用其他FK更好   比易用性?   它的实用性应根据具体情况确定。就个人而言,我只用它来分区表。当它使其他事情变得困难时,它的易用性可能是欺骗性的。例如,约束不作为整体应用于父表和子表,而仅适用于它们所定义的表,因此唯一约束可能无法执行您想要的操作。

     

是否应该合理使用   存储通用和重复   整个过程中使用的属性   数据库(例如id,name,time   邮票等)

我认为这不是一个好主意。如果继承关系仅用于为您节省一些工作,那么继承关系应该是有意义的,它现在只会让您和其他人混淆。

我个人不使用表继承,除非它解决了一个真正的问题。在关系模型中还有其他方法可以将类层次结构映射到对于许多用例更好或更好地工作的表。

答案 1 :(得分:1)

我已成功使用表继承,但仅用于许多表所需的公共属性,而不是“类”继承。

这样的事情:

CREATE TABLE base (
  uuid UUID NOT NULL DEFAULT uuid_generate_v4(),
  name VARCHAR(320) NOT NULL,
  updated_by UUID NOT NULL DEFAULT uuid_nil(),
  updated TIMESTAMP NOT NULL DEFAULT current_timestamp
);

CREATE TABLE child (
  childata TEXT NOT NULL DEFAULT '',
)
INHERITS (base);

我使用base来保存许多表所需的数据。请注意,我实际上并没有将任何放在基表中(通过撤消所有权限强制执行)。每个子表都存储自己的uuid,名称等。这种方法实际上只是保存了复制/粘贴。由于每个儿童桌仍然需要PK,FK和索引单独定义。

这样做的缺点是,如果没有工会,您无法通过name对所有表进行查询。如果您正在尝试进行类继承,则可能需要这样做。

具有员工子类的人可能更好地建模为具有公共数据的人员表和具有与人员1对1链接的“子类”数据的员工表。这应该表现得很好,因为你将加入PK。搜索将查询人员表,然后您可以为员工数据执行外部联接(使用NULL来暗示人员与员工)。

答案 2 :(得分:1)

简要介绍一下mu指出的那篇教程后,

"对数据库性能的影响(即插入,更新,删除,索引等)?"

性能考虑可能是构造发明的原因。

"父/子是否意味着重复输入[内部]?"

据推测不是。看起来更像内部实现将基于ROWID()之类的东西。如果我必须实现这样的功能,我会这样做,我怀疑任何DBMS工程师会有不同的想法。

"除了易用性之外,它如何比使用FK更好?"

我会远离它并使用"正确的"用FK设计。 "易于使用"可能是这种继承技术的质量,只有当你从表面上看它时才存在。我希望潜伏在表面下的许多令人不快的惊喜,例如本教程末尾记录的少数惊喜。关于仍然允许重复行的关键声明,据我所知,对我来说只是一个杀手。我的意思是,允许重复的键,你有多疯狂?

我远离这一点的另一个原因是我不确定这是否是标准SQL。

"是否应该合理使用......"

如果键不再是唯一性的声明,我唯一能想到的就是所有原因都消失了。