Django - 重复ForeignKey与多层次关系

时间:2016-03-16 18:03:53

标签: python django foreign-keys foreign-key-relationship

假设下面(简化)数据库架构:

class Site(models.Model):
    ...

class Business(models.Model):
    site = models.ForeignKey(Site)

class Subscription(models.Model):
    business = models.ForeignKey(Business)

class Invoice(models.Model):
    subscription = models.ForeignKey(Subscription)

最好在每个与网站相关的模型中包含site = models.ForeignKey(Site)字段(以上所有内容),然后就是:

invoice = Invoice.objects.get(id=1)
invoice_site = invoice.site

或使用这样的多级关系:

invoice = Invoice.objects.get(id=1)
invoice_site = invoice.subscription.business.site

我在我的代码的许多地方都有这样的情况,并且总是想知道哪个选项更好。首先是更清洁,不要破坏“干”规则并防止不一致,但另一个允许通过防止复杂的数据库连接来获得性能和优化改进。

当然,我认为该网站在上述模型中始终保持一致,因此不可能将Business与网站A和Invoice与网站B保持一致。

1 个答案:

答案 0 :(得分:1)

嗯,关系数据库设计不适用于DRY,而是所有关系。您需要从逻辑上思考应用程序的关系结构应该是什么。

我当然不能说话,因为我不能100%理解这个要求,但我几乎可以肯定site不应该直接与Invoice相关联。 Invoice与您的业务订阅相关,不应依赖/知道业务发生在哪个站点。 Subscription模型也是如此。如果site中有Invoice,则最简单的问题是您正在重复关系,如果还没有Invoicesite就不会存在。

我建议您查看一些关系数据库设计的基础知识,并更好地理解normalization的概念。它可以帮助您设计更好的架构,而不会给关系带来麻烦。