带有 postgres 的 Django 的非关系数据库模式

Posted

技术标签:

【中文标题】带有 postgres 的 Django 的非关系数据库模式【英文标题】:Non-relational database schema for Django with postgres 【发布时间】:2017-01-09 11:58:03 【问题描述】:

我的 Django 项目使用支持 JSON 字段的 postgresql 9.4。我想使用这些字段从关系模式切换到(部分)非关系模式。

假设我有模型FooBar,每个对象Bar 恰好属于一个Foo。目前,我使用从BarFoo 的ForeignKey 对此进行建模,但我想切换到将Bar 对象直接存储在Foo 中作为模型实例列表。使用 postgresql,我可以在 Foo 中使用 JSONField 来存储 Bar 对象的 JSON 表示列表,但是我必须手动处理序列化为 JSON。

用于 Django 的 MongoDB ORM 提供了 Django 字段以简洁的方式执行此操作:

class Foo(models.Model):
    bar_list = ListField(EmbeddedModelField('Bar'))

有没有办法在 postgres 后端提供类似的功能?

【问题讨论】:

【参考方案1】:

将数据对象相互嵌套是一种非常非关系型数据库的方法,不推荐使用,这会导致关系型数据库出现性能问题。

如果你在 postgres 中尝试这个,你会遇到一些问题:

    您对嵌套 JSON 数据的查询能力将仅限于文本。 忘记对嵌套数据进行排序、聚合等操作。 当您需要嵌套数据并发送回数据库进行保存之前,您必须处理序列化。 对嵌套模型进行更改将变得非常繁重,因为您基本上绕过了关系数据库具有的所有良好完整性检查以及 Django 对类型等进行的良好检查。 查询会变慢,因为您必须为查询的每个 Foo 检索每个嵌套对象,因为无法像在 Mongo 中那样限制嵌套对象的数量。

这里的建议是坚持使用关系型或非关系型数据库类型中的一种,并在其中一种上都行之有效。

如果你需要 Postgres 使用外键,如果你使用 Mongo 使用嵌套对象。

【讨论】:

谢谢,但我已经使用数据几年了,我知道我在上面运行的查询,我很确定我需要这种重构来加快速度(1. I不要查询嵌套对象 2.我不需要这个 3.这应该由 ORM 处理 4.对这些模型的更改已经是 python 重 5.嵌套对象很少,Bar 对象的平均数量在 Foo 中接近一)。 我看到你用错了方法。我不是在质疑你对数据的了解,我只是在告诉你我以前的经历以及这种方法的缺点。由于您绝对需要这个,您也许可以使用自 Django 1.9 以来可用的 JSONField。它接收一个 Python 对象并将其保存为 JSON,当检索到它时再次解析为 Python。 是的,这也是我在问题中提到的,我只是想知道是否存在更高级别的版本。显然没有,所以这就回答了这个问题。 :-)

以上是关于带有 postgres 的 Django 的非关系数据库模式的主要内容,如果未能解决你的问题,请参考以下文章

你要的Django, Python, MySQL和Postgres各版本关系对应图来了!

你要的Django, Python, MySQL和Postgres各版本关系对应图来了!

Django - 无法使用两个数据库进行测试(带有 gis 扩展的 postgres 和 mongoDB (Djongo)

如何在 JSONField 中使用 Postgres 在 Django 中搜索带有空格的键?

Django Postgres ArrayField 与一对多关系

Django Postgres 完整性错误