
# Shēma

Shēmas nav obligātas. Shēmai ir divi neatkarīgi uzdevumi: tā validē katru ierakstīšanas darbību un deklarē, kuri lauki saņem [indeksus](https://storh.inline0.dev/lv/docs/indexes). Kolekcijas bez shēmas pieņem jebkādus masīva datus.

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

Shēmas kolekcijas nosaukumam jāsakrīt ar krātuves kolekcijas nosaukumu; pretējā gadījumā, veidojot krātuvi, tiek izraisīta kļūda. Nododot shēmu konstruktoram, deklarētie indeksi tiek sinhronizēti uzreiz.

## Validācijas noteikumi

- `required` laukiem jābūt norādītiem ierakstāmajos datos. Tiek pārbaudīta lauka esamība: skaidri norādīta `null` vērtība atbilst prasībai pēc obligāta lauka.
- Tipizētos laukus pārbauda tikai tad, ja tie ir norādīti un nav null. Lauks ar tipu `string` noraida vērtību `int`; lauks ar tipu `float` pieņem gan `float`, gan `int`.
- `mixed` lauki pieņem jebkādu vērtību; ar tiem var atzīmēt lauku kā obligātu vai indeksētu, nenosakot tā tipu.
- Laukiem, kas nav deklarēti shēmā, ierobežojumu nav.

Ja validācija neizdodas, tiek izraisīta kļūda `StorageException`, pirms tiek ierakstīts kaut kas.

## Lauku tipi un karodziņi

Atbalstītie tipi: `string`, `int`, `float`, `bool`, `mixed`.

Karodziņi katram laukam: `index()` (vienādības indekss), `unique()` (unikalitāte tiek nodrošināta ierakstīšanas brīdī), `range()` (sakārtots indekss `gt`/`lt`/`between`/`prefix` un sakārtotiem diapazona vaicājumiem) un `required()`.

## Shēmas izmaiņas

Indeksi tiek sinhronizēti, izveidojot krātuvi. Ja shēmas izmaiņas maina deklarēto indeksu kopu, mainās indeksu manifests un ietekmētie indeksi tiek izveidoti no jauna, izmantojot esošos ierakstus; validācijas noteikumu izmaiņas attiecas tikai uz turpmākajiem ierakstiem un nekad nepārraksta saglabātos ierakstus.

To pašu objektu `Schema` var atkārtoti izmantot tipizētu kolonnu kartēšanai [SQL spogulī](https://storh.inline0.dev/lv/docs/sql-mirror), arī kolekcijām, kuru krātuvē šī shēma netiek izmantota.
