【问题标题】:What happens if JSONField has reached maximum storage limit?如果 JSONField 已达到最大存储限制会怎样?
【发布时间】:2017-09-26 09:49:07
【问题描述】:

对于有经验的 (Django) 开发人员来说,这可能是一个简单的问题。

我项目的数据库是 PostgreSQL。

我打算使用单个受保护模型实例作为某些数据的集中存储。该实例将有一个 JSONField ,它又将存储键值对的动态集合(两者都是字符串)。 “动态”是指不时将新的键值对添加到集合中,因此集合的大小将不断增长。

据我所知(例如Size limit of JSON data type in PostgreSQL),JSONField 的大小限制约为 1GB。这是相当多的,但仍然不是无限的。

我的问题是:如果我设法耗尽 JSONField 的存储容量,会发生什么?对于如何在这种情况发生之前进行预测(例如监控实例的存储大小),是否有任何建议?

【问题讨论】:

  • 在达到该限制之前,您必须处理在大概很多行中更新 500MB json 所需的时间。如果您真的想存储这种大小的单个文档,我不确定您是否想要一个数据库。
  • 新的键值对会不时添加到集合中:以什么频率?如果这种情况足够频繁,表将包含大量死元组,这会减慢查询和 VACUUMing。不用说,您不能自动更新/插入新的一对:每次都会覆盖整个 JSON 数据。我强烈建议改用一些关系设计(即使EAV 在您的用例中也可以表现得更好)。
  • 感谢您的所有 cmets!由于从长远来看,所描述的存储解决方案现在似乎存在问题,因此我决定尝试使用项目范围的键值存储,例如 pickledb (github.com/patx/pickledb)。
  • *(pickledb 现在使用的是“simplejson”模块,与名称相反。)

标签: python django postgresql


【解决方案1】:

【讨论】:

  • 谢谢!但是第二条信息是否意味着 TOAST 机制会在达到 JSONField 最大大小限制时防止“撞墙”?
  • 从未测试过。但它会根据信息。
【解决方案2】:

由于您不打算操作数据库中的 JSON 值,因此您应该使用数据类型 json 而不是 jsonb

如果您超过该限制,您将收到一条错误消息。但是由于整个值必须暂时保存在客户端和数据库端的 RAM 中,我希望您在此之前遇到问题 - 您可能会从数据库中收到内存不足的消息,或者性能可能真的很糟糕。

如果您有超过 1GB 的状态要存储在数据库中,最好将其拆分为几个部分并仅更新那些真正发生变化的部分,就像您通常在关系数据库中所做的那样。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2021-05-13
    • 2019-07-28
    • 2012-06-06
    相关资源
    最近更新 更多