Apa yang bisa saya lakukan dengan bidang json baru?

8

PostgreSQL 9.2 memperkenalkan jsonjenis bidang. Mengapa dan kapan saya harus menggunakannya? Apa manfaatnya dibandingkan bidang teks?

Saya pikir ada opsi permintaan baru yang tersedia, namun saya belum melihatnya. Apakah saya melewatkan sesuatu?

Jonathan Egerton
sumber

Jawaban:

7

Postgres 9.2

Manfaat dari fitur baru ini adalah dua kali lipat. Kolom tipejson memverifikasi validitas kontennya sehingga apa yang ada di kolom JSON valid secara otomatis dan Anda mendapatkan kesalahan jika Anda mencoba menuliskan hal lain ke dalamnya.
Dan Anda memiliki fungsi dasar untuk membuat JSON yang valid dengan cepat dari baris atau array - yang merupakan kasus penggunaan yang sangat umum.

Saya mengutip Andrew Dunstan pada daftar pgsql-hacker :

Pada tahap tertentu mungkin akan ada beberapa fungsi pemrosesan json (sebagai lawan pembuatan json), tetapi tidak di 9.2.

Saya menggunakan kutipan itu sebelumnya di bawah pertanyaan terkait ini di SO .

Postgres 9.3

.. akhirnya membawa sejumlah fungsi dan operator. Lihat halaman manual untuk fungsi JSON .

Jawaban terkait pada SO:

@Akan memasang posting blog. Lihat komentar di bawah.

Postgres 9.4

Pastikan untuk memeriksa jsonbtipe baru dengan sejumlah fungsi baru.

Di atas semua itu, penyimpanan biner yang terurai memungkinkan penyimpanan yang lebih kecil pada disk dan operator kesetaraan untuk jsonb(tidak seperti json), yang memungkinkan sejumlah operasi tambahan dimungkinkan (seperti DISTINCTatau UNIQUEindeks).

Namun lebih banyak fungsi telah ditambahkan untuk keduanya jsondan jsonb. json_to_record(), json_to_recordset()dll. Lebih banyak di catatan rilis.

Erwin Brandstetter
sumber
1
Anda juga dapat menggunakan pl / v8js untuk memanipulasi mereka yang memberi Anda beberapa kemampuan yang cukup mengagumkan.
Chris Travers
1
Ya, tetapi jika Anda menggunakan contoh Postgres yang di-host (seperti Heroku), PLV8 mungkin bukan pilihan (pasti tidak ada pada Heroku). Dalam hal ini, dari apa yang dapat saya lihat, tipe data JSON memiliki nilai yang cukup terbatas di 9.2. Sepertinya 9.3 mungkin memiliki beberapa dukungan yang bagus.
David S
1
Melihat pembaruan yang datang dalam 9,3 michael.otacoo.com/postgresql-2/…
Will
2

Singkatnya, tipe data JSON (dan ekstensi HSTORE dan tipe data yang lebih lama juga) memungkinkan Anda untuk menggunakan PostgreSQL sebagai penyimpan data "tanpa skema" (atau menggabungkan data "tanpa skema" relasional dan non-relasional), alih-alih harus menggunakan beberapa opsi NoSQL lainnya (seperti MongoDB). Anda bahkan mendapatkan beberapa hal yang tidak dapat Anda lakukan dengan MongoDB, seperti pengindeksan yang difilter, pengindeksan ekspresi, dll. Satu-satunya kelemahan adalah bahwa PostgreSQL tidak mendukung pengabaian di luar kotak seperti yang dilakukan MongoDB ... namun, saya benar-benar mempertanyakan seberapa sering pecahan benar - benar dibutuhkan. Dengan database PostgreSQL 9.3 yang dikonfigurasikan dengan baik, sumber daya O / S yang cukup, dan beberapa indeks ekspresi yang difilter dengan cukup baik, Anda harus dapat dengan mudah mencapai pencarian baris tanpa skema dalam kisaran 0,25 milidetik.

HTH, Dave Sisk

Dave Sisk
sumber
1

Pada dasarnya saya melihat tiga use case di sini:

  1. lulus hasil yang kompleks dengan mudah kembali ke aplikasi
  2. meneruskan data kompleks ke db dari aplikasi, dan
  3. Simpan data bentuk relatif bebas untuk diproses nanti.

Yang pertama dapat dilakukan langsung dari PostgreSQL tanpa tambahan. Anda harus dapat melakukan sesuatu seperti:

SELECT row_to_json(mt.id, mt.testval, array_agg(mt2))
  FROM my_table mt
  JOIN my_table2 mt2 ON mt.id = mt2.mt_id
 WHERE mt.id = 123;

Ini kemudian dapat digunakan untuk membuat array bersarang dll di output Anda dan menghindari banyak masalah parsing berantakan di sisi aplikasi.

yang kedua adalah mengirimkan data kompleks ke db untuk diproses. Saat ini tidak ada fungsi bawaan untuk memfasilitasi ini, tetapi dengan addon seperti pl / v8js, Anda dapat memprogram basis data Anda dalam Javascript dan menggunakan json sebagai format pertukaran. Ini dapat memungkinkan pembuatan antarmuka yang lebih kaya di dalam basis data Anda. Perhatikan bahwa karena Anda dapat mengindeks output fungsi, Anda dapat menggunakan ini untuk membuat indeks aspek JSON untuk disimpan dalam db Anda.

Yang ketiga adalah satu area yang kami rencanakan untuk menggunakannya di LedgerSMB. Idenya adalah bahwa kami mungkin ingin mengizinkan integrator sistem untuk menyimpan informasi yang sangat sederhana bersama dengan akun pelanggan. Ini kemudian bisa dikemas dalam bidang JSON yang akan disimpan. Ini tidak akan dapat langsung ditanyakan oleh aplikasi utama, tetapi jika orang ingin menambahkan ini menggunakan pl / v8js ini bisa dilakukan untuk bisnis individu menggunakan perangkat lunak.

Chris Travers
sumber