Django的MutiTable与抽象继承

时间:2016-11-25 05:28:04

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

虽然人们普遍认为多表继承从长远来看并不是一个好主意(JacobianOthers),但我想知道在某些用例中是否有&#34 ;额外加入"在查询期间由django创建可能是值得的。

我的问题是在数据库中拥有单一的真相来源。比如说,对于使用身份号码和身份类型识别的人物对象。例如。 ID号222,类型护照。

identity_number

在抽象继承中,人的任何子类模型,例如继承自Person Abstract Class的学生,家长,主管,员工等将拥有identity_type& {{1}}存储在各自的表格中

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

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

1 个答案:

答案 0 :(得分:2)

根据面向对象的术语来思考数据建模是一个错误。它是一种适用于关系数据库的抽象,它隐藏了一些非常重要的细节,这些细节可以大大影响性能(如文章中所指出的)或正确性(如上所述)。

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

  1. 使用带有ID的Person表,然后使用外键返回Student等。
  2. 拥有一张包含所有内容的表格,还有一些其他字段可以区分不同类型的人。
  3. 现在,如果你的评价让你更喜欢1,你可能会注意到在Django中这可以通过使用具体的继承模型来实现(它与你上面描述的相同)。在这种情况下,如果您在Django中找到更优雅的访问模式,请务必使用继承。

    所以我并不是说你不应该使用继承,我只是说你应该只在你对数据进行建模后再看一下SQL透视图。如果您在上面的示例中执行了此操作,您甚至不会考虑将所有内容拆分为单独的表 - 其中包含您注意到的所有问题 - 如抽象继承模型所示。