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.dumps
和json.loads
。
与对所有事物都使用模型相比,我想知道(理论上)这样做(使用 JSON 类型而不是不使用 JSON 类型)的性能和缓存缺点是什么。
对此有更多了解可以帮助我以后进行一些巧妙的比较和分析,以提高整体性能。
【问题讨论】:
听起来你应该试试 mongodb @Alvaro Mongodb 是网络规模。 youtube.com/watch?v=b2F-DItXtZs 【参考方案1】:将数据存储为json
(无论是在text
-typed 字段中,还是在PostgreSQL 的本机json
type 中)是一种非规范化形式。
与大多数非规范化一样,在处理非常难以建模的数据时,或者在将完全规范化的数据存储到实体中存在严重的性能挑战时,它可能是一个合适的选择。
PostgreSQL 通过支持对数据库中json
值的一些操作来减少数据非规范化导致的一些问题的影响——您可以迭代json
数组或键/值对,加入json 字段的结果提取等。大部分有用的东西是在 9.3 中添加的;在 9.2 中,json 支持只是一种验证数据类型。在 9.4 中,将添加更强大的 json 功能,包括对 json 值索引的一些支持。
对于您的问题,没有一刀切的简单答案,而且您还没有真正表征您的数据或工作负载。与大多数数据库挑战一样,“这取决于”您对数据的处理方式。
一般来说,我倾向于说,如果数据是结构化且统一的,则最好对数据进行关系建模。如果它是非结构化且不统一的,则使用json
之类的存储可能更合适。
【讨论】:
以上是关于Django 和 postgres - 在模型字段中将数据存储为 json 的缺点的主要内容,如果未能解决你的问题,请参考以下文章
Django 中的唯一模型字段和区分大小写(postgres)
django 手动将模型字段添加到 postgres 数据库
Django Postgres ArrayField 与一对多关系