Django - 如何规范化数据库?
我一直在问大家我应该怎么组织我的模型,他们总是告诉我要对数据库进行规范化。
有没有人能给我举个例子,说明一个规范化的Django模型是怎样的?
1 个回答
17
规范化并不是Django或Python特有的概念,它是一种更广泛的方法,用于设计关系型数据库的结构,目的是消除重复和冗余。
在Django中,这意味着我们可能不会只使用一个模型,而是会有多个较小的模型,这些模型通过ForeignKey
和ManyToMany
字段来表示数据库表之间的关系,这些字段是由模型API提供的。
举个例子,假设我们在一家报社工作,想要记录每位记者及其发表的文章。我们可能会首先设计一个这样的模型:
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)
现在我们就不会重复存储记者的电子邮件地址,因为我们可以在记者表中只存储一次,这样将来更新这个值会更方便。
这只是一个比较简单的例子,我相信你可以进一步改进这个设计,但希望它能说明问题。我真的建议你阅读Django文档中关于关系建模的部分以及各种规范化的程度。