JSON Sorgulama
Ders 10: JSON Sorgulama
Section titled “Ders 10: JSON Sorgulama”Öğrenme Hedefleri
Section titled “Öğrenme Hedefleri”Bu dersi tamamladıktan sonra:
- JSON verilerini D1’de nasıl saklayacağınızı öğreneceksiniz
- JSON fonksiyonlarını (json_extract, json_insert, vb.) kullanabileceksiniz
- Generated columns ile JSON sorgulama yapabileceksiniz
- JSON veri optimizasyonu yapabileceksiniz
İçerik İçindekiler
Section titled “İçerik İçindekiler”JSON Veri Saklama
Section titled “JSON Veri Saklama”TEXT Kolonunda JSON
Section titled “TEXT Kolonunda JSON”CREATE TABLE events ( id INTEGER PRIMARY KEY, event_data TEXT NOT NULL -- JSON verisi);
-- JSON verisi eklemeINSERT INTO events (event_data) VALUES ('{ "type": "user_login", "user_id": 123, "timestamp": "2024-01-29T10:30:00Z", "metadata": { "ip": "192.168.1.1", "user_agent": "Mozilla/5.0..." }}');JSON Fonksiyonları
Section titled “JSON Fonksiyonları”json_extract
Section titled “json_extract”JSON verisinden değer çıkarma:
-- Basit değer çıkarmaSELECT json_extract(event_data, '$.type') as event_typeFROM events;
-- Nested değer çıkarmaSELECT json_extract(event_data, '$.metadata.ip') as ip_addressFROM events;
-- Array değer çıkarmaSELECT json_extract(event_data, '$.tags[0]') as first_tagFROM events;json_insert
Section titled “json_insert”JSON verisine değer ekleme:
-- Yeni anahtar eklemeUPDATE eventsSET event_data = json_insert(event_data, '$.processed', true)WHERE id = 1;
-- Array'e eklemeUPDATE eventsSET event_data = json_insert(event_data, '$.tags[#]', 'new-tag')WHERE id = 1;json_set
Section titled “json_set”JSON verisi güncelleme:
-- Mevcut değeri güncelleUPDATE eventsSET event_data = json_set(event_data, '$.processed', true)WHERE id = 1;
-- Nested değeri güncelleUPDATE eventsSET event_data = json_set(event_data, '$.metadata.ip', '10.0.0.1')WHERE id = 1;json_array_length
Section titled “json_array_length”Array uzunluğu alma:
SELECT id, json_array_length(json_extract(event_data, '$.tags')) as tag_countFROM events;JSON Sorguları
Section titled “JSON Sorguları”JSON Operatörleri
Section titled “JSON Operatörleri”-- -> operatörü (JSON olarak döner)SELECT event_data->'$.type' FROM events;
-- ->> operatörü (SQL type olarak döner)SELECT event_data->>'$.type' FROM events;JSON Filtreleme
Section titled “JSON Filtreleme”// JSON verisine göre filtrelemeconst { results } = await db .prepare(` SELECT * FROM events WHERE json_extract(event_data, '$.type') = ? `) .bind("user_login") .all();
// Nested JSON filtrelemeconst { results } = await db .prepare(` SELECT * FROM events WHERE json_extract(event_data, '$.metadata.ip') LIKE ? `) .bind("192.168.%") .run();Generated Columns
Section titled “Generated Columns”JSON’dan Generated Column
Section titled “JSON’dan Generated Column”CREATE TABLE events ( id INTEGER PRIMARY KEY, event_data TEXT NOT NULL, -- Generated columns event_type TEXT AS (json_extract(event_data, '$.type')) STORED, user_id INTEGER AS (json_extract(event_data, '$.user_id')) STORED, ip_address TEXT AS (json_extract(event_data, '$.metadata.ip')) STORED);
-- Otomatik doldurulmuş sütunları sorgulaSELECT * FROM events WHERE event_type = 'user_login';SELECT * FROM events WHERE ip_address LIKE '192.168.%';Index’li Generated Columns
Section titled “Index’li Generated Columns”-- Generated column için indexCREATE INDEX idx_events_type ON events(event_type);CREATE INDEX idx_events_user_id ON events(user_id);
-- Performanslı sorgularSELECT * FROM events WHERE user_id = 123;Performans İpuçları
Section titled “Performans İpuçları”✅ İyi Pratikler
Section titled “✅ İyi Pratikler”-- ✅ Generated columns kullanSELECT * FROM events WHERE event_type = 'login';
-- ✅ Generated columns'a index ekleCREATE INDEX idx_events_type ON events(event_type);❌ Kötü Pratikler
Section titled “❌ Kötü Pratikler”-- ❌ Her sorguda json_extract kullanSELECT * FROM events WHERE json_extract(event_data, '$.type') = 'login';
-- ❌ Büyük JSON verileri TEXT olarak sakla-- Bunun yerine ayrı tablolar kullan✅ JSON saklama yöntemleri ✅ JSON fonksiyonları ✅ Generated columns ✅ Performans optimizasyonu
Sonraki Ders
Section titled “Sonraki Ders”Foreign Keys - İlişkisel veritabanı tasarımı ve foreign key constraints.
Ders Süresi: 75 dakika Zorluk Seviyesi: Orta Ön Koşullar: Ders 9: SQL Statements