Hoşgeldin Misafir

MySQL Sorgularında JSON Kullanımı Nested Veri Yapılarının Verimli Yönetimi

Graves

Graves

Karanlık Özgürlüktür
Moderator
9 Eki 2024
10,470 Mesaj
TIM Görevleri
2

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
MySQL Sorgularında JSON Kullanımı Nested Veri Yapılarının Verimli Yönetimi

Merhabalar Ben @Phobos Lojistik grup adına paylaşılan MySQL Sorgularında JSON Kullanımı Nested Veri Yapılarının Verimli Yönetimi makalesinde sizi görmekten mutluyum.

Günümüzde birçok uygulama, esnek ve yapılandırılmış veri modellerine ihtiyaç duyar. JSON (JavaScript Object Notation), bu ihtiyaca yönelik hafif ve okunabilir bir veri formatıdır. MySQL 5.7 sürümünden itibaren JSON veri türünü yerleşik olarak desteklemektedir. Bu destek sayesinde, özellikle nested (iç içe) veri yapılarının saklanması ve sorgulanması mümkün hale gelmiştir.

Bu makalede MySQL'de JSON veri türü ile çalışmanın temelleri, nested veri yapılarını yönetme teknikleri ve performans ipuçları anlatılmaktadır.


JSON Veri Türü Nedir?

MySQL'deki JSON veri türü, geçerli JSON belgelerini saklamak için kullanılır. Dizi, nesne, sayı, string gibi yapıları barındırabilir.

Tablo oluştururken JSON sütunu şu şekilde tanımlanabilir

Kod:
CREATE TABLE urunler (
id INT AUTO_INCREMENT PRIMARY KEY,
adi VARCHAR(255),
ozellikler JSON
);

Bu tabloda ozellikler sütunu, ürünle ilgili çeşitli özellikleri (örneğin renk, beden, stok) JSON biçiminde tutar.


JSON Veri Ekleme

JSON sütununa veri eklerken geçerli JSON formatına uymak gerekir

Kod:
INSERT INTO urunler (adi, ozellikler)
VALUES (
'T-Shirt',
'{
"renk": "mavi",
"beden": "L",
"stok": {
"depo1": 120,
"depo2": 45
}
}'
);

Burada stok bir nested (iç içe) JSON nesnesidir.


JSON Değerlerini Sorgulama

-> ve ->> Operatörleri

  • -> JSON içinden veri döner (JSON formatında)
  • ->> düz metin (string) olarak veri döner

Kod:
-- Beden değerini düz string olarak getirir
SELECT adi, ozellikler->>'$.beden' AS beden FROM urunler;


-- Stok içindeki depo1 değerini JSON olarak getirir
SELECT ozellikler->'$.stok.depo1' AS depo1_stok FROM urunler;

Nested (İç İçe) JSON Alanlarına Erişim

İç içe alanlardaki verilere ulaşmak için JSON yol (path) ifadeleri kullanılır

Kod:
-- depo1 alanı 100'den büyük olan ürünleri getir
SELECT * FROM urunler
WHERE CAST(ozellikler->'$.stok.depo1' AS UNSIGNED) > 100;

JSON Veri Üretimi

MySQL içinde JSON verisi oluşturmak için aşağıdaki fonksiyonlar kullanılabilir

Kod:
-- JSON array oluşturur
SELECT JSON_ARRAY('red', 'green', 'blue');


-- JSON nesnesi (object) oluşturur
SELECT JSON_OBJECT('renk', 'siyah', 'beden', 'M');

JSON Alanlarını Güncelleme

JSON_SET, JSON_INSERT, JSON_REPLACE

Bu fonksiyonlar, JSON verilerini dinamik olarak değiştirmek için kullanılır

  • JSON_SET: Belirtilen anahtarı ekler ya da günceller.
  • JSON_INSERT: Sadece anahtar yoksa ekler.
  • JSON_REPLACE: Sadece anahtar varsa günceller.
Kod:
-- depo3 alanını 33 olarak ayarlar
UPDATE urunler
SET ozellikler = JSON_SET(ozellikler, '$.stok.depo3', 33)
WHERE id = 1;

JSON İçeriğinde Arama

JSON_CONTAINS

Bir JSON alanında belirli bir değerin olup olmadığını kontrol eder

Kod:
-- Renk değeri "mavi" olan ürünleri getir
SELECT * FROM urunler
WHERE JSON_CONTAINS(ozellikler, '"mavi"', '$.renk');

JSON Alanlarda İndeks Kullanımı

JSON sütunlarına doğrudan indeks eklenemez, ancak sanal (virtual veya stored) sütunlar oluşturularak bu sütunlar üzerine indeks yapılabilir.

Kod:
-- Sanal bir sütun ve indeks oluşturma
ALTER TABLE urunler
ADD COLUMN beden_sanal VARCHAR(10) GENERATED ALWAYS AS (ozellikler->>'$.beden') STORED,
ADD INDEX (beden_sanal);

Bu yöntem, JSON içindeki verilere daha hızlı erişim sağlar.



Performans Önerileri

  • Sık erişilen JSON alanları için sanal sütun oluşturup indekslenmelidir.
  • JSON yapısı karmaşıklaştıkça sorguların maliyeti artabilir; sorgular optimize edilmelidir.
  • Veri bütünlüğünü sağlamak için uygulama seviyesinde kontroller yapılmalıdır.

MySQL'in JSON desteği, iç içe geçmiş ve esnek veri yapılarının ilişkisel veritabanlarında tutulmasını mümkün kılar. Nested JSON yapıları ile veri daha anlamlı ve ilişkisel olmayan şekilde saklanabilir. Ancak, performans ve bütünlük açısından dikkatli tasarım gereklidir.


btn1pyf.png
 

THS-AI

THS-AI

THS YAPAY ZEKA
Turkhacks Kurumsal
20 Haz 2025
11,254 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Nested JSON verilerini yönetmek için, MySQL'de JSON fonksiyonlarını kullan. Özellikle `JSON_EXTRACT` veya `->` operatörü ile veriyi çek, `JSON_SET` veya `JSON_INSERT` ile güncelle. Indexleme yapmayı unutma; alınan alanlara sanal indeks ekleyerek sorgu performansını arttır. Bu sayede nested yapıların yönetimi daha verimli olur.