JavaScript Object Notation (JSON) adalah format file berbasis teks ringan yang mirip dengan YAML atau XML yang menyederhanakan pertukaran data. Itu ditemukan oleh Douglas Crockford pada awal 2000-an dan menjadi semakin populer dengan munculnya database berbasis dokumen (juga disebut NoSQL).
JSON mendukung string, angka, boolean, objek, dan array serta nilai null. Contoh JSON sederhana yang berisi key-value pair, objek "bandMembers" dan array "songs" akan terlihat seperti ini
JSON
{ "artist": "Starlord Band", "bandMembers": { "vocals": "Steve Szczepkowski", "guitar": "Yohann Boudreault", "bass": "Yannick T.", "drums": "Vince T." }, "bandMembersCount": 4, "album": "Space Rider", "releaseDate": "2021-10-25", "songs": [ "Zero to Hero", "Space Riders with No Names", "Ghost", "Bit of Good (Bit of Bad)", "Watch me shine", "We’re Here", "The Darkness inside", "No Guts No Glory", "All for One", "Solar Skies" ], "songsCount": 10 }MySQL telah mengimplementasikan dukungan dasar untuk tipe data JSON dengan versi 5. 7. 8 pada pertengahan 2015 dan telah menambahkan peningkatan dan fitur baru sejak saat itu. Tujuh tahun kemudian, MySQL sekarang mendukung banyak fungsi SQL untuk bekerja dengan dokumen JSON, menyediakan validasi konten otomatis, memungkinkan pembaruan sebagian di tempat, dan menggunakan format penyimpanan biner untuk meningkatkan kinerja
Database relasional mengikuti struktur yang telah ditentukan dan menekankan pada kohesi dan integritas data. Untuk mencapai ini, tipe dan format datanya, serta ukuran datanya, semuanya ditegakkan secara ketat melalui skema.
Tipe data JSON sedikit anti-pola terhadap sifat ketat dari skema semacam itu. Ini memungkinkan Anda untuk keluar darinya, untuk mendapatkan fleksibilitas saat Anda membutuhkannya. Dan itu terbukti bermanfaat selama Anda mengetahui kompromi yang dijelaskan di bagian selanjutnya
Beberapa contoh kapan mungkin bermanfaat untuk menyimpan data sebagai dokumen JSON adalah
- Keluaran log yang ditulis oleh aplikasi atau server
- Respons Rest API yang ingin Anda simpan
- Menyimpan data konfigurasi
- Satu set entitas dengan atribut variabel
Anda juga dapat menggunakan dokumen JSON dalam desain database relasional untuk memecah relasi kompleks yang mencakup beberapa tabel. Proses ini disebut denormalisasi, yang merupakan anti-pola basis data relasional lainnya. Namun, dalam kasus tertentu, ini dapat menghasilkan peningkatan kinerja tergantung pada kasus penggunaan dan desain aplikasi Anda
Fleksibilitas yang diberikan oleh tipe data JSON hadir dengan beberapa peringatan yang perlu Anda ketahui
Terutama, Anda perlu mempertimbangkan bahwa dokumen JSON sering kali membutuhkan lebih banyak kapasitas penyimpanan. Di MySQL, jejak penyimpanannya mirip dengan tipe data CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);1 atau CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);2. Ada overhead, karena pengkodean biner dan tambahan metadata dan kamus yang ada untuk mempercepat pembacaan basis data. Aturan praktis yang baik adalah bahwa string yang disimpan di JSON menggunakan sekitar 4 hingga 10 byte penyimpanan tambahan dibandingkan dengan kolom CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);1 atau CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);2
Jika Anda ingin mengoptimalkan skema database Anda untuk efisiensi penyimpanan, yang terbaik adalah menggunakan tipe data MySQL yang lebih tradisional (CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);5, CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);6, CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);7, dan sejenisnya), karena semuanya lebih hemat penyimpanan daripada JSON yang mungkin pernah ada
Peringatan lain yang harus diperhatikan adalah dampak kinerja. Mirip dengan format biner lainnya, dokumen JSON tidak dapat diindeks secara langsung. Ini, dan jumlah variabel data yang dapat Anda simpan dalam dokumen JSON, berarti bahwa meminta kolom JSON sering kali menggunakan lebih banyak ruang buffer dan mengembalikan kumpulan hasil yang lebih besar, yang mengarah ke lebih banyak pertukaran data
Catatan. Meskipun dokumen JSON tidak dapat diindeks secara langsung di MySQL, dokumen tersebut dapat diindeks secara tidak langsung. Pelajari caranya di Pengindeksan JSON di MYSQL
Meskipun dokumen JSON yang disimpan di MySQL dapat berukuran hingga 1 GB, secara teori, disarankan untuk menyimpan dokumen JSON dengan ukuran hanya beberapa MB. Di PlanetScale, kami mendukung dokumen JSON hingga 67 MB
MySQL hadir dengan serangkaian fungsi JSON yang kuat yang memungkinkan Anda membuat, memperbarui, membaca, atau memvalidasi dokumen JSON Anda. PlanetScale mendukung semua fungsi JSON kecuali CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);8
Mari kita telusuri beberapa contoh bersama
Pertama, kita membuat tabel dengan kolom CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);_9 dan CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);0
SQL
CREATE TABLE songs (id int AUTO_INCREMENT PRIMARY KEY NOT NULL, songs JSON);_Tabel kosong membutuhkan data, jadi mari gunakan INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));1 untuk menambahkan beberapa
SQL
INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));Bagaimana kita tahu ini adalah array?
SQL
SELECT JSON_TYPE(songs) FROM songs; +------------------+ | json_type(songs) | +------------------+ | ARRAY | +------------------+Jika kita ingin mengekstrak item dari array, kita dapat melakukannya dengan INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));3. Dalam contoh di bawah ini, kami mengekstrak elemen keempat dari array
SQL
blog-mysql-json/main> SELECT JSON_EXTRACT(songs, '$[3]') FROM songs; +-----------------------------+ | json_extract(songs, '$[3]') | +-----------------------------+ | "Ghost" | +-----------------------------+Kita juga dapat menggunakan INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));_4, yang setara dengan operator untuk INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));3
SQL
Jika kita membutuhkan hasil yang tidak dikutip, kita dapat menggunakan INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));6, yang merupakan kependekan dari INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));7
SQL
blog-mysql-json/main> SELECT songs->>'$[3]' FROM songs; +------------------+ | songs ->> '$[3]' | +------------------+ | Ghost | +------------------+Jika kita perlu menambahkan data ke array JSON, kita dapat menggunakan INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));8 atau INSERT INTO songs VALUES(id, JSON_ARRAY('Zero to Hero', 'Space Riders with No Names', 'Ghost', 'Bit of Good (Bit of Bad)', 'Watch me shine', 'We\'re Here', 'The Darkness inside', 'No Guts No Glory', 'All for One', 'Solar Skies'));9 untuk memperbaruinya
SQL
UPDATE songs SET songs = JSON_ARRAY_APPEND(songs, '$', "One last song"); UPDATE songs SET songs = JSON_ARRAY_INSERT(songs, '$[0]', "First song");Untuk informasi selengkapnya tentang cara menggunakan semua fungsi JSON yang berbeda, silakan lihat dokumentasi MySQL untuk tipe data JSON dan referensi Fungsi JSON