
# Skeema

Skeemat ovat valinnaisia. Skeemalla on kaksi erillistä tehtävää: se tarkistaa jokaisen kirjoituksen ja määrittää, mitkä kentät indeksoidaan [indekseillä](https://storh.inline0.dev/fi/docs/indexes). Kokoelmat, joilla ei ole skeemaa, hyväksyvät minkä tahansa taulukkomuotoisen datan.

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

Skeeman kokoelman nimen on vastattava tietovaraston kokoelman nimeä; muussa tapauksessa konstruktorin kutsu aiheuttaa virheen. Skeeman välittäminen konstruktorille synkronoi myös määritetyt indeksit heti.

## Validointisäännöt

- `required`-kenttien on oltava kirjoitettavassa datassa. Tarkistetaan kentän olemassaolo: eksplisiittinen `null` täyttää pakollisen kentän vaatimuksen.
- Tyypitetyt kentät tarkistetaan vain, jos ne ovat olemassa ja niiden arvo ei ole null. Kenttä `string` hylkää arvon `int`; kenttä `float` hyväksyy sekä arvot `float` että `int`.
- Kentät `mixed` hyväksyvät mitä tahansa, ja niitä voi käyttää kentän merkitsemiseen pakolliseksi tai indeksoiduksi sen tyyppiä rajoittamatta.
- Skeemassa määrittelemättömiä kenttiä ei rajoiteta.

Epäonnistunut validointi aiheuttaa `StorageException`-virheen ennen kuin mitään kirjoitetaan.

## Kenttätyypit ja liput

Tuetut tyypit: `string`, `int`, `float`, `bool`, `mixed`.

Kenttäkohtaiset liput: `index()` (yhtäsuuruusindeksi), `unique()` (yksikäsitteisyys tarkistetaan kirjoitettaessa), `range()` (järjestetty indeksi arvoille `gt`/`lt`/`between`/`prefix` sekä järjestetyille välikyselyille) ja `required()`.

## Skeeman muutokset

Indeksit synkronoidaan tietovarastoa luotaessa. Jos skeeman muutos muuttaa määritettyjen indeksien joukkoa, indeksiluettelo muuttuu ja muutetut indeksit rakennetaan uudelleen olemassa olevista tietueista. Validointisääntöjen muutokset koskevat vain tulevia kirjoituksia, eivätkä ne koskaan kirjoita tallennettuja tietueita uudelleen.

Samaa `Schema`-objektia voi käyttää tyypitettyjen sarakkeiden yhdistämiseen [SQL-peilissä](https://storh.inline0.dev/fi/docs/sql-mirror), myös kokoelmille, joiden tietovarasto ei itse käytä skeemaa.
