Správa sloupců a indexů JSON
Relační databáze fungují nejlépe, když má každý řádek v tabulce stejné sloupce. Strukturu definujete jednou a každý záznam následuje za ní. Tento návrh funguje dobře pro data, jako jsou zákazníci, objednávky nebo faktury, u kterých jsou pole předvídatelná. Některá data se ale liší od záznamu po záznam. Atributy, které potřebujete uložit, závisí na typu položky, zdroji dat nebo na možnostech provedených uživateli. Tradiční návrh tabulky vás přinutí buď vytvořit mnoho sloupců, které jsou prázdné pro většinu řádků, nebo rozdělit data mezi mnoho tabulek. Sloupce JSON nabízejí další možnost: uložte proměnné jako JSON a přitom udržujte předvídatelné části v pravidelných sloupcích.
Například katalog produktů elektronického obchodování obsahuje běžná pole, jako je název produktu, cena a kategorie, které platí pro každou položku. Košile ale potřebuje velikost a barvu, přenosný počítač potřebuje rychlost procesoru a velikost obrazovky a kniha potřebuje autora a další atributy. Ve formátu JSON uložíte běžná pole jako sloupce a vložíte atributy specifické pro kategorie do sloupce JSON. Můžete přidat nové typy produktů beze změny struktury tabulky.
Vysvětlení, kdy použít sloupce JSON
Sloupce JSON umožňují dotazovat a indexovat částečně strukturovaná data pomocí známé syntaxe SQL. K zpracování flexibilních dat nepotřebujete samostatnou databázi NoSQL. Zvažte JSON pro tyto scénáře:
- Uživatelské předvolby – Nastavení, jako je motiv, jazyk a možnosti oznámení, se liší podle uživatele a mění se při přidávání funkcí.
- Odpovědi rozhraní API – Data z externích služeb mají vnořené struktury, které se můžou změnit, když poskytovatel aktualizuje své rozhraní API.
- Protokoly auditu – Záznamy, které zaznamenávají před a po stavy, se musí při vývoji schémat tabulek přizpůsobit.
- Víceklientské aplikace – Různí zákazníci vyžadují různá uživatelská pole.
- Flexibilní metadata – značky, popisky a vlastnosti, které se liší podle záznamu a nevejdou do pevného schématu.
Vytváření a dotazování sloupců JSON
SQL Server 2025 zavádí nativní datový typ JSON, který ukládá dokumenty JSON v binárním formátu optimalizovaném pro dotazování a manipulaci. Nativní typ poskytuje efektivnější čtení (dokument je již analyzován), efektivnější zápisy (aktualizace mohou upravovat jednotlivé hodnoty bez přepsání celého dokumentu) a lepší komprese úložiště v porovnání s ukládáním FORMÁTU JSON jako NVARCHAR(MAX).
U starších verzí SQL Serveru ukládáte JSON do NVARCHAR(MAX) sloupce.
Pokud chcete číst hodnoty z JSON, použijte funkce JSON , jako je JSON_VALUE extrakce jedné hodnoty nebo JSON_QUERY vrácení objektu nebo pole. Pokud často dotazujete vlastnost JSON, můžete vytvořit index ve vypočítaném sloupci, který extrahuje tuto vlastnost.
Následující příklad vytvoří tabulku se sloupcem JSON, vloží dokumenty, dotazy specifické vlastnosti, aktualizuje hodnoty a vytvoří index pro často přístupné pole:
-- 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);
Tento příklad vytvoří tabulku se sloupcem JSON , který ukládá nastavení konfigurace uživatele. Příkazy INSERT přidávají dokumenty JSON jako řetězcové literály. Pokud chcete číst konkrétní hodnoty, extrahuje skalární hodnoty, JSON_VALUE jako je motiv a jazyk, a JSON_QUERY vrátí celý objekt JSON. Metoda .modify() (aktuálně ve verzi Preview) aktualizuje jednu vlastnost bez přepsání celého dokumentu.
json Vzhledem k tomu, že typ nelze použít jako sloupec s klíčem indexu, vytvoří příklad vypočítaný sloupec, který extrahuje hodnotu motivu, a pak indexuje vypočítaný sloupec.
Kombinování relační struktury a struktury JSON
Sloupce JSON fungují nejlépe pro data, která se liší podle záznamu. Pokud má každý řádek stejná pole s konzistentními datovými typy, jsou normální sloupce vhodnější. Získáte nativní ověření datového typu, jednodušší dotazy bez syntaxe cesty JSON a přímé indexování sloupců. Použijte JSON pro části dat, které potřebují flexibilitu, a udržujte předvídatelné části ve sloupcích zadaných.
Relační strukturu můžete kombinovat s flexibilitou JSON pro produkty vyžadující proměnlivá metadata. Tady je příklad:
-- 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;
Zvažte principy návrhu JSON.
Při implementaci sloupců JSON použijte tyto principy:
- Používejte JSON pro částečně strukturovaná data – slouží k ukládání flexibilních datových struktur, které se liší podle záznamu, nikoli dat s konzistentními schématy.
- Indexování často dotazovaných cest – vytvořte počítané sloupce s indexy na vlastnostech JSON, které často dotazujete.
-
Ověření požadovaných vlastností – k zajištění přítomnosti požadovaných polí použijte
CHECKomezeníJSON_PATH_EXISTS. - Vyvážení flexibility se strukturou – Udržujte předvídatelná data v pravidelných sloupcích a používejte JSON jenom pro proměnné části.
Sloupce JSON poskytují flexibilitu schématu pro proměnná data při zachování možností dotazů SQL, ale měly by místo nahrazení relačního návrhu strukturovaných dat doplnit.