PostgreSQL baru saja memperkenalkan JSONB dan sudah tren di berita hacker . Akan lebih bagus jika seseorang dapat menjelaskan bagaimana perbedaannya dengan Hstore dan JSON yang sebelumnya ada di PostgreSQL. Apa kelebihan dan keterbatasannya dan kapan seseorang harus mempertimbangkan untuk menggunakannya?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
sumber
sumber
Jawaban:
Pertama,
hstore
adalah modul contrib, yang hanya memungkinkan Anda untuk menyimpan pasangan kunci => nilai, di mana kunci dan nilai hanya dapat berupatext
s (namun nilai juga dapat berupa sqlNULL
s).Keduanya
json
&jsonb
memungkinkan Anda untuk menyimpan nilai JSON yang valid (ditentukan dalam speknya ).F.ex. ini adalah representasi JSON valid:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
hanya bagian kecil dibandingkan dengan apa JSON mampu (tetapi jika Anda hanya perlu subset ini, itu baik-baik saja).Satu-satunya perbedaan antara
json
&jsonb
adalah penyimpanannya:json
disimpan dalam format teks biasa, sementarajsonb
disimpan dalam beberapa representasi binerAda 3 konsekuensi utama dari ini:
jsonb
biasanya membutuhkan lebih banyak ruang disk untuk menyimpan daripadajson
(terkadang tidak)jsonb
membutuhkan lebih banyak waktu untuk membangun dari representasi inputnya daripadajson
json
operasi membutuhkan waktu lebih banyak secara signifikan daripadajsonb
(& parsing juga perlu dilakukan setiap kali Anda melakukan beberapa operasi padajson
nilai yang diketik)Kapan
jsonb
akan tersedia dengan rilis stabil, akan ada dua kasus penggunaan utama, ketika Anda dapat dengan mudah memilih di antara mereka:json
.jsonb
.sumber
jsonb
tidak mendukung ini?UPDATE test SET data->'a' = 123 WHERE id = 1;
dariCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
lebihjsonb
adalah jika karena alasan warisan kode Anda memakan Andajson
tergantung pada pemesananjson
bidang dan mereka tidak dapat disusun ulang.text
vsjson
.: yang terakhir disertai dengan validasi JSON, jadi pada JSON yang tidak valid, itu hanya akan gagal saat memasukkan, alih-alih setiap kali aplikasi Anda membacanya (karena mendapat representasi yang tidak valid). Anda juga dapat dengan aman memasukkan yang terakhir kejsonb
dalam basis data.Peeyush:
Jawaban singkatnya adalah:
Untuk jawaban yang lebih lama, Anda harus menunggu saya melakukan penulisan "HowTo" lengkap lebih dekat dengan rilis 9.4.
sumber
Penjelasan sederhana tentang perbedaan antara json dan jsonb ( gambar asli oleh PostgresProfessional ):
Lebih banyak di video pidato dan presentasi slide oleh pengembang jsonb. Juga mereka memperkenalkan JsQuery , pg.extension menyediakan bahasa permintaan jsonb yang kuat
sumber
hstore
lebih dari jenis penyimpanan "kolom lebar", ini adalah kamus datar (bukan-bersarang) dari pasangan nilai kunci, selalu disimpan dalam format biner yang cukup efisien (tabel hash, karenanya namanya).json
menyimpan dokumen JSON sebagai teks, melakukan validasi ketika dokumen disimpan, dan menguraikannya pada output jika diperlukan (yaitu mengakses masing-masing bidang); harus mendukung seluruh spesifikasi JSON. Karena seluruh teks JSON disimpan, pemformatannya dipertahankan.jsonb
mengambil jalan pintas untuk alasan kinerja: data JSON diuraikan pada input dan disimpan dalam format biner, urutan kunci dalam kamus tidak dikelola, dan juga kunci duplikat. Mengakses elemen individual di bidang JSONB cepat karena tidak memerlukan penguraian teks JSON setiap saat. Pada output, data JSON direkonstruksi dan pemformatan awal hilang.IMO, tidak ada alasan signifikan untuk tidak menggunakan
jsonb
setelah tersedia, jika Anda bekerja dengan data yang dapat dibaca mesin.sumber
JSONB adalah versi JSON yang "lebih baik".
Mari kita lihat sebuah contoh:
Secara umum, seseorang harus memilih JSONB, kecuali ada kebutuhan khusus, seperti asumsi warisan tentang pemesanan kunci objek.
sumber
Saya berada di pgopen hari ini tolok ukur jauh lebih cepat daripada mongodb, saya percaya itu sekitar 500% lebih cepat untuk pilihan. Cukup banyak semuanya lebih cepat setidaknya 200% bila dibandingkan dengan mongodb, dari satu pengecualian saat ini adalah pembaruan yang mengharuskan sepenuhnya menulis ulang seluruh kolom json sesuatu yang ditangani mongodb lebih baik.
Pengindeksan gin pada jsonb terdengar luar biasa.
Postgres juga akan tetap menggunakan tipe jsonb secara internal dan pada dasarnya mencocokkan ini dengan tipe seperti numerik, teks, boolean dll.
Bergabung juga akan dimungkinkan menggunakan jsonb
Tambahkan PLv8 untuk prosedur tersimpan dan ini pada dasarnya akan menjadi mimpi yang menjadi kenyataan bagi pengembang node.js.
Menjadi itu disimpan sebagai binary jsonb juga akan menghapus semua spasi putih, mengubah urutan properti dan menghapus properti duplikat menggunakan kejadian terakhir properti.
Selain indeks ketika kueri terhadap kolom jsonb berbeda dengan kolom json, postgres tidak harus benar-benar menjalankan fungsionalitas untuk mengubah teks menjadi json di setiap baris yang kemungkinan akan menghemat banyak waktu sendirian.
sumber
Mengenai perbedaan antara
json
danjsonb
tipe data, ada baiknya menyebutkan penjelasan resmi:Sumber: https://www.postgresql.org/docs/current/datatype-json.html
sumber
Perbedaan penting lainnya, yang tidak disebutkan dalam jawaban di atas, adalah bahwa tidak ada operator kesetaraan untuk
json
tipe, tetapi ada satu untukjsonb
.Ini berarti bahwa Anda tidak dapat menggunakan
DISTINCT
kata kunci saat memilihjson
-type ini dan / atau bidang lain dari sebuah tabel (Anda dapat menggunakannyaDISTINCT ON
, tetapi itu tidak selalu memungkinkan karena kasus seperti ini ).sumber
Sejauh yang saya tahu,
hstore seperti yang ada saat ini (dalam Postgresql 9.3) tidak memungkinkan untuk bersarang objek dan array lainnya sebagai nilai pasangan kunci / nilainya. Namun patch hstore masa depan akan memungkinkan untuk bersarang. tambalan ini tidak akan ada dalam rilis 9.4 dan mungkin tidak akan disertakan dalam waktu dekat.
json karena saat ini ada memang memungkinkan untuk bersarang, tetapi berbasis teks, dan tidak memungkinkan untuk pengindeksan, sehingga "lambat"
jsonb yang akan dirilis dengan 9,4 akan memiliki kemampuan bersarang json saat ini, serta pengindeksan GIN / GIST dari hstore, sehingga akan cepat
Orang-orang yang bekerja pada postgresql 9.4 tampaknya mengatakan bahwa tipe jsonb baru yang cepat akan menarik bagi orang-orang yang akan memilih untuk menggunakan penyimpanan data noSQL seperti MongoDB, tetapi sekarang dapat menggabungkan database relasional dengan data tak terstruktur yang dapat dikueri dalam satu atap.
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Benchmark dari postgresql 9.4 jsonb tampaknya setara dengan atau dalam beberapa kasus lebih cepat dari MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
sumber