
# Schema

Skemaer er valgfrie. Et skema har to uafhængige funktioner: det validerer hver
skrivning, og det angiver, hvilke felter der får [indekser](https://storh.inline0.dev/da/docs/indexes). Samlinger
uden et skema accepterer alle arraydata.

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

Skemaets samlingsnavn skal svare til lagerets samlingsnavn;
ellers kastes der en fejl ved oprettelse. Når skemaet gives til konstruktøren,
synkroniseres de erklærede indekser med det samme.

## Valideringsregler

- `required`-felter skal være til stede i de data, der skrives. Det er tilstedeværelsen, der
  kontrolleres: en udtrykkelig `null` opfylder kravet.
- Typede felter kontrolleres kun, når de findes og ikke er null. Et `string`-felt
afviser en `int`-værdi; et `float`-felt accepterer både `float` og `int`.
- `mixed`-felter accepterer alt og er nyttige til at markere et felt som påkrævet
  eller indekseret uden at begrænse dets type.
- Felter, der ikke er erklæret i skemaet, er ubegrænsede.

En mislykket validering kaster en `StorageException`, før der skrives noget.

## Felttyper og flag

Understøttede typer: `string`, `int`, `float`, `bool`, `mixed`.

Flag pr. felt: `index()` (lighedsindeks), `unique()` (unikhed håndhæves
ved skrivning), `range()` (ordnet indeks til `gt`/`lt`/`between`/`prefix` og
ordnede intervalforespørgsler) samt `required()`.

## Ændringer af skemaet

Indekser synkroniseres, når lageret oprettes. Hvis en skemaændring ændrer
mængden af erklærede indekser, ændres indeksmanifestet, og de berørte indekser
genopbygges ud fra de eksisterende poster; ændringer af valideringsregler gælder kun
fremtidige skrivninger og omskriver aldrig gemte poster.

Det samme `Schema`-objekt kan genbruges til at knytte typede kolonner i et
[SQL-spejl](https://storh.inline0.dev/da/docs/sql-mirror), også for samlinger, hvis lager ikke selv bruger skemaet.
