在postgresql 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"

在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是指向属性表的外键,它保存与给定属性(名称、类型、描述)相关的所有内容


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

关于类型,您需要考虑以下事项:

  • 查询将更加复杂;如果您对所有(甚至更多关于<代码>选择< /COD>语句)感到满意,<代码> Update <代码>操作将仍然是棘手的。请考虑<强> < /强>。
  • 大小开销对于小型文档来说,这并不重要,但在规模上,您可能会撞到墙。只需比较案例的
    pg\u column\u size()
    结果
  • 有限的索引支持;当您通过
    element
    (函数如
    json\u array\u elements()。默认的
    GIN
    索引支持使用(
    CONTAINS
    ,(
    EXISTS
    ,(
    EXISTS ALL
    ?&
    和(
    EXISTS ANY
    运算符进行查询,因此您需要小心使用的查询
    jsonb
    支持
    btree
    hash
    索引。您可以查看详细信息
审议的条款:


如何为一个项目的所有属性选择名称、类型和描述?我试图找到一些方法,但在我看来,我需要利用我的ORM来做到这一点(我使用ActiveRecord,它支持jsonb列)。你有什么想法吗?确实-你需要ORM,查询将变得比说
SELECT*FROM item\u attributes LEFT使用(attribute\u id)连接属性更复杂,其中item\u id=?
。通常,我不会使用JSON或任何其他基于文本/二进制的复杂内容来存储引用DB本身的信息,而是使用适当的FK,以便DB强制执行它们。MysqlDB有一列将外键存储为
\0
分隔值,对此我已经有足够的麻烦了。。。但是如果它对您有效,支持良好,速度快,并且查询不会变得不必要的复杂,为什么不呢?非常感谢!我相信我能应付这一切。在第2列中很少有更新。好的,这个我不知道,但我假设jsonb中的几十个属性最多为3。不应该有数组