我一直在问人们应该如何组织我的模型,他们一直告诉我要规范化数据库。
有人能给我看一个标准化Django模型的例子吗?
答案 0 :(得分:5)
规范化不是Django甚至Python概念 - 它是设计关系数据库模式的更广泛方法,可以删除重复并消除冗余。
在django中,这意味着您可能拥有多个较小的模型而不是一个模型,这些模型通过ForeignKey
提供的ManyToMany
和Model 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 relationships和various degrees of normalisation。