Saya mencoba untuk memutuskan pada desain database, dengan asumsi sesedikit mungkin (mengenai bagaimana aplikasi web benar-benar berkembang) mungkin pada tahap ini.
Sebagai langkah pertama, memahami bahwa BERGABUNG itu mahal, saya mempertimbangkan sejumlah kecil tabel monolitik dibandingkan dengan sejumlah besar tabel kecil yang dinormalisasi. Sebagai poin kedua, saya bingung antara menggunakan tabel hstore vs reguler vs JSONB (dengan indeks GiST).
AFAIK (jangan ragu untuk memperbaiki):
Secara umum, di Postgres, hstore dikenal berkinerja lebih baik daripada tipe data lainnya. Presentasi dari FOSDEM PGDAY ini memiliki beberapa statistik menarik (pada paruh kedua slide). https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf
Keuntungan dengan hstore adalah pengindeksan cepat (GiN atau GiST). Namun, dengan JSONB, pengindeksan GiN dan GiST juga dapat diterapkan pada data JSON.
Blog ini dari seorang profesional di Kuadran ke-2 mengatakan "Pada titik ini mungkin layak mengganti penggunaan hstore dengan jsonb di semua aplikasi baru" (gulir ke akhir): http://blog.2ndquadrant.com/postgresql-anti-patterns- perlu diperlukan -jsonhstore-dynamic-kolom /
Jadi saya ingin memutuskan yang berikut ini:
- Untuk bagian utama (terstruktur) dari data: haruskah masuk dalam beberapa tabel relasional (relatif besar dengan banyak kolom), atau haruskah itu sejumlah toko nilai kunci menggunakan hstore?
- Untuk data ad hoc (kontribusi pengguna / tidak terstruktur), haruskah dalam JSON atau toko nilai kunci ad hoc di hstore (dengan kunci disimpan di salah satu tabel relasional utama)?
sumber
JSON(B)
danhstore
(dan EAV) baik untuk data dengan struktur yang tidak dikenal.Jawaban:
Database relasional dirancang di sekitar bergabung, dan dioptimalkan untuk melakukannya dengan baik.
Kecuali Anda memiliki alasan yang kuat untuk tidak melakukannya untuk menggunakan desain yang dinormalisasi, gunakan desain yang dinormalisasi.
jsonb
dan hal-hal sepertihstore
itu baik untuk ketika Anda tidak dapat menggunakan model data yang dinormalisasi, seperti ketika model data berubah dengan cepat dan ditentukan oleh pengguna.Jika Anda bisa memodelkannya secara relasional, memodelkannya secara relasional. Jika Anda tidak bisa, pertimbangkan json dll. Jika Anda memilih antara json / jsonb / hstore, umumnya pilih jsonb kecuali Anda memiliki alasan untuk tidak melakukannya.
Itulah yang saya katakan di posting blog saya , yang membahas topik ini saja. Baca seluruh pos . Paragraf yang Anda kutip menunjukkan bahwa jika Anda memilih struktur dinamis, Anda harus memilih jsonb daripada hstore, tetapi sisa posting blog adalah tentang mengapa Anda biasanya lebih suka memodelkan secara relasional jika Anda bisa.
Begitu. Model bagian terstruktur utama secara relasional. Jika tabel benar-benar lebar dengan banyak kolom, ini mungkin merupakan tanda bahwa diperlukan normalisasi lebih lanjut. Jangan takut bergabung. Belajar mencintai bergabung. Bergabung dengan banyak tabel kecil sering kali lebih cepat daripada meminta dan mempertahankan tabel yang didenormalkan besar. Denormalkan hanya jika Anda perlu untuk kasus-kasus tertentu, dan lebih disukai melalui pandangan terwujud ... tetapi jangan lakukan sampai Anda tahu Anda perlu dan memiliki masalah nyata yang nyata untuk dipecahkan.
Untuk data kontribusi pengguna yang berbentuk bebas dan tidak terstruktur, gunakan jsonb. Ini harus bekerja sebaik hstore, tetapi lebih fleksibel dan lebih mudah untuk dikerjakan.
Satu hal yang relevan untuk dipahami: indeks GiST dan GIN seperti yang digunakan pada jsonb umumnya jauh lebih efisien daripada indeks b-tree biasa. Mereka lebih fleksibel, tetapi indeks b-tree pada kolom normal hampir selalu jauh lebih cepat.
sumber
hstore
sudah ditinggalkan. Gunakanjsonb
.