虽然人们普遍认为多表继承从长远来看并不是一个好主意(Jacobian,Others),但我想知道在某些用例中是否有&#34 ;额外加入"在查询期间由django创建可能是值得的。
我的问题是在数据库中拥有单一的真相来源。比如说,对于使用身份号码和身份类型识别的人物对象。例如。 ID号222,类型护照。
identity_number
在抽象继承中,人的任何子类模型,例如继承自Person Abstract Class的学生,家长,主管,员工等将拥有identity_type
& {{1}}存储在各自的表格中
在多表继承中,由于它们都共享同一个表,我可以肯定,如果我在Person Model中的两个列上创建一个唯一约束,那么数据库中不会存在重复
在抽象继承中,为了防止数据库中的重复,必须在应用程序中构建额外的验证逻辑,因此也会略微降低性能,这意味着它会取消额外的连接" django与具体的继承有关吗?
答案 0 :(得分:2)
根据面向对象的术语来思考数据建模是一个错误。它是一种适用于关系数据库的抽象,它隐藏了一些非常重要的细节,这些细节可以大大影响性能(如文章中所指出的)或正确性(如上所述)。
您的示例的传统SQL方法将提供两种可能性:
Person
表,然后使用外键返回Student
等。现在,如果你的评价让你更喜欢1,你可能会注意到在Django中这可以通过使用具体的继承模型来实现(它与你上面描述的相同)。在这种情况下,如果您在Django中找到更优雅的访问模式,请务必使用继承。
所以我并不是说你不应该使用继承,我只是说你应该只在你对数据进行建模后再看一下SQL透视图。如果您在上面的示例中执行了此操作,您甚至不会考虑将所有内容拆分为单独的表 - 其中包含您注意到的所有问题 - 如抽象继承模型所示。