【问题标题】:Storing foreign keys in postgresql jsonb a bad idea?在 postgresql jsonb 中存储外键是个坏主意?
【发布时间】:2016-03-05 17:15:40
【问题描述】:

在 jsonb 列中存储外键有什么问题?

上下文:

我有一个项目表:

Item 
--------------------------
| id   | name | property |
| PK   | text |  jsonb   |

属性列为一级jsonb,结构如下:

[
  {"value": "white", "item_attribute_id": "1"},
  {"value": "71", "item_attribute_id": "3"},
  {"value": "29", "item_attribute_id": "4"},
  {"value": "48-70", "item_attribute_id": "5"},
  {"value": "190", "item_attribute_id": "6"}
]

item_attribute_id 是指向属性表的外键,其中包含与给定属性(名称、类型、描述)相关的所有内容。

我找不到任何关于为什么这可能是一种好/坏做法的文献。有没有我忽略的明显直接相关的问题?

【问题讨论】:

  • 如何为一个项目的所有属性选择名称、类型和描述?
  • 我试图找到某种方法,但在我看来,我需要利用我的 ORM 来做到这一点(我使用支持 jsonb 列的 ActiveRecord)。你有什么想法吗?
  • 确实——你需要 ORM 并且查询会变得比SELECT * FROM item_attributes LEFT JOIN attributes USING(attribute_id) WHERE item_id = ? 更复杂。通常,我不会使用 JSON 或任何其他基于文本/二进制的复杂内容来存储引用数据库本身的信息,而是使用适当的 FK,以便数据库强制执行它们。 MysqlDB 有一个将外键存储为\0 分隔值的列,我已经遇到了足够的麻烦......但如果它适合你,那么它得到很好的支持,速度很快,而且查询不会变得不必要的复杂,为什么不.

标签: postgresql jsonb


【解决方案1】:

关于JSONB类型,你需要考虑以下几点:

  • 查询会更复杂;如果您甚至对所有JSONB functions 感到满意(它们更多地是关于SELECT 语句),UPDATE 操作仍然会很棘手 - 请考虑 @Erwin's answer 关于此。
  • 大小开销; 对于小型文档,这并不重要,但在规模上您可能会碰壁。只需比较您案例的 pg_column_size() 结果即可。
  • 有限的索引支持;当您在array 中通过element 执行搜索时,您将没有运气(json_array_elements() 等功能)。默认GIN 索引支持使用 (CONTAINS) @>、(EXISTS)?、(EXISTS ALL)?& 和 (EXISTS ANY)?| 运算符进行查询,因此您需要小心你正在使用的查询。 jsonb 支持 btreehash 索引。您可以查看详情here

要考虑的文章:

【讨论】:

  • 非常感谢!我相信我可以应付所有这些 1. 这些列上的更新很少见 2. 好的,我不知道,但我假设 jsonb 中最多有几十个属性 3. 不应该有数组跨度>
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2015-07-20
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多