JSON sebagai niat
Tidak ada cara untuk bekerja dengan JSON di MySQL. Beberapa DBMS mungkin mendukung JSON, tetapi itu tidak mungkin, dan, selain itu, "dukungan" semacam itu hanya tentang melakukan beberapa operasi khusus JSON, tetapi bukan tentang memodelkan arsitektur Anda (dan kedua hal itu sama sekali berbeda) Selengkapnya , dalam arti penuh, konsep model (yaitu hubungan) untuk MySQL berbeda dari JSON adalah:sebagai DBMS Relasional, mengikuti model data relasional , dan JSON adalah format yang sama sekali berbeda. Anda akan menyimpannya sebagai nilai string biasa, dengan demikian, tidak mungkin melakukan apa pun dengannya dengan cara lain, jika tidak menggunakan fungsi string. Jadi, bahkan bekerja dengan JSON, Anda tidak akan melakukannya di dalam model relasional, dengan demikian, tidak mungkin mempertahankan fitur relasional, seperti integritas referensial, misalnya.
Opsi untuk diselesaikan
Anda memiliki beberapa opsi:
- Bermigrasi ke Postgree SQL karena telah memperluas dukungan untuk json, sejak versi 9.4 jsonb dan itu bahkan lebih cepat. Ini mungkin pilihan terbaik karena ini adalah RDBMS dan oleh karena itu migrasi tidak akan terlalu sulit seperti untuk DBMS yang benar-benar berorientasi dokumen.
- Atau migrasi ke Mongo sekarang (jika itu niat Anda), sebelum terlambat. Perhatikan, bahwa Mongo benar-benar berbeda dari RDBMS, berorientasi pada dokumen. Saya rasa ini adalah opsi terbaik untuk proyek Anda dan untuk klien Anda (dan tugas Anda adalah menjelaskannya)
- Ubah seluruh arsitektur sehingga Anda tidak akan menyimpan objek JSON dan akan bekerja dengan entitas yang dinormalisasi (dalam hal DB relasi). Ini berarti - ya, pemfaktoran ulang seluruh kode, mengubah semua relasi, dll. Dalam situasi nyata ini hanya opsi teoretis, Anda tidak akan diberi waktu atau uang untuk itu.
- Terapkan perpustakaan JSON Anda sendiri untuk MySQL. Apakah sulit? Tergantung apa yang akan Anda lakukan dengan JSON Anda, tetapi JSON
adalah format publik, jadi Anda akan tahu apa yang harus dilakukan, setidaknya. Anda dapat melakukannya sebagai UDF
atau di user-land (jadi dengan
CREATE FUNCTION
penyataan). Ini akan membutuhkan keterampilan dan waktu khusus, tentu saja. Hal-hal buruk:bug. Bahkan jika Anda dapat membuat fungsi-fungsi itu lebih cepat daripada menyusun ulang arsitektur Anda atau bermigrasi ke Mongo, Anda tidak akan pernah yakin akan kualitas fungsi-fungsi itu. Tidak ada cara untuk menguji kode itu secara asli. Namun, saya dapat memberikan petunjuk untuk kasus fungsi lahan pengguna - Anda dapat menggunakanmysql-unit
untuk menguji kode tersimpan Anda, jika MySQL Anda 5.6 atau lebih tinggi (well, saya telah menulis alat ini, tapi.. mungkin berisi bug juga)
Fungsi "Standar"
Terakhir, jika Anda menjalankan MySQL 5.7, maka mungkin ada secercah harapan dengan fungsi JSON pra-rilis - jadi, Anda boleh mencoba untuk menggunakan fungsionalitas JSON versi alfa, yang saat ini ada untuk MySQL 5.7. Tetapi saya tidak akan (sangat) merekomendasikan untuk menggunakannya dalam proyek nyata karena fungsi-fungsi itu tidak teruji dengan baik atau tidak lengkap sama sekali. Namun, untuk menginstal fungsi tersebut, Anda harus mengunduh paket yang sesuai, lalu menghubungkannya ke server Anda, seperti:
CREATE FUNCTION json_append RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_valid RETURNS integer SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_extract RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_replace RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_remove RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_set RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_merge RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_search RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_contains_key RETURNS integer SONAME 'libmy_json_udf.so';
Dan setelah itu Anda bisa mencobanya.