Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menyimpan JSON dalam database vs. memiliki kolom baru untuk setiap kunci

Diperbarui 4 Juni 2017

Mengingat bahwa pertanyaan/jawaban ini telah mendapatkan popularitas, saya pikir ini layak untuk diperbarui.

Ketika pertanyaan ini awalnya diposting, MySQL tidak memiliki dukungan untuk tipe data JSON dan dukungan di PostgreSQL masih dalam tahap awal. Sejak 5.7, MySQL sekarang mendukung tipe data JSON (dalam format penyimpanan biner), dan PostgreSQL JSONB telah matang secara signifikan. Kedua produk menyediakan jenis JSON berkinerja tinggi yang dapat menyimpan dokumen arbitrer, termasuk dukungan untuk mengindeks kunci tertentu objek JSON.

Namun, saya masih mempertahankan pernyataan awal saya bahwa preferensi default Anda, saat menggunakan database relasional, harus tetap kolom-per-nilai. Basis data relasional masih dibangun dengan asumsi bahwa data di dalamnya akan dinormalisasi dengan cukup baik. Perencana kueri memiliki informasi pengoptimalan yang lebih baik saat melihat kolom daripada saat melihat kunci dalam dokumen JSON. Kunci asing dapat dibuat di antara kolom (tetapi tidak di antara kunci dalam dokumen JSON). Yang penting:jika sebagian besar skema Anda cukup fluktuatif untuk membenarkan penggunaan JSON, Anda mungkin ingin setidaknya mempertimbangkan apakah database relasional adalah pilihan yang tepat.

Meskipun demikian, hanya sedikit aplikasi yang benar-benar relasional atau berorientasi dokumen. Sebagian besar aplikasi memiliki beberapa campuran keduanya. Berikut adalah beberapa contoh di mana saya pribadi telah menemukan JSON berguna dalam database relasional:

  • Saat menyimpan alamat email dan nomor telepon untuk kontak, di mana menyimpannya sebagai nilai dalam larik JSON jauh lebih mudah dikelola daripada beberapa tabel terpisah

  • Menyimpan preferensi pengguna kunci/nilai arbitrer (di mana nilainya dapat berupa boolean, tekstual, atau numerik, dan Anda tidak ingin memiliki kolom terpisah untuk tipe data yang berbeda)

  • Menyimpan data konfigurasi yang tidak memiliki skema yang ditentukan (jika Anda membuat Zapier, atau IFTTT dan perlu menyimpan data konfigurasi untuk setiap integrasi)

Saya yakin ada yang lain juga, tetapi ini hanya beberapa contoh singkat.

Jawaban Asli

Jika Anda benar-benar ingin dapat menambahkan bidang sebanyak yang Anda inginkan tanpa batasan (selain batas ukuran dokumen arbitrer), pertimbangkan solusi NoSQL seperti MongoDB.

Untuk database relasional:gunakan satu kolom per nilai. Menempatkan gumpalan JSON di kolom membuat kueri hampir tidak mungkin (dan sangat lambat saat Anda benar-benar menemukan kueri yang berfungsi).

Basis data relasional memanfaatkan tipe data saat pengindeksan, dan dimaksudkan untuk diimplementasikan dengan dinormalisasi struktur.

Sebagai catatan tambahan:ini bukan berarti Anda tidak boleh menyimpan JSON dalam database relasional. Jika Anda menambahkan metadata yang sebenarnya, atau jika JSON Anda menjelaskan informasi yang tidak perlu ditanyakan dan hanya digunakan untuk tampilan, mungkin berlebihan untuk membuat kolom terpisah untuk semua titik data.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menampilkan Kumpulan Server di MySQL

  2. Kesalahan MySQL/PHP:[2002] Biasanya hanya satu penggunaan dari setiap alamat soket (protokol/alamat jaringan/port) yang diizinkan

  3. Bagaimana saya bisa menulis SQL untuk tabel yang memiliki nama yang sama dengan kata kunci yang dilindungi di MySql?

  4. Tidak dapat mengubah kolom yang digunakan dalam batasan kunci asing

  5. Injeksi SQL di ADOdb dan keamanan situs web umum