基于postgres的非关系数据库模式



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

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

MongoDB的ORM为Django提供了Django字段,以一种干净的方式完成:

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

是否有一种方法与postgres后端具有类似的功能?

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

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

  1. 对嵌套JSON数据的查询能力将仅限于文本。
  2. 忘记对嵌套数据的排序、聚合等。
  3. 当你需要嵌套数据时,在你发送回数据库保存之前,你必须处理序列化。
  4. 修改嵌套模型会让python负担很大,因为你基本上绕过了关系数据库的完整性检查,以及Django对类型等的检查。
  5. 查询将变得更慢,因为你将不得不为每个Foo查询检索每个嵌套对象,因为没有办法限制嵌套对象的数量,就像你可以在Mongo中一样。

这里的建议是坚持使用一种数据库类型:关系型或非关系型,并在这两种数据库类型中选择适合的。

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

最新更新