
# Schéma

Schémy sú voliteľné. Schéma plní dve nezávislé úlohy: overuje každý
zápis a deklaruje, ktoré polia získajú [indexy](https://storh.inline0.dev/sk/docs/indexes). Kolekcie
bez schémy prijímajú údaje v ľubovoľnom formáte poľa.

```php
$schema = Schema::collection('posts')
    ->string('slug')->unique()
    ->string('status')->index()
    ->int('publishedAt')->range()
    ->bool('featured')
    ->required(['slug', 'status']);

$posts = new DocStore($root, 'posts', schema: $schema);
```

Názov kolekcie v schéme sa musí zhodovať s názvom kolekcie v úložisku;
inak vytvorenie zlyhá. Odovzdaním schémy konštruktoru sa tiež okamžite
zosynchronizujú deklarované indexy.

## Pravidlá overovania

- V poliach `required` musí byť vo zapisovaných údajoch uvedená hodnota. Kontroluje sa prítomnosť: explicitná hodnota `null` spĺňa požiadavku na povinné pole.
- Typované polia sa kontrolujú iba vtedy, keď sú prítomné a nemajú hodnotu null. Pole typu `string` odmieta hodnotu `int`; pole typu `float` prijíma hodnoty `float` aj `int`.
- Polia `mixed` prijímajú ľubovoľnú hodnotu a hodia sa na označenie povinného alebo indexovaného poľa bez obmedzenia jeho typu.
- Polia, ktoré nie sú deklarované v schéme, nemajú žiadne obmedzenia.

Neúspešné overenie vyvolá `StorageException` ešte pred zápisom.

## Typy polí a príznaky

Podporované typy: `string`, `int`, `float`, `bool`, `mixed`.

Príznaky pre jednotlivé polia: `index()` (index rovnosti), `unique()` (jedinečnosť vynucovaná
pri zápise), `range()` (zoradený index pre `gt`/`lt`/`between`/`prefix` a
zoradené rozsahové dotazy) a `required()`.

## Zmeny schémy

Indexy sa synchronizujú pri vytvorení úložiska. Ak zmena schémy upraví
množinu deklarovaných indexov, zmení sa manifest indexov a dotknuté indexy
sa znova vytvoria z existujúcich záznamov. Zmeny pravidiel overovania platia iba
pre budúce zápisy a nikdy neprepíšu uložené záznamy.

Ten istý objekt `Schema` možno opakovane použiť na mapovanie typovaných stĺpcov v zrkadle [SQL](https://storh.inline0.dev/sk/docs/sql-mirror), a to aj pre kolekcie, ktorých úložisko túto schému samo nepoužíva.
