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 JSONB5);67INSERT INTO products (name, specs) VALUES8('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:
1-- JSON alanından değer çıkartma2SELECT name, specs->>'processor' AS processor3FROM products;45-- Çıktı:6-- name | processor7-- iPhone 15 | A178-- Samsung S24 | Snapdragon910-- Array içinde arama11SELECT name FROM products12WHERE specs->'colors' @> '"black"'::JSONB;1314-- Çıktı: iPhone 15MySQL'de yaklaşım biraz farklı:
1CREATE TABLE products (2id INT PRIMARY KEY AUTO_INCREMENT,3name VARCHAR(100),4specs JSON5);67INSERT INTO products (name, specs) VALUES8('iPhone 15', JSON_OBJECT('screen', 6.1, 'ram', 6, 'processor', 'A17')),9('Samsung S24', JSON_OBJECT('screen', 6.2, 'ram', 8, 'processor', 'Snapdragon'));1011-- JSON değeri çıkartma12SELECT name, JSON_EXTRACT(specs, '$.processor') AS processor13FROM products;1415-- Şartlı sorgulama16SELECT name FROM products17WHERE JSON_EXTRACT(specs, '$.ram') > 6;1819-- Çıktı: Samsung S24JSON verisi güncellemek:
1-- PostgreSQL: JSON güncelleme2UPDATE products3SET specs = jsonb_set(specs, '{ram}', '12')4WHERE name = 'iPhone 15';56-- MySQL: JSON güncelleme7UPDATE products8SET 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.
0 yorum