JSON Veri Tipiyle SQL'de Yarı Yapılandırılmış Veri İşleme

Modern uygulamalarda API'lerden gelen veya kullanıcı tercihlerini tutan veriler genellikle JSON formatındadır. SQL veritabanlarında bu yarı yapılandırılmış verileri işlemek artık standart bir ihtiyaç. PostgreSQL, MySQL ve SQL Server'ın hepsi JSON desteği sunuyor.

Sorunu çerçeveleyelim: Bir e-ticaret uygulamasında ürünlerin teknik özellikleri JSON olarak saklanıyor. Örneğin telefon ürünü için ekran boyutu, işlemci, RAM gibi veriler JSON içinde tutuluyor. Bu verileri sorgulamak, filtrelemek ve güncellemek gerekiyor.

PostgreSQL ile başlayalım. Tablo oluşturup JSON verisi ekleyelim:

1CREATE TABLE products (
2id SERIAL PRIMARY KEY,
3name VARCHAR(100),
4specs JSONB
5);
6
7INSERT INTO products (name, specs) VALUES
8('iPhone 15', '{"screen": 6.1, "ram": 6, "processor": "A17", "colors": ["black", "white", "blue"]}'::JSONB),
9('Samsung S24', '{"screen": 6.2, "ram": 8, "processor": "Snapdragon", "colors": ["gray", "white"]}'::JSONB);

Şimdi JSON alanlarını sorgulamak:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1-- JSON alanından değer çıkartma
2SELECT name, specs->>'processor' AS processor
3FROM products;
4
5-- Çıktı:
6-- name | processor
7-- iPhone 15 | A17
8-- Samsung S24 | Snapdragon
9
10-- Array içinde arama
11SELECT name FROM products
12WHERE specs->'colors' @> '"black"'::JSONB;
13
14-- Çıktı: iPhone 15

MySQL'de yaklaşım biraz farklı:

1CREATE TABLE products (
2id INT PRIMARY KEY AUTO_INCREMENT,
3name VARCHAR(100),
4specs JSON
5);
6
7INSERT INTO products (name, specs) VALUES
8('iPhone 15', JSON_OBJECT('screen', 6.1, 'ram', 6, 'processor', 'A17')),
9('Samsung S24', JSON_OBJECT('screen', 6.2, 'ram', 8, 'processor', 'Snapdragon'));
10
11-- JSON değeri çıkartma
12SELECT name, JSON_EXTRACT(specs, '$.processor') AS processor
13FROM products;
14
15-- Şartlı sorgulama
16SELECT name FROM products
17WHERE JSON_EXTRACT(specs, '$.ram') > 6;
18
19-- Çıktı: Samsung S24

JSON verisi güncellemek:

1-- PostgreSQL: JSON güncelleme
2UPDATE products
3SET specs = jsonb_set(specs, '{ram}', '12')
4WHERE name = 'iPhone 15';
5
6-- MySQL: JSON güncelleme
7UPDATE products
8SET specs = JSON_SET(specs, '$.ram', 12)
9WHERE name = 'iPhone 15';

Sık yapılan hata: JSON operatörleri (->, @>) PostgreSQL'e özgüdür. MySQL'de JSON_EXTRACT(), JSON_CONTAINS() kullanmanız gerekir. Ayrıca PostgreSQL'de JSONB (binary) kullanın; JSON (text) daha yavaştır. Indexed sorgular için JSONB şart.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz