我正在开发一个基于 Django 的测验网站,并希望在测验模型中使用 JSONField 以类似于 MongoDB 等 NoSQL 数据库的方式存储问题。我的计划是将问题作为 JSON 数据直接存储在测验模型中(例如,
questions=models.JSONField())
)。虽然这简化了结构并避免了连接,但我担心它在查询和过滤功能方面的表现。采用这种方法,什么在 Django 中使用 JSONField 处理大型数据集有什么优点和缺点?如何优化性能和可扩展性?如果有任何管理此类结构的建议或最佳实践,我们将不胜感激!
[我]想在 Quiz 模型中使用 JSONField 以类似于 MongoDB 等 NoSQL 数据库的方式存储问题。
将数据存储在关系数据库中的 JSON blob 中通常不是一个好主意,除非 JSON blob 是“原子的”。换句话说,如果你不想过滤、聚合、更新、检索等parts数据。但这里的情况并非如此,因此(非常)可能不是一个好主意。
这意味着每次获取Quiz
时,它都会获取整个 JSON blob,从而导致数据库产生大量响应,从而降低系统响应速度。将数据保存在多个表中通常会导致检索、聚合、过滤等所需的数据量减少。
虽然这简化了结构并避免了连接JOIN 通常也不是什么大问题。如果有适当的索引,并且
ForeignKey
表示索引,则 JOINing 会非常有效地完成。更严重的问题是没有过滤连接在一起的关系,从而再次导致数据库产生(无用的)大量响应。使用 JSON blob 还意味着您对 JSON blob 的结构没有任何保证:可以定义像
Quiz
这样的
{"title": "My fancy quiz", questions: {"question": "What was the shortest light pulse ever produced?", "answer": "Just 43 attoseconds."}}
,但可以将
[0, 1, 1, 8, 9, 9, 9, 8, 8, 1, 9, 9, 9, 1, 1, 9, 7, 2, 5, 3]
作为数据转储到记录中。关系数据库旨在对数据强制执行某种结构,从而不会输入无意义的数据。
Djongo [GitHub] 是一个本质上为 Django 进行 MongoDb 绑定的包,尽管结果好坏参半。虽然 Django 本身并不需要关系数据库,但它是专门针对关系数据库量身定制的,其中模型解释了此类列的外观。
如今的关系数据库确实经常提供 JSON 和/或 JSONB 字段,甚至可以执行查找、过滤和聚合。但这些工具通常仍然不能非常有效地发挥作用。不仅在性能方面,而且在便利性方面:JSON blob 中的查找必须是某种类型,因此需要大量转换、额外的语法来在 JSON blob 中移动等。以这种方式使用它可能不是一个好主意,仅仅是因为像 PostgreSQL 这样的数据库(一开始)并不是设计成以这种方式工作的,尽管他们确实投入了大量的精力来改进它,但它仍然会关系型数据库要以类似NoSQL的方式使用需要付出很大的努力。