【问题标题】:Django - repeat ForeignKey vs. multi-level relationshipDjango - 重复 ForeignKey 与多级关系
【发布时间】:2016-03-17 02:18:18
【问题描述】:

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

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

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

当然,我假设站点在上述模型中始终是一致的,因此不可能有 Business 与站点 A 和 Invoice 与站点 B。

【问题讨论】:

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


    【解决方案1】:

    嗯,关系数据库设计没有DRY 的位置,它都是关于关系的。您需要从逻辑上思考您的应用程序的关系结构应该是什么。

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

    我建议您查看一些关系数据库设计的基础知识,并更好地理解normalization 的概念。它将帮助您设计更好的模式,而不会造成关系问题。

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 2012-09-29
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2015-03-19
      • 2020-04-25
      相关资源
      最近更新 更多