2

我在Postgresql中设计了一个数据库。我想知道使用继承有什么优点和缺点。在数据库中使用继承有什么优点和缺点

我也想了解以下内容:

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

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

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

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

  5. 它应该与合理使用来存储整个数据库中使用的通用的和重复的属性(如ID,姓名,时间戳等)对数据库性能

+0

你是指在你的表和应用程序代码中的对象之间的继承之间使用关系? – 2011-04-28 05:26:09

+0

@Satadru:PostgreSQL支持数据库中的[表继承](http://www.postgresql.org/docs/9.0/interactive/ddl-inherit.html)。 – 2011-04-28 05:29:11

+0

@mu很好的信息 – 2011-04-28 05:34:34

回答

2

效应(即 插入,更新,删除,索引等)?

没有太大的影响,因为其他技术达到相同的结果也会影响性能。

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

您的意思是重复的数据?

是否在Postgresql 数据库中常用?

不是我知道的,而是公平的,并不那么多。

如何比使用FK其他 好过易用性? 它的有用性应根据具体情况确定。我个人只用它来分区表。当其他事情变得困难时,易用性可能会造成欺骗。实例的约束不作为整体应用于父表和子表,但仅适用于它们在其上定义的表,因此唯一的约束可能无法达到您想要的效果。

它是否应合理使用习惯了,在整个 使用的数据库 店通用和重复 属性(如ID,姓名,时间 邮票等)

我不认为是个好主意。继承关系应该是有意义的,如果它只是用来为你节省一点工作,现在它只会让你和其他人感到困惑。

我个人并没有使用表继承,除非它解决了一个真正的问题。在关系模型中还有其他一些方法可以将类层次结构映射到对许多用例来说效果更好或同样出色的表格。

+0

我不得不同意你的看法,它会混淆其他用户以及其他框架(特别是Django)。 – Tahir 2011-04-28 14:06:37

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,分别定义索引FKs &。

这样做的不足之处在于,您无法在所有没有联合的表上执行name查询。如果你正在尝试做类继承,这可能是一个要求。

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

0

具有取入的片教程亩的简要回顾一下后指向,

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

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

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

大概没有。看起来更像是内部实现将基于诸如ROWID()之类的东西。如果我不得不实施这样的功能,我会这么做,我怀疑任何DBMS工程师会有不同的想法。

“除了易用性之外,它怎么比使用FK更好?”

我会远离它,并使用“正确”的设计与FKs。 “易用性”可能是这种继承技术的一种质量,只有在表面上看,它才存在。我预计会有许多令人不愉快的惊喜潜伏在表面之下,比如本教程末尾记录的少数意外。就我所知,关键声明仍然允许重复行的那个对我来说只是一个杀手。我的意思是,允许重复的键,你能得到多么疯狂?

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

“应该说,它是在使用的理由......”

如果键的独特性不再声明,我不知道的唯一的事情是所有的原因已经一去不复返了。

相关问题