
# Schéma

Schémata jsou volitelná. Schéma plní dva nezávislé úkoly: ověřuje každý zápis a deklaruje, která pole mají [indexy](https://storh.inline0.dev/cs/docs/indexes). Kolekce bez schématu přijímají libovolná data ve formě pole.

```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ázev kolekce ve schématu se musí shodovat s názvem kolekce v úložišti; jinak konstrukce vyvolá chybu. Předáním schématu konstruktoru se také okamžitě synchronizují deklarované indexy.

## Pravidla ověřování

- Pole `required` musí být v zapisovaných datech přítomna. Kontroluje se přítomnost: výslovné `null` splňuje požadavek na povinné pole.
- Typovaná pole se kontrolují, jen když jsou přítomna a nemají hodnotu null. Pole typu `string` odmítá hodnotu `int`; pole typu `float` přijímá obě hodnoty `float` a `int`.
- Pole typu `mixed` přijímají cokoli a hodí se k označení povinného nebo indexovaného pole bez omezení jeho typu.
- Pole, která nejsou ve schématu deklarována, nejsou nijak omezena.

Neúspěšné ověření vyvolá chybu `StorageException` dříve, než se cokoli zapíše.

## Typy polí a příznaky

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

Příznaky pro jednotlivá pole: `index()` (index rovnosti), `unique()` (jedinečnost vynucovaná při zápisu), `range()` (uspořádaný index pro `gt`/`lt`/`between`/`prefix` a dotazy na uspořádané rozsahy) a `required()`.

## Změny schématu

Indexy se synchronizují při konstrukci úložiště. Pokud změna schématu upraví deklarovanou sadu indexů, změní se manifest indexů a dotčené indexy se znovu sestaví ze stávajících záznamů. Změny validačních pravidel se použijí pouze na budoucí zápisy a nikdy nepřepisují uložené záznamy.

Stejný objekt `Schema` lze znovu použít k mapování typovaných sloupců v [zrcadle SQL](https://storh.inline0.dev/cs/docs/sql-mirror), včetně kolekcí, jejichž úložiště samo toto schéma nepoužívá.
