PostgreSQL剛剛引入JSONB,它已經趨向於hacker news。如果有人能夠解釋它與以前在PostgreSQL中出現的Hstore和JSON有什麼不同,那將會很棒。什麼是優點和限制,什麼時候應該有人考慮使用它?PostgreSQL引入的JSONB說明
回答
Peeyush:
簡短的回答是:
- 如果你正在做大量的JSON操作內 PostgreSQL的,如排序,切片,拼接等,你應該使用JSONB出於速度原因。
- 如果您需要對JSON進行任意鍵搜索的索引查找,那麼您應該使用JSONB。
- 如果您沒有執行上述操作,則應該使用JSON。
- 如果您需要保留鍵排序,空格和重複鍵,則應使用JSON。
對於更長的回答,您需要等待我完成更接近9.4版本的完整「HowTo」寫法。
hstore
更多的是「寬列」存儲型的,它是鍵 - 值對的平坦(非嵌套)詞典,總是存儲在一個合理的有效的二進制格式(哈希表,因此得名)。json
將JSON文檔存儲爲文本,在文檔存儲時執行驗證,並在需要時對輸出進行解析(即訪問單個字段);它應該支持整個JSON規範。由於存儲了整個JSON文本,因此其格式將被保留。jsonb
出於性能原因採取捷徑:JSON數據在輸入時被解析並以二進制格式存儲,字典中的鍵排序不被維護,也不是重複的鍵。在JSONB字段中訪問各個元素的速度很快,因爲它不需要一直分析JSON文本。在輸出時,JSON數據被重建並且初始格式化丟失。
IMO,存在一種使用jsonb
一旦有貨,如果你與機器可讀數據的工作不沒有顯著的原因。
首先,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
將配有一個穩定的版本,將有兩個主要的用例時,你可以輕鬆地在它們之間進行選擇:
- 如果你只在你的應用程序中的JSON表示工作時,PostgreSQL只用來存儲&檢索這個表示,你應該使用
json
。 - 如果您對PostgreSQL中的JSON值執行了大量操作,或者在某個JSON字段上使用索引,則應該使用
jsonb
。
嗨,既然它有二進制表示,爲什麼'jsonb'不支持這個? 'UPDATE測試SET數據 - >'a'= 123 WHERE id = 1;'從CREATE TABLE測試(ID SERIAL PRIMARY KEY,數據JSONB);' – Kokizzu
ah nevermind,我發現它是XD'http://michael.otacoo .com/postgresql-2/manipulating-jsonb-data-with-key-unique /' – Kokizzu
@Kokizzu該鏈接似乎被破壞,但我在這裏找到它:http://michael.otacoo.com/postgresql-2/操縱-jsonb-data-with-key-unique - 我還有一個在PostgreSQL 9.3+中操作'json'的解決方案:http://stackoverflow.com/a/23500670/1499698 – pozs
據我所知,
hstore,因爲它目前存在(在PostgreSQL 9.3)不允許用於嵌套其他對象和數組作爲它的鍵/值對的值。但未來的hstore補丁將允許嵌套。這個補丁不會在9.4版本中發佈,並且可能不會很快包含。
JSON,因爲它目前存在不允許嵌套,但基於文本的,並且不允許索引,因此它是「慢」
jsonb將與9.4發佈將有JSON的當前的嵌套能力,以及hstore的GIN/GIST索引,所以這將是快速
人們對PostgreSQL的9.4工作似乎在說,新的,快速jsonb類型將呼籲人們誰會選擇使用像MongoDB這樣的noSQL數據存儲,但現在可以在一個屋檐
的PostgreSQL 9http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
基準下,結合了可查詢非結構化數據的關係數據庫。4個jsonb似乎看齊或在某些情況下比MongoDB的
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
我在pgopen今天基準比MongoDB的方式快了快了,我相信這是對選擇更快的約500%。與mongodb相比,幾乎所有的東西至少要快200%,而現在的一個例外是需要完全重寫整個json列的更新,而mongodb處理得更好。
jsonb上的杜松子酒索引令人驚歎。
而且Postgres將內部持續類型jsonb的,基本上與類型,如數字,文本,布爾等匹配此
加盟也將使用jsonb
添加PLv8存儲過程,這將是可能的基本上是node.js開發人員的夢想成真。
存儲爲二進制文件jsonb還將刪除所有空白,更改屬性的順序並使用屬性的最後發生刪除重複的屬性。
除了查詢與json列對比的jsonb列時的索引,postgres並不需要實際運行將每行的文本轉換爲json的功能,這可能會節省大量時間。
(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 video和slide show presentation by jsonb開發者。此外,他們推出JsQuery,pg.extension提供了強大的jsonb查詢語言
這個答案在很大程度上依賴於外部鏈接(包括一個偉大的職位圖片)。如果將來有些時候這些鏈接變得無效,那麼你的答案最終會基本上是空的。爲了防止這種情況發生,請至少添加一個可以在這些鏈接中找到的摘要。例如,對於圖片,您可以將其複製爲文本。謝謝! –
謝謝,我已將其替換爲文本 – ChelowekKot
- 1. Postgresql加入jsonb
- 2. PostgreSQL的索引JSONB陣列
- 3. 插入jsonb到PostgreSQL的
- 4. PostgreSQL jsonb?
- 5. Postgresql jsonb遍歷
- 6. PostgreSQL的jsonb名單
- 7. ANORM和PostgreSQL jsonb列
- 8. postgresql Jsonb?不工作
- 9. 說明PostgreSQL存儲過程
- 10. PostgreSQL + Rails併發性說明
- 11. PostgreSQL - 在JSONB中的位置
- 12. 說明有關索引+ ORDER BY在PostgreSQL的9.1
- 13. Elixir Ecto - PostgreSQL jsonb函數
- 14. ActiveRecord&Postgresql:查詢jsonb屬性
- 15. 查詢postgresql jsonb日期
- 16. 在postgresql中編輯jsonb值?
- 17. 爲一個PostgreSQL JSONB列
- 18. PostgreSQL的概率:說明在CREATE INDEX
- 19. PostgreSQL的JSONB(選擇值返回值與引號,「值」)
- 20. 在PostgreSQL中搜索嵌套JSONB數組元素的索引
- 21. 說明如何使用<-> PostgreSQL中
- 22. PostgreSQL中的JSONB中的datetime對象
- 23. PostgreSQL的9.4 - 無效的輸入語法轉換爲JSONB
- 24. 的PostgreSQL 9.4 jsonb我怎麼RO查詢
- 25. PostgreSQL的jsonb處理與C API
- 26. PostgreSQL的 - 分組通過jsonb列
- 27. 查詢與jsonb外卡的PostgreSQL
- 28. MySQL的加入說明
- 29. PDO綁定數組索引(postgresql JSONB)閱讀
- 30. 爲postgresql jsonb字段創建部分索引
從PGCon2014:https://www.youtube.com/watch?v=oQ1LSW31Y1A&list=PLWW0CjV-Tafa2jvcjihXwSvZZKsLAsb9Y#t=2492 – msanford
@CraigRinger URL不足夠精確,現在,1年後,它甚至沒有足夠接近JSONB相關內容。 – berkus
@berkus我以爲我鏈接到特定的職位。多麼令人沮喪。 –