【问题标题】:How to model an object oriented design in a database?如何在数据库中建模面向对象的设计?
【发布时间】:2015-01-29 09:34:39
【问题描述】:

假设我们有如下三个概念:

概念(属性1,属性2,..)

A (a, b, c, d)

B (a, b, c, d, e)

C (a, b, c, d, f)

在数据库中对这三个概念建模有三个选项:

1) 按原样建模

表 { column1, column2, ... }

A { id, a, b, c, d }

B { id, a, b, c, d, e }

C { id, a, b, c, d, f }

缺点:存在数据冗余。

2) 在一张表中建模

A { id, object_type, a, b, c, d, e, f }

缺点:有些字段对于某些概念仍然为空。

3) 使用表之间的关系

A { parent_id, a, b, c, d }

B { id, parent_id, e }

C { id, parent_id, f }

缺点:增加查询复杂性以连接表。

你会使用哪种方法?您还有其他解决方案吗?您认为第三种方法的性能较差吗?

【问题讨论】:

    标签: mysql database data-modeling object-oriented-analysis object-oriented-database


    【解决方案1】:

    显然,您的选项 1 是最糟糕的选择。这里的主要问题是您需要在A 中复制BC 的所有行,从而造成严重的维护问题。

    您的选项 2 称为 单表继承 模式,建议在子表没有 (m) 任何附加列的情况下使用。

    您的选项 3 称为 Joined Tables Inheritance 模式,其中子表(表示子类)通过它们的主键也是引用超表的外键连接到它们的超表.

    因此,对于您的抽象示例,选项 2 似乎是推荐的方法,因为您的表 BC 只有一列。

    请注意,根据 Joined Tables Inheritance 方法,不需要添加主键属性(就像您在 BC 中使用 id 所做的那样)。您只需使用与超表相同的主键,并使其也是引用超表的外键。因此,在这种方法中,架构将是

    A { id PK, 
        a, b, c, d 
    }
    B { id PK REFERENCES A, 
        e 
    }
    C { id PK REFERENCES A, 
        f 
    }
    

    您可以在我关于使用类层次结构开发前端 Web 应用程序的教程的 Subtyping and Inheritance with Database Tables 部分阅读更多相关信息。

    【讨论】:

    • 感谢您的帮助。如果 A { id, a, b, c, d, e, f, g } B { id, a, b, c, d, h, i, j, k } C { id, a, b, c, d, l, m, n, o } 你还认为第一个选项是最差的吗?
    • 在这个新示例中,您实际上并没有将 A 作为 B 和 C 的超表,因为 A 的属性 e、f、g 不与 B 和 C 共享。
    • 确实如此。但是您可以创建一个名为 Object { id, a, b, c, d } 的表,并为 A、B 和 C 使用 Joined Tables Inheritance。我想知道 Joined Table Inheritance 的效率更高和更好之间的权衡第一个选项的性能(我意识到这称为具体表继承)
    • 我认为“具体表继承”模式(这个名字是 Martin Fowler 的名字)只有在你有一个类层次结构(或多或少)只有叶类是具体类并且所有别人抽象。否则你会得到很多重复。
    【解决方案2】:

    Propel 开发人员说,选项 2“从 SQL 和查询性能的角度来看是最有效的实现,但仅限于少数继承字段”http://propelorm.org/Propel/documentation/09-inheritance.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 2019-09-20
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多