虽然大多数人普遍认为长期使用多表继承并不是一个很好的想法(Jacobian, Others),但我想知道在某些用例中,django在查询过程中创建的“额外连接”是否值得。我的问题是在数据库中拥有唯一的真实来源。例如,对于使用身份证号和身份类型进行身份识别的个人对象。例如,ID号码222,类型护照。
在抽象继承中,任何一个人的子类模型(例如学生、家长、监管者、雇员等)从Person Abstract Class继承,将在它们各自的表中存储identity_number和identity_type。
在多表继承中,由于它们共享同一张表,我可以确定如果在Person Model上创建两个列的唯一约束,则数据库中不会存在重复项。
在抽象继承中,为了避免数据库中出现重复项,必须在应用程序中构建额外的验证逻辑,这也会略微降低性能,从而取消Django在具体继承中必须进行的“额外连接”。
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 Abstract Class继承,将在它们各自的表中存储identity_number和identity_type。
在多表继承中,由于它们共享同一张表,我可以确定如果在Person Model上创建两个列的唯一约束,则数据库中不会存在重复项。
在抽象继承中,为了避免数据库中出现重复项,必须在应用程序中构建额外的验证逻辑,这也会略微降低性能,从而取消Django在具体继承中必须进行的“额外连接”。