JSON sütunlarını ve dizinlerini yönetme

Tamamlandı

bir tablodaki her satır aynı sütunlara sahip olduğunda ilişkisel veritabanları en iyi şekilde çalışır. Yapıyı bir kez tanımlarsınız ve her kayıt onu izler. Bu tasarım, alanların tahmin edilebilir olduğu müşteriler, siparişler veya faturalar gibi veriler için iyi çalışır. Ancak bazı veriler kayıttan kayda değişir. Depolamanız gereken öznitelikler öğenin türüne, verilerin kaynağına veya kullanıcılar tarafından yapılan seçimlere bağlıdır. Geleneksel tablo tasarımı sizi çoğu satır için boş olan çok sayıda sütun oluşturmaya veya verileri birçok tabloya bölmeye zorlar. JSON sütunları başka bir seçenek sunar: değişken parçaları JSON olarak depolarken, tahmin edilebilir bölümleri normal sütunlarda tutar.

Örneğin, bir e-ticaret ürün kataloğunda ürün adı, fiyat ve her öğe için geçerli olan kategori gibi ortak alanlar bulunur. Ancak bir gömleğin boyut ve renge, dizüstü bilgisayarın işlemci hızına ve ekran boyutuna, kitap ise yazar ve diğer özniteliklere ihtiyaç duyar. JSON ile ortak alanları sütun olarak depolar ve kategoriye özgü öznitelikleri bir JSON sütununa koyarsınız. Tablo yapısını değiştirmeden yeni ürün türleri ekleyebilirsiniz.

JSON sütunlarının ne zaman kullanılacağını anlama

JSON sütunları , tanıdık SQL söz dizimlerini kullanarak yarı yapılandırılmış verileri sorgulamanıza ve dizine eklemenize olanak sağlar. Esnek verileri işlemek için ayrı bir NoSQL veritabanına ihtiyacınız yoktur. Şu senaryolar için JSON'i göz önünde bulundurun:

  • Kullanıcı tercihleri - Tema, dil ve bildirim seçenekleri gibi ayarlar kullanıcı başına farklılık gösterir ve özellik ekledikçe değişir.
  • API yanıtları - Dış hizmetlerden alınan veriler, sağlayıcı API'sini güncelleştirdiğinde değişebilecek iç içe yerleştirilmiş yapılara sahiptir.
  • Denetim günlükleri - Tablo şemalarınız geliştikçe durumların önce ve sonrasını yakalayan kayıtların uyarlanmış olması gerekir.
  • Çok kiracılı uygulamalar - Farklı müşteriler farklı özel alanlara ihtiyaç duyar.
  • Esnek meta veriler - Kayda göre değişen ve sabit bir şemaya uymayan etiketler, etiketler ve özellikler.

JSON sütunları oluşturma ve sorgulama

SQL Server 2025, JSON belgelerini sorgulama ve işleme için iyileştirilmiş ikili biçimde depolayan yerel bir json veri türü sağlar. Yerel tür daha verimli okumalar (belge zaten ayrıştırılmış), daha verimli yazmalar (güncelleştirmeler belgenin tamamını yeniden yazmadan tek tek değerleri değiştirebilir) ve JSON'yi olarak NVARCHAR(MAX)depolamaya kıyasla daha iyi depolama sıkıştırması sağlar.

SQL Server'ın önceki sürümleri için JSON'ı bir NVARCHAR(MAX) sütunda depolarsınız.

JSON'dan değerleri okumak için tek bir değer ayıklamak veya bir nesne ya da dizi döndürmek gibi JSON_VALUEJSON_QUERY kullanırsınız. Bir JSON özelliğini sık sık sorgularsanız, bu özelliği ayıklayan hesaplanan bir sütunda dizin oluşturabilirsiniz.

Aşağıdaki örnek JSON sütunu olan bir tablo oluşturur, belgeler ekler, belirli özellikleri sorgular, değerleri güncelleştirir ve sık erişilen bir alanda dizin oluşturur:

-- 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);

Bu örnek, kullanıcı yapılandırma ayarlarını depolayan bir sütuna sahip bir JSON tablo oluşturur. INSERT deyimleri JSON belgelerini dize değişmezleri olarak ekler. Belirli değerleri okumak için tema JSON_VALUE ve dil gibi skaler değerleri ayıklarken JSON_QUERY JSON nesnesinin tamamını döndürür. .modify() yöntemi (şu anda önizleme aşamasındadır) belgenin tamamını yeniden yazmadan tek bir özelliği güncelleştirir. json Tür bir dizin anahtarı sütunu olarak kullanılamadığından, örnek tema değerini ayıklayan hesaplanan bir sütun oluşturur ve ardından hesaplanan sütunu dizinler.

İlişkisel ve JSON yapısını birleştirme

JSON sütunları, kayda göre değişen veriler için en iyi şekilde çalışır. Her satırda tutarlı veri türleriyle aynı alanlar varsa, normal sütunlar daha uygun olur. Yerel veri türü doğrulaması, JSON yolu söz dizimi olmadan daha basit sorgular ve sütunlarda doğrudan dizin oluşturma elde edersiniz. Verilerinizin esnekliğe ihtiyaç duyan bölümleri için JSON kullanın ve yazılan sütunlarda öngörülebilir bölümleri koruyun.

Değişken meta veriler gerektiren ürünler için ilişkisel yapıyı JSON esnekliğiyle birleştirebilirsiniz. Bir örnek aşağıda verilmiştir:

-- 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;

JSON tasarım ilkelerini göz önünde bulundurun

JSON sütunlarını uygularken şu ilkeleri uygulayın:

  • Yarı yapılandırılmış veriler için JSON kullanma - Tutarlı şemalara sahip verileri değil, kayda göre değişen esnek veri yapılarını depolayın.
  • Sık sorgulanan yolları dizinle - Sık sorguladığınız JSON özelliklerinde dizinlerle hesaplanan sütunlar oluşturun.
  • Gerekli özellikleri doğrulama - Gerekli alanların mevcut olduğundan emin olmak için ile CHECK kısıtlamalarını kullanınJSON_PATH_EXISTS.
  • Yapı ile esnekliği dengeleme - Normal sütunlarda öngörülebilir verileri koruyun ve yalnızca değişken parçalar için JSON kullanın.

JSON sütunları, SQL sorgu özelliklerini korurken değişken veriler için şema esnekliği sağlar, ancak yapılandırılmış veriler için ilişkisel tasarımı değiştirmek yerine tamamlayıcı olmalıdır.