在postgresql jsonb中存储外键是个坏主意?
在jsonb列中存储外键有哪些问题 背景: 我有一个项目表:在postgresql jsonb中存储外键是个坏主意?,postgresql,jsonb,Postgresql,Jsonb,在jsonb列中存储外键有哪些问题 背景: 我有一个项目表: Item -------------------------- | id | name | property | | PK | text | jsonb | 属性列是具有以下结构的一级jsonb: [ {"value": "white", "item_attribute_id": "1"}, {"value": "71", "item_attribute_id": "3"}, {"value": "29"
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是指向属性表的外键,它保存与给定属性(名称、类型、描述)相关的所有内容
我找不到任何关于为什么这可能是一种好的/坏的做法的文献。有没有我忽略的明显的直接相关问题 关于类型,您需要考虑以下事项:
- 查询将更加复杂;如果您对所有(甚至更多关于<代码>选择< /COD>语句)感到满意,<代码> Update <代码>操作将仍然是棘手的。请考虑<强> < /强>。
- 大小开销对于小型文档来说,这并不重要,但在规模上,您可能会撞到墙。只需比较案例的
结果pg\u column\u size()
- 有限的索引支持;当您通过
(函数如element
json\u array\u elements()。默认的
索引支持使用(GIN
)CONTAINS
,(
)EXISTS
,(?
)EXISTS ALL
和(?&
)EXISTS ANY
运算符进行查询,因此您需要小心使用的查询?
支持jsonb
和btree
索引。您可以查看详细信息hash
SELECT*FROM item\u attributes LEFT使用(attribute\u id)连接属性更复杂,其中item\u id=?
。通常,我不会使用JSON或任何其他基于文本/二进制的复杂内容来存储引用DB本身的信息,而是使用适当的FK,以便DB强制执行它们。MysqlDB有一列将外键存储为\0
分隔值,对此我已经有足够的麻烦了。。。但是如果它对您有效,支持良好,速度快,并且查询不会变得不必要的复杂,为什么不呢?非常感谢!我相信我能应付这一切。在第2列中很少有更新。好的,这个我不知道,但我假设jsonb中的几十个属性最多为3。不应该有数组