【发布时间】:2014-05-28 12:18:59
【问题描述】:
假设我有一个实体 Alpha 和其他两个实体 A1 和 A2,它们都继承自 Alpha。某些约束迫使我将两个表合并为一个。但我觉得这不是一个非常好的(甚至是糟糕的)想法(我什至在考虑反模式)。问题是除了表格可能最终拥有的巨大尺寸(许多列)之外,我没有看到任何其他明显的问题。有人能指出来吗?
【问题讨论】:
标签: inheritance database-design anti-patterns
假设我有一个实体 Alpha 和其他两个实体 A1 和 A2,它们都继承自 Alpha。某些约束迫使我将两个表合并为一个。但我觉得这不是一个非常好的(甚至是糟糕的)想法(我什至在考虑反模式)。问题是除了表格可能最终拥有的巨大尺寸(许多列)之外,我没有看到任何其他明显的问题。有人能指出来吗?
【问题讨论】:
标签: inheritance database-design anti-patterns
这是一种常见的情况,可以通过各种方式放入表格中。以Alpha、A1、A2为实体类型,最直接的就是:
A1(a,....) fk references Alpha // a is of type A1 and ...
A2(a,....) fk references Alpha // a is of type A2 and ...
Alpha(a,...) // a is of type Alpha and ....
(可能存在约束检查 A1(p,...) 意味着不是 A2(p,...) 和/或 A2(p,...) 意味着不是 A1(p,...)。)
Alpha 是 A1 或 A2 或其他类型的事物的类型。 (“从 Alpha 继承”并没有说明这一点。)表 A1 和 A2 都有各自独有的列; Alpha,共享列。
主题是带有表格的子类型和超类型。阅读它。
编辑
空值的问题在于,任何时候您想查询上述三种类型的实体时,无论如何都必须提取这些表,除非在查询表达式的叶子附近删除空值,否则它们很快会导致难以管理的复杂和不直观查询意义。见this example of how nulls complicate table meanings。
【讨论】:
如果 A1 有 A2 没有的列,反之亦然(这似乎很可能),您的表中最终会出现大量 NULL。
不过,最重要的是,在我看来,A1 和 A2 是 逻辑上不同的类型(即使它们有共同的 Alpha 部分),所以它们应该位于不同的表中。
最好创建一个将表合并为一个的视图,同时保持它们在逻辑上分开。
【讨论】: