【问题标题】:Database design and normalization in djangodjango中的数据库设计和规范化
【发布时间】:2021-09-22 06:00:40
【问题描述】:

我有一个网络表格,学生可以在其中输入他们的信息和成绩,例如

  • 姓名
  • 年龄
  • 数学成绩
  • 西班牙级
  • 化学级

这将转换为如下所示的 POST 请求:

POST /grades
{
 "name": "Bob",
 "age": 17,
 "math_grade": "A",
 "spanish_grade": "B",
 "chemistry_grade": "C",
}

最后,这将通过 django ORM 存储在 SQL 表 grades 中,如下所示:

Name Age Subject Grade
Bob 17 Math A
Bob 17 Spanish B
Bob 17 Chemistry C

到这里为止一切顺利。


当我读到不同的范式(1NF、2NF、3NF)时,上表似乎应该是两个表(studentgrades)甚至可能是三个(student、@987654327 @DIMENSION 表,gradesFACT 表)。

第一季度。如果grades 表真的应该被拆分,我应该在 django ORM 一次对多个表执行 SQL 查询的应用程序级别执行此操作,还是我在这里进行预优化?我是否应该将规范化作为我的数据仓库策略的一部分并保持应用程序表原样?

第二季度。如果我想以如下嵌套格式返回 Bob 的成绩,我将如何在 django 中执行此操作。

GET /grades/Bob
{
  "name": "Bob",
  "age": 17,
  "grades": {
     "math": "A",
     "spanish": "B",
     "chemistry": "C",
   }
}

这些看起来似乎很明显的问题,不确定我是否/错过了什么。谢谢!

【问题讨论】:

    标签: python django database


    【解决方案1】:

    维度和事实是分析 (OLAP) 系统中使用的表类型,很少采用标准化形式。

    如果您正在考虑创建事务 (OLTP) 系统,那么它通常采用 3NF 格式。如果您显示的数据确实是您拥有的所有信息,那么 2 个表格将是最佳设计:学生和学科/年级。

    在现实世界中,您可能拥有更多关于某个学科的信息(级别、持续时间等),因此您将有一个学生表、一个学科表和一个包含成绩、授予日期等的交叉表。

    【讨论】: