我的Django项目使用postgresql 9.4,它支持JSON字段。我想使用这些字段从关系模式切换到(部分)非关系模式。
假设我有模型Foo
和Bar
,每个对象Bar
只属于一个Foo
。目前,我使用从Bar
到Foo
的ForeignKey来对此建模,但我想切换到将Bar
对象直接存储在Foo
中作为模型实例列表。使用postgresql,我可以在Foo
中使用JSONField
,它将存储Bar
对象的JSON表示列表,但随后我将不得不手动处理序列化到JSON。
MongoDB的ORM为Django提供了Django字段,以一种干净的方式完成:
class Foo(models.Model):
bar_list = ListField(EmbeddedModelField('Bar'))
是否有一种方法与postgres后端具有类似的功能?
相互嵌套数据对象是一种非常非关系数据库的方法,不推荐使用,并且会导致关系数据库中的性能问题。
如果你在postgres中尝试这样做,你会遇到一些问题:
- 对嵌套JSON数据的查询能力将仅限于文本。
- 忘记对嵌套数据的排序、聚合等。
- 当你需要嵌套数据时,在你发送回数据库保存之前,你必须处理序列化。
- 修改嵌套模型会让python负担很大,因为你基本上绕过了关系数据库的完整性检查,以及Django对类型等的检查。
- 查询将变得更慢,因为你将不得不为每个Foo查询检索每个嵌套对象,因为没有办法限制嵌套对象的数量,就像你可以在Mongo中一样。
这里的建议是坚持使用一种数据库类型:关系型或非关系型,并在这两种数据库类型中选择适合的。
如果你需要Postgres使用外键,如果你使用Mongo使用嵌套对象