
# Shema

Sheme niso obvezne. Shema opravlja dve neodvisni nalogi: preverja veljavnost vsakega zapisa in določa, katera polja dobijo [indekse](https://storh.inline0.dev/sl/docs/indexes). Zbirke brez sheme sprejmejo podatke v katerem koli polju.

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

Ime zbirke v shemi se mora ujemati z imenom zbirke shrambe; sicer konstrukcija sproži napako. Če shemo posredujete konstruktorju, se deklarirani indeksi tudi takoj sinhronizirajo.

## Pravila preverjanja

- Polja `required` morajo biti prisotna v zapisanih podatkih. Preverja se prisotnost: izrecna vrednost `null` izpolnjuje zahtevo za polje.
- Tipizirana polja se preverjajo samo, kadar so prisotna in niso null. Polje tipa `string` zavrne vrednost `int`; polje tipa `float` sprejme tako `float` kot `int`.
- Polja `mixed` sprejmejo kar koli; uporabna so za označevanje obveznega ali indeksiranega polja brez omejitve njegovega tipa.
- Polja, ki niso navedena v shemi, niso omejena.

Neuspešno preverjanje veljavnosti sproži `StorageException`, preden se kar koli zapiše.

## Vrste polj in zastavice

Podprte vrste: `string`, `int`, `float`, `bool`, `mixed`.

Zastavice za posamezna polja: `index()` (indeks enakosti), `unique()` (zagotovljena enoličnost ob zapisu), `range()` (urejeni indeks za `gt`/`lt`/`between`/`prefix` in poizvedbe z urejenim razponom) ter `required()`.

## Spremembe sheme

Indeksi se sinhronizirajo ob vzpostavitvi shrambe. Če sprememba sheme spremeni nabor deklariranih indeksov, se manifest indeksov spremeni, prizadeti indeksi pa se znova zgradijo iz obstoječih zapisov; spremembe pravil za preverjanje veljavnosti veljajo samo za prihodnje zapise in nikoli ne prepišejo shranjenih zapisov.

Isti objekt `Schema` lahko znova uporabite za preslikavo tipiziranih stolpcev v zrcalni kopiji [SQL](https://storh.inline0.dev/sl/docs/sql-mirror), tudi pri zbirkah, katerih shramba sama ne uporablja sheme.
