
# Skeem

Skeemid on valikulised. Skeem täidab kaht teineteisest sõltumatut ülesannet: valideerib iga kirjutuse ja määrab, millistele väljadele luuakse [indeksid](https://storh.inline0.dev/et/docs/indexes). Skeemita kogumid aktsepteerivad suvalisi massiivandmeid.

```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);
```

Skeemi koguminimi peab ühtima salvesti koguminimega, vastasel juhul viskab loomine vea. Skeemi edastamine konstruktorile sünkroonib kohe ka määratud indeksid.

## Valideerimisreeglid

- `required` väljad peavad kirjutatavates andmetes olemas olema. Kontrollitakse välja olemasolu: selgesõnaline `null` vastab nõutud väljale.
- Tüübitud välju kontrollitakse ainult siis, kui need on olemas ega ole nullväärtusega. Väli `string` lükkab väärtuse `int` tagasi; väli `float` aktsepteerib nii `float` kui ka `int`.
- `mixed` väljad aktsepteerivad kõike ning on kasulikud välja nõutuks või indekseerituks märkimiseks selle tüüpi piiramata.
- Skeemis määramata väljadele piiranguid ei seata.

Valideerimise ebaõnnestumisel visatakse `StorageException` enne kirjutamist.

## Väljatüübid ja lipud

Toetatud tüübid: `string`, `int`, `float`, `bool`, `mixed`.

Väljapõhised lipud: `index()` (võrdsusindeks), `unique()` (unikaalsust kontrollitakse kirjutamise ajal), `range()` (järjestatud indeks valikute `gt`/`lt`/`between`/`prefix` ja järjestatud vahemikupäringute jaoks) ning `required()`.

## Skeemi muutmine

Indeksid sünkroonitakse salvesti loomisel. Kui skeemimuutus muudab määratud indeksite hulka, muutub indeksimanifest ja mõjutatud indeksid luuakse olemasolevate kirjete põhjal uuesti; valideerimisreeglite muudatused kehtivad ainult tulevastele kirjutustele ega kirjuta salvestatud kirjeid kunagi ümber.

Sama `Schema` objekti saab korduskasutada tüübitud veergude vastendamiseks [SQL peeglis](https://storh.inline0.dev/et/docs/sql-mirror)], ka nende kogumite puhul, mille salvesti ise skeemi ei kasuta.
