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