Django的非关系数据库模式与postgres

时间:2016-09-01 14:26:56

标签: json django mongodb postgresql non-relational-database

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

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

Django的MongoDB ORM提供了Django字段以干净的方式执行此操作:

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

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

1 个答案:

答案 0 :(得分:0)

将数据对象嵌套在一起是一种非关系型数据库方法,不建议使用,这会导致关系数据库出现性能问题。

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

  1. 您对嵌套JSON数据的查询功能仅限于文本。
  2. 忘记对嵌套数据进行排序,聚合等。
  3. 当您需要嵌套数据时以及在发送回数据库进行保存之前,您必须处理序列化。
  4. 对嵌套模型进行更改将变得非常困难,因为您基本上绕过了关系数据库所具有的所有良好的完整性检查以及Django对类型等的良好检查。
  5. 查询会变慢,因为您不得不为查询的每个Foo检索每个嵌套对象,因为没有像Mongo那样限制嵌套对象数量的方法。
  6. 这里的建议是坚持使用一种数据库类型Relational或Non-relational,并在任何一种数据库上做好事。

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