【问题标题】:Django's MutiTable Vs. Abstract InheritanceDjango 的 MutiTable 与。抽象继承
【发布时间】:2017-04-09 11:00:31
【问题描述】:

虽然人们普遍认为多表继承从长远来看不是一个好主意(JacobianOthers),但我想知道在某些用例中是否由 django 创建的“额外连接”在查询可能是值得的。

我的问题是数据库中存在单一事实来源。比如说,对于使用身份号码和身份类型识别的人员对象。例如。 ID 号 222,输入护照。

class Person(models.Model):
    identity_number = models.CharField(max_length=20)
    identity_type = models.IntegerField()

class Student(Person):
    student_number = models.CharField(max_length=20)

class Employee(Person):
    employee_number = models.CharField(max_length=20)

在抽象继承中,人的任何子类模型,例如从 Person 抽象类继承的 Student、Parent、Supervisor、Employee 等将在各自的表中存储 identity_numberidentity_type

在多表继承中,由于它们都共享同一个表,我可以确定如果我在 Person 模型中的两个列上创建唯一约束,那么数据库中将不存在 重复项 .

在抽象继承中,为了避免数据库中的重复,必须在应用程序中构建额外的验证逻辑,因此也会稍微降低性能,这意味着它取消了 django 与具体继承相关的“额外连接” ?

【问题讨论】:

    标签: django inheritance django-models multiple-inheritance django-inheritance


    【解决方案1】:

    用面向对象的术语来考虑数据建模是一个错误。这是一个不适合关系数据库的抽象,因为它隐藏了一些非常重要的细节,这些细节会极大地影响性能(如文章中所指出的)或正确性(如您在上面所指出的那样)。

    您的示例的传统 SQL 方法将提供两种可能性:

    1. 有一个带有 ID 的 Person 表,然后是带有外键的 Student 等。
    2. 所有内容都有一个表格,并带有一些额外的字段来区分不同类型的人。

    现在,如果您的评估导致您更喜欢 1,您可能会注意到在 Django 中,这可以通过使用具体的继承模型来完成(与您上面描述的相同)。在这种情况下,如果您发现 Django 中生成的访问模式更优雅,请务必使用继承。

    所以我并不是说您不应该使用继承,我是说您应该只在从 SQL 角度对数据进行建模之后再查看它。如果您在上面的示例中这样做,您甚至不会考虑按照抽象继承模型的建议将所有内容拆分到单独的表中(这有您注意到的所有问题)。

    【讨论】:

    • 我喜欢这样的指针,即 OO 是一种不太适合关系数据库的抽象,因为它提醒我关注数据及其相关性。对于当前项目,我将使用选项一..
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2013-10-21
    • 2015-10-16
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多