【问题标题】:Django - how to normalize database?Django - 如何规范化数据库?
【发布时间】:2014-05-30 09:03:15
【问题描述】:

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

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

【问题讨论】:

  • 查看this。数据库规范化是组织关系数据库的一种基本方式。它不是特定于 Django 的。 This page 还包含一些很好的示例,如果您单击“将数据库置于第一范式”之类的链接。
  • 对,Alex,我明白这一点,我只是想了解它是如何在 Django 中完成的。一个例子会有很长的路要走。
  • 您可以尝试查看官方 Django 教程here。如果您查看 polls/models.py 文件,它有一个模型(问题)和一些属性(question_text、pub_date)。然后它有另一个具有其他属性的模型(选择),包括问题模型的外键。这意味着每个选项“属于”一个问题且仅属于一个问题。您可以稍后进行问题查询,该查询将返回该问题的所有可能选项。
  • 我还将链接您尝试规范化的模型,这可能会导致您正在寻找的示例。
  • 首先,您需要阅读范式:en.wikipedia.org/wiki/Database_normalization#Normal_forms 了解为什么需要进行范式化。

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


【解决方案1】:

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

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

因此,使用来自 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2012-10-08
    • 2012-06-21
    相关资源
    最近更新 更多