Mengelola kolom dan indeks JSON
Database relasional berfungsi paling baik ketika setiap baris dalam tabel memiliki kolom yang sama. Anda menentukan struktur sekali, dan setiap catatan mengikutinya. Desain ini berfungsi dengan baik untuk data seperti pelanggan, pesanan, atau faktur di mana bidang dapat diprediksi. Tetapi beberapa data bervariasi dari rekaman ke rekaman. Atribut yang perlu Anda simpan bergantung pada jenis item, sumber data, atau pilihan yang dibuat oleh pengguna. Desain tabel tradisional memaksa Anda membuat banyak kolom yang kosong untuk sebagian besar baris, atau memisahkan data di banyak tabel. Kolom JSON menawarkan opsi lain: simpan bagian variabel sebagai JSON sambil menyimpan bagian yang dapat diprediksi dalam kolom reguler.
Misalnya, katalog produk e-niaga memiliki bidang umum seperti nama produk, harga, dan kategori yang berlaku untuk setiap item. Tetapi kemeja membutuhkan ukuran dan warna, laptop membutuhkan kecepatan prosesor dan ukuran layar, dan buku membutuhkan penulis dan atribut lainnya. Dengan JSON, Anda menyimpan bidang umum sebagai kolom dan menempatkan atribut khusus kategori dalam kolom JSON. Anda dapat menambahkan jenis produk baru tanpa mengubah struktur tabel.
Memahami kapan menggunakan kolom JSON
Kolom JSON memungkinkan Anda mengkueri dan mengindeks data semi-terstruktur menggunakan sintaks SQL yang sudah dikenal. Anda tidak memerlukan database NoSQL terpisah untuk menangani data fleksibel. Pertimbangkan JSON untuk skenario ini:
- Preferensi pengguna - Pengaturan seperti tema, bahasa, dan opsi pemberitahuan berbeda per pengguna dan berubah saat Anda menambahkan fitur.
- Respons API - Data dari layanan eksternal memiliki struktur berlapis yang dapat berubah saat penyedia memperbarui API mereka.
- Log audit - Rekaman yang merekam status sebelum dan sesudah harus beradaptasi saat skema tabel Anda berkembang.
- Aplikasi multi-tenant - Pelanggan yang berbeda memerlukan bidang kustom yang berbeda.
- Metadata fleksibel - Tag, label, dan properti yang bervariasi menurut rekaman dan tidak sesuai dengan skema tetap.
Membuat dan mengkueri kolom JSON
SQL Server 2025 memperkenalkan jenis data json asli yang menyimpan dokumen JSON dalam format biner yang dioptimalkan untuk kueri dan manipulasi. Jenis asli menyediakan bacaan yang lebih efisien (dokumen sudah diurai), penulisan yang lebih efisien (pembaruan dapat memodifikasi nilai individual tanpa menulis ulang seluruh dokumen), dan kompresi penyimpanan yang lebih baik dibandingkan dengan menyimpan JSON sebagai NVARCHAR(MAX).
Untuk versi SQL Server yang lebih lama, Anda menyimpan JSON dalam NVARCHAR(MAX) kolom.
Untuk membaca nilai dari JSON, Anda menggunakan fungsi JSON seperti JSON_VALUE mengekstrak satu nilai atau JSON_QUERY mengembalikan objek atau array. Jika Anda sering mengkueri properti JSON, Anda bisa membuat indeks pada kolom komputasi yang mengekstrak properti tersebut.
Contoh berikut membuat tabel dengan kolom JSON, menyisipkan dokumen, mengkueri properti tertentu, memperbarui nilai, dan membuat indeks pada bidang yang sering diakses:
-- Create table with native JSON type (SQL Server 2025+)
CREATE TABLE ConfigurationData (
ConfigID INT PRIMARY KEY,
ConfigSettings JSON NOT NULL
);
-- Insert JSON documents
INSERT INTO ConfigurationData (ConfigID, ConfigSettings)
VALUES (1, '{"theme":"dark","language":"en","notifications":true}');
INSERT INTO ConfigurationData (ConfigID, ConfigSettings)
VALUES (2, '{"theme":"light","language":"fr","notifications":false}');
-- Query JSON properties
SELECT ConfigID,
JSON_VALUE(ConfigSettings, '$.theme') AS Theme,
JSON_VALUE(ConfigSettings, '$.language') AS Language,
JSON_QUERY(ConfigSettings, '$') AS FullConfig
FROM ConfigurationData;
-- Update a single property using the modify method (SQL Server 2025+ preview)
UPDATE ConfigurationData
SET ConfigSettings.modify('$.theme', 'light')
WHERE ConfigID = 1;
-- Alternative: JSON_MODIFY works with both JSON and NVARCHAR(MAX) columns
UPDATE ConfigurationData
SET ConfigSettings = JSON_MODIFY(CAST(ConfigSettings AS NVARCHAR(MAX)), '$.notifications', CAST(0 AS BIT))
WHERE ConfigID = 1;
-- Create index on frequently queried JSON property
ALTER TABLE ConfigurationData
ADD ThemeValue AS JSON_VALUE(ConfigSettings, '$.theme');
CREATE INDEX IX_Theme ON ConfigurationData(ThemeValue);
Contoh ini membuat tabel dengan JSON kolom yang menyimpan pengaturan konfigurasi pengguna. Pernyataan INSERT menambahkan dokumen JSON sebagai literal string. Untuk membaca nilai tertentu, JSON_VALUE mengekstrak nilai skalar seperti tema dan bahasa, sambil JSON_QUERY mengembalikan seluruh objek JSON. Metode .modify() (saat ini dalam pratinjau) memperbarui satu properti tanpa menulis ulang seluruh dokumen. Jenis json tidak dapat digunakan sebagai kolom kunci indeks, contoh ini membuat kolom terhitung untuk mengekstrak nilai tema, lalu mengindeks kolom terhitung tersebut.
Menggabungkan struktur relasional dan JSON
Kolom JSON berfungsi paling baik untuk data yang bervariasi menurut rekaman. Jika setiap baris memiliki bidang yang sama dengan jenis data yang konsisten, kolom reguler lebih cocok. Anda mendapatkan validasi jenis data asli, kueri yang lebih sederhana tanpa sintaks jalur JSON, dan pengindeksan langsung pada kolom. Gunakan JSON untuk bagian data Anda yang membutuhkan fleksibilitas, dan pertahankan bagian yang dapat diprediksi dalam kolom yang ditik.
Anda dapat menggabungkan struktur relasional dengan fleksibilitas JSON untuk produk yang membutuhkan metadata variabel. Berikut adalah sebuah contoh:
-- Product with flexible metadata (SQL Server 2025+)
CREATE TABLE ProductMetadata (
ProductID INT PRIMARY KEY,
AdditionalAttributes JSON NOT NULL
CHECK (JSON_PATH_EXISTS(AdditionalAttributes, '$.weight') = 1),
FOREIGN KEY (ProductID) REFERENCES Product(ProductID)
);
-- Store flexible product attributes
INSERT INTO ProductMetadata (ProductID, AdditionalAttributes)
VALUES (1, '{"dimensions":{"length":10,"width":5,"height":8},"weight":2.5,"color":"blue"}');
-- Query nested JSON properties
SELECT ProductID,
JSON_VALUE(AdditionalAttributes, '$.weight') AS Weight,
JSON_VALUE(AdditionalAttributes, '$.dimensions.length') AS Length
FROM ProductMetadata;
Pertimbangkan prinsip desain JSON
Terapkan prinsip-prinsip ini saat menerapkan kolom JSON:
- Gunakan JSON untuk data semi-terstruktur - Simpan struktur data fleksibel yang bervariasi menurut rekaman, bukan data dengan skema yang konsisten.
- Indeks jalur yang sering dikueri - Buat kolom komputasi dengan indeks pada properti JSON yang sering Anda kueri.
-
Validasi properti yang diperlukan - Gunakan
CHECKbatasan denganJSON_PATH_EXISTSuntuk memastikan bidang yang diperlukan ada. - Seimbangkan fleksibilitas dengan struktur - Simpan data yang dapat diprediksi di kolom reguler dan gunakan JSON hanya untuk bagian variabel.
Kolom JSON memberikan fleksibilitas skema untuk data variabel sambil mempertahankan kemampuan kueri SQL, tetapi harus melengkapi daripada mengganti desain relasional untuk data terstruktur.