MODUL 4 - LEKCIJA 2

Skladištenje i Upiti nad XML Podacima

Korištenje XQuery jezika i XML indeksa za rad sa hijerarhijskim strukturama

⏱️ Trajanje: ~3 časa 📚 Nivo: Srednji do Napredni 🎯 Praktični primjeri: 5

📖 XML u Relacijskom svijetu

Iako je JSON preuzeo primat u web API-jima, XML ostaje standard za enterprise integracije, konfiguracije i finansijske sisteme. SQL Server ima izvorni (native) XML data type koji omogućava validaciju podataka prema šemi, indeksiranje dubokih puteva i pretragu moćnim XQuery jezikom.

🔍 Ekstrakcija podataka: XML Metode

Postoje četiri glavne metode za rad sa XML kolonom:

⚡ XQuery u Praksi
DECLARE @xml XML = '

  
  
';

-- Razbijanje na tabelu
SELECT 
    T.c.value('@id', 'INT') AS ItemID,
    T.c.value('@name', 'NVARCHAR(100)') AS ItemName
FROM @xml.nodes('/Catalog/Item') AS T(c);

🏗️ Generisanje XML-a: FOR XML

Najlakši način da relacijske podatke pošaljete sistemu koji traži XML je FOR XML PATH.

💎 Konverzija SQL u XML
SELECT 
    EmployeeID AS "@ID", -- Pod navodnicima i @ znači atribut
    FirstName + ' ' + LastName AS "Name",
    Position AS "Info/Position",
    d.DepartmentName AS "Info/Department" -- Kosa crta pravi ugniježđeni tag
FROM Stats.Employees e
INNER JOIN Stats.Departments d ON e.DepartmentID = d.DepartmentID
FOR XML PATH('Employee'), ROOT('EmployeeList');

🚀 XML Indeksi: Ubrzanje Pretrage

Pretraga unutar velikih XML dokumenata je spora jer engine mora svaki put parsirati tekst. Rješenje su XML indeksi koji prethodno parsiraju XML i čuvaju strukturu u optimizovanoj formi.

Kako XML Indeksi Rade?

XML indeksi koriste hijerarhijsku strukturu da ubrzaju pretragu:

  1. Primary XML Index: Rastavlja XML na male binarne dijelove i sprema ih u internu tabelu. Ovo je osnovni indeks koji mora postojati prije sekundarnih indeksa.
  2. Secondary XML Indexes: Nadograđuju se na primarni i ubrzavaju specifične tipove pretrage:
    • PATH Index: Ubrzava pretrage po putanjama (npr. /Settings/Theme)
    • VALUE Index: Ubrzava pretrage po vrijednostima (npr. text()="Dark")
    • PROPERTY Index: Ubrzava pretrage koje kombinuju putanje i vrijednosti
🛠️ Kreiranje XML Indeksa
-- 1. Kreiranje Primary XML Index-a
CREATE PRIMARY XML INDEX IX_Users_Settings_Primary
ON Users(Settings);
GO

-- 2. Kreiranje Secondary XML Index-a (PATH)
CREATE XML INDEX IX_Users_Settings_Path
ON Users(Settings)
USING XML INDEX IX_Users_Settings_Primary
FOR PATH;
GO

-- 3. Kreiranje Secondary XML Index-a (VALUE)
CREATE XML INDEX IX_Users_Settings_Value
ON Users(Settings)
USING XML INDEX IX_Users_Settings_Primary
FOR VALUE;
GO

-- 4. Provjera XML Indeksa
SELECT 
    name AS IndexName,
    type_desc AS IndexType,
    is_primary_key AS IsPrimary
FROM sys.xml_indexes
WHERE object_id = OBJECT_ID('Users');
GO

🔑 Kada Koristiti Koji Secondary Index?

  • PATH Index: Kada pretražujete po putanjama (npr. /Settings/Theme)
  • VALUE Index: Kada pretražujete po vrijednostima bez poznavanja putanje
  • PROPERTY Index: Kada kombinujete putanje i vrijednosti u WHERE klauzuli

Napomena: Možete kreirati sva tri sekundarna indeksa ako su potrebni različiti tipovi pretrage.

🎯 Praktična Vježba: Parsiranje Konfiguracije

Zadatak: Izvlačenje User-Settings

Aplikacija čuva korisničke postavke u koloni Settings (XML). Trebate izvući imena svih korisnika kojima je Theme postavljena na 'Dark'.

💡 Rješenje
-- Pretpostavka strukture: Dark
SELECT UserName
FROM Users
WHERE Settings.exist('/Settings/Theme[text()="Dark"]') = 1;

-- Za maksimalnu brzinu na velikoj tabeli, ovdje bi trebao XML Secondary Index tipa 'VALUE'

✅ Zaključak

XML u SQL Serveru nudi fleksibilnost bez gubitka kontrole:

📚 Sljedeća Lekcija

U Lekciji 4.3 ulazimo u svijet Geografskih i Geometrijskih podataka. Naučićete kako SQL Server računa udaljenosti između gradova i kako raditi sa mapama.