📖 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:
- .value(): Izvlači skalarnu vrijednost (npr. string ili broj) iz XML-a.
- .nodes(): "Razbija" XML u set redova (tabelarna forma).
- .exist(): Provjerava da li određeni čvor postoji (vraća 1 ili 0).
- .query(): Vraća novi XML fragment na osnovu XQuery izraza.
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.
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:
- 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.
- 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
- PATH Index: Ubrzava pretrage po putanjama (npr.
-- 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'.
-- 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:
- ✅ Native storage je kompaktniji i brži od običnog teksta.
- ✅ XQuery omogućava kompleksnu navigaciju kroz stablo podataka.
- ✅ XML Indexes rješavaju probleme performansi na velikim dokumentima.
📚 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.