2015-12-01 48 views
2

將外鍵存儲在jsonb列中有什麼問題?在postgresql 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是一個外鍵指向屬性表,該表包含與給定屬性(名稱,類型,描述)相關的所有內容。

我找不到任何有關爲什麼這可能是一個好/壞做法的文獻。是否有任何明顯的直接相關的問題,我忽略了?

+0

你會如何選擇名稱,類型和描述爲一個項目的所有屬性? – Kenney

+0

我試圖找到某種方式,但在我看來,我需要利用我的ORM來做到這一點(我使用ActiveRecord,它支持jsonb列)。你有沒有想到什麼? – jiroch

+0

事實上 - 你需要ORM,查詢會比說'SELECT * FROM item_attributes LEFT JOIN attributes USING(attribute_id)where item_id =?'更復雜。通常,我不會使用JSON或任何其他基於文本/二進制的複雜內容來存儲引用數據庫本身的信息,但會使用正確的FK,這樣數據庫將強制執行它們。我有足夠的麻煩,使用一個MysqlDB,它有一個存儲外鍵爲'\ 0'分隔值的列......但是如果它對你有用,它支持得很快,而且查詢不會變得不必要的複雜,爲什麼不。 – Kenney

回答

2

你需要考慮以下有關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

文章來考慮:

+0

非常感謝!我相信我可以應付所有這些 1.更新將是罕見的那些列 2.確定這一個我不知道,但我預設了幾個屬性在該jsonb最多 3.沒有數組應該在那裏 – jiroch

相關問題