Django - 如何规范化数据库?

时间:2014-04-15 20:02:45

标签: python django database-design django-models django-views

我一直在问人们应该如何组织我的模型,他们一直告诉我要规范化数据库。

有人能给我看一个标准化Django模型的例子吗?

1 个答案:

答案 0 :(得分:5)

规范化不是Django甚至Python概念 - 它是设计关系数据库模式的更广泛方法,可以删除重复并消除冗余。

在django中,这意味着您可能拥有多个较小的模型而不是一个模型,这些模型通过ForeignKey提供的ManyToManyModel API字段表示数据库表之间的关系。

因此,使用django docs设计的一个例子,假设我们为一家报纸公司工作,我们希望跟踪每位记者和他们发布的文章。您可以先设计一个这样的模型

class Newspaper(models.Model):
    reporter = models.CharField(max_length=30)
    email = models.EmailField()
    headline = models.CharField(max_length=100)

如果我们填充此模型,我们将在记者发布多篇文章后立即获得冗余,因为我们将复制电子邮件信息,将相同的电子邮件地址存储在多行中。这是一个问题,因为将来如果我们想要更新记者电子邮件地址,我们可能会错过行并破坏我们的数据。

因此我们可以开始对此进行改进,并开始通过定义两个单独的表来规范化我们的模型,这些表使用ForeignKey字段来映射多对一关系(也就是说,记者可以发布许多文章,但一篇文章只有一名记者。)

class Reporter(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()

class Article(models.Model):
    headline = models.CharField(max_length=100)
    reporter = models.ForeignKey(Reporter)

现在我们不会复制记者电子邮件地址,因为我们可以将此ONCE存储在Reporter表中,以便将来更容易更新此值。

现在这是一个有点人为的答案,我相信你可以进一步改进这个设计,但希望它能证明这一点。我真的建议您阅读django docs which talk about the modeling of relationshipsvarious degrees of normalisation