2014-03-26 40 views
196

PostgreSQL剛剛引入JSONB,它已經趨向於hacker news。如果有人能夠解釋它與以前在PostgreSQL中出現的Hstore和JSON有什麼不同,那將會很棒。什麼是優點和限制,什麼時候應該有人考慮使用它?PostgreSQL引入的JSONB說明

+2

從PGCon2014:https://www.youtube.com/watch?v=oQ1LSW31Y1A&list=PLWW0CjV-Tafa2jvcjihXwSvZZKsLAsb9Y#t=2492 – msanford

+3

@CraigRinger URL不足夠精確,現在,1年後,它甚至沒有足夠接近JSONB相關內容。 – berkus

+1

@berkus我以爲我鏈接到特定的職位。多麼令人沮喪。 –

回答

82

Peeyush:

簡短的回答是:

  • 如果你正在做大量的JSON操作 PostgreSQL的,如排序,切片,拼接等,你應該使用JSONB出於速度原因。
  • 如果您需要對JSON進行任意鍵搜索的索引查找,那麼您應該使用JSONB。
  • 如果您沒有執行上述操作,則應該使用JSON。
  • 如果您需要保留鍵排序,空格和重複鍵,則應使用JSON。

對於更長的回答,您需要等待我完成更接近9.4版本的完整「HowTo」寫法。

41
  • hstore更多的是「寬列」存儲型的,它是鍵 - 值對的平坦(非嵌套)詞典,總是存儲在一個合理的有效的二進制格式(哈希表,因此得名)。
  • json將JSON文檔存儲爲文本,在文檔存儲時執行驗證,並在需要時對輸出進行解析(即訪問單個字段);它應該支持整個JSON規範。由於存儲了整個JSON文本,因此其格式將被保留。
  • jsonb出於性能原因採取捷徑:JSON數據在輸入時被解析並以二進制格式存儲,字典中的鍵排序不被維護,也不是重複的鍵。在JSONB字段中訪問各個元素的速度很快,因爲它不需要一直分析JSON文本。在輸出時,JSON數據被重建並且初始格式化丟失。

IMO,存在一種使用jsonb一旦有貨,如果你與機器可讀數據的工作沒有顯著的原因。

295

首先,hstore是一個的contrib模塊,其僅允許你存儲密鑰=>值對,其中鍵和值只能是text秒(但是值可以是SQL NULL太)。

兩個json & jsonb允許你存儲一個有效的JSON (在其spec定義)。

F.ex.這些都是有效的JSON表示形式:null,true,[1,false,"string",{"foo":"bar"}],{"foo":"bar","baz":[null]} - hstore只是一個小子集相比,JSON的能力(但如果你只需要這個子集,它很好)。

json & jsonb之間唯一的區別是它們的存儲:

  • json被存儲在其純文本格式,而
  • jsonb被存儲在一些二進制表示

有3個這個主要後果:

  • jsonb通常需要更多的磁盤空間用於存儲比json(有時不)
  • jsonb花費更多的時間從它的輸入表示建立比json
  • json操作花費顯著的時間比jsonb(&解析也需要每次做某種操作時都要做json鍵入的值)

jsonb將配有一個穩定的版本,將有兩個主要的用例時,你可以輕鬆地在它們之間進行選擇:

  1. 如果你只在你的應用程序中的JSON表示工作時,PostgreSQL只用來存儲&檢索這個表示,你應該使用json
  2. 如果您對PostgreSQL中的JSON值執行了大量操作,或者在某個JSON字段上使用索引,則應該使用jsonb
+1

嗨,既然它有二進制表示,爲什麼'jsonb'不支持這個? 'UPDATE測試SET數據 - >'a'= 123 WHERE id = 1;'從CREATE TABLE測試(ID SERIAL PRIMARY KEY,數據JSONB);' – Kokizzu

+1

ah nevermind,我發現它是XD'http://michael.otacoo .com/postgresql-2/manipulating-jsonb-data-with-key-unique /' – Kokizzu

+2

@Kokizzu該鏈接似乎被破壞,但我在這裏找到它:http://michael.otacoo.com/postgresql-2/操縱-jsonb-data-with-key-unique - 我還有一個在PostgreSQL 9.3+中操作'json'的解決方案:http://stackoverflow.com/a/23500670/1499698 – pozs

6

據我所知,

  • hstore,因爲它目前存在(在PostgreSQL 9.3)不允許用於嵌套其他對象和數組作爲它的鍵/值對的值。但未來的hstore補丁將允許嵌套。這個補丁不會在9.4版本中發佈,並且可能不會很快包含。

  • JSON,因爲它目前存在允許嵌套,但基於文本的,並且不允許索引,因此它是「慢」

  • jsonb將與9.4發佈將有JSON的當前的嵌套能力,以及hstore的GIN/GIST索引,所以這將是快速

人們對PostgreSQL的9.4工作似乎在說,新的,快速jsonb類型將呼籲人們誰會選擇使用像MongoDB這樣的noSQL數據存儲,但現在可以在一個屋檐

的PostgreSQL 9

http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

基準下,結合了可查詢非結構化數據的關係數據庫。4個jsonb似乎看齊或在某些情況下比MongoDB的

http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

11

我在pgopen今天基準比MongoDB的方式快了快了,我相信這是對選擇更快的約500%。與mongodb相比,幾乎所有的東西至少要快200%,而現在的一個例外是需要完全重寫整個json列的更新,而mongodb處理得更好。

jsonb上的杜松子酒索引令人驚歎。

而且Postgres將內部持續類型jsonb的,基本上與類型,如數字,文本,布爾等匹配此

加盟也將使用jsonb

添加PLv8存儲過程,這將是可能的基本上是node.js開發人員的夢想成真。

存儲爲二進制文件jsonb還將刪除所有空白,更改屬性的順序並使用屬性的最後發生刪除重複的屬性。

除了查詢與json列對比的jsonb列時的索引,postgres並不需要實際運行將每行的文本轉換爲json的功能,這可能會節省大量時間。

38

original image by PostgresProfessional)JSON和jsonb之間的差的一個簡單的解釋:

SELECT '{"c":0, "a":2,"a":1}'::json, '{"c":0, "a":2,"a":1}'::jsonb; 

      json   |  jsonb 
------------------------+--------------------- 
{"c":0, "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row) 
  • JSON:文本存儲«如同»
  • jsonb:沒有空格
  • jsonb:沒有重複的鍵,最後一把鑰匙贏
  • jsonb:鑰匙排序

更多speech videoslide show presentation by jsonb開發者。此外,他們推出JsQuery,pg.extension提供了強大的jsonb查詢語言

+1

這個答案在很大程度上依賴於外部鏈接(包括一個偉大的職位圖片)。如果將來有些時候這些鏈接變得無效,那麼你的答案最終會基本上是空的。爲了防止這種情況發生,請至少添加一個可以在這些鏈接中找到的摘要。例如,對於圖片,您可以將其複製爲文本。謝謝! –

+0

謝謝,我已將其替換爲文本 – ChelowekKot