Django 和 postgres - 在模型字段中将数据存储为 json 的缺点

Posted

技术标签:

【中文标题】Django 和 postgres - 在模型字段中将数据存储为 json 的缺点【英文标题】:Django & postgres - drawbacks of storing data as json in model fields 【发布时间】:2014-03-21 09:52:35 【问题描述】:

我有时使用TextField 将结构可能经常变化(或非常复杂的数据)的数据存储到模型实例中,而不是使用关系范式对所有内容进行建模。

我可以使用更多的模型、外键等来实现相同的目标,但有时直接存储 JSON 感觉更直接。

我仍然没有深入研究 postgres JSON 类型(如果我理解得很好的话,这对于读取查询尤其有用)。目前我每次想要访问此类数据时都会执行一些json.dumpsjson.loads

与对所有事物都使用模型相比,我想知道(理论上)这样做(使用 JSON 类型而不是不使用 JSON 类型)的性能和缓存缺点是什么。

对此有更多了解可以帮助我以后进行一些巧妙的比较和分析,以提高整体性能。

【问题讨论】:

听起来你应该试试 mongodb @Alvaro Mongodb 是网络规模。 youtube.com/watch?v=b2F-DItXtZs 【参考方案1】:

将数据存储为json(无论是在text-typed 字段中,还是在PostgreSQL 的本机jsontype 中)是一种非规范化形式。

与大多数非规范化一样,在处理非常难以建模的数据时,或者在将完全规范化的数据存储到实体中存在严重的性能挑战时,它可能是一个合适的选择。

PostgreSQL 通过支持对数据库中json 值的一些操作来减少数据非规范化导致的一些问题的影响——您可以迭代json 数组或键/值对,加入json 字段的结果提取等。大部分有用的东西是在 9.3 中添加的;在 9.2 中,json 支持只是一种验证数据类型。在 9.4 中,将添加更强大的 json 功能,包括对 json 值索引的一些支持。

对于您的问题,没有一刀切的简单答案,而且您还没有真正表征您的数据或工作负载。与大多数数据库挑战一样,“这取决于”您对数据的处理方式。

一般来说,我倾向于说,如果数据是结构化且统一的,则最好对数据进行关系建模。如果它是非结构化且不统一的,则使用json 之类的存储可能更合适。

【讨论】:

以上是关于Django 和 postgres - 在模型字段中将数据存储为 json 的缺点的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的唯一模型字段和区分大小写(postgres)

django 手动将模型字段添加到 postgres 数据库

Django 在 json 字段中注释特定键

Django Postgres ArrayField 与一对多关系

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

带有默认字段的Django模型序列化问题