【问题标题】:Is merging two tables that inherit from the same class a bad idea?合并从同一类继承的两个表是一个坏主意吗?
【发布时间】:2014-05-28 12:18:59
【问题描述】:

假设我有一个实体 Alpha 和其他两个实体 A1 和 A2,它们都继承自 Alpha。某些约束迫使我将两个表合并为一个。但我觉得这不是一个非常好的(甚至是糟糕的)想法(我什至在考虑反模式)。问题是除了表格可能最终拥有的巨大尺寸(许多列)之外,我没有看到任何其他明显的问题。有人能指出来吗?

【问题讨论】:

    标签: inheritance database-design anti-patterns


    【解决方案1】:

    这是一种常见的情况,可以通过各种方式放入表格中。以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

    【讨论】:

      【解决方案2】:

      如果 A1 有 A2 没有的列,反之亦然(这似乎很可能),您的表中最终会出现大量 NULL。

      不过,最重要的是,在我看来,A1 和 A2 是 逻辑上不同的类型(即使它们有共同的 Alpha 部分),所以它们应该位于不同的表中。

      最好创建一个将表合并为一个的视图,同时保持它们在逻辑上分开。

      【讨论】:

      • 好的,这是唯一的问题(很多 NULL)还是有其他问题?
      • 我认为在一个表中包含两种类型将是更大的问题,即使目前还不清楚这会如何导致具体问题。在不了解您的类型的任何细节的情况下,我很难提出任何具体问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多