
# Schema

Scheman är valfria. Ett schema har två oberoende uppgifter: det validerar varje
skrivning och anger vilka fält som får [index](https://storh.inline0.dev/sv/docs/indexes). Samlingar
utan schema accepterar godtyckliga 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);
```

Samlingens namn i schemat måste matcha lagrets samlingsnamn;
annars misslyckas konstruktionen. När du skickar schemat till konstruktorn
synkroniseras även de deklarerade indexen direkt.

## Valideringsregler

- `required`-fält måste finnas i den skrivna datan. Det är förekomsten som
  kontrolleras: ett uttryckligt `null` uppfyller ett obligatoriskt fält.
- Typade fält kontrolleras bara när de finns och inte är null. Ett `string`-fält
  avvisar ett värde av typen `int`; ett `float`-fält accepterar både `float` och `int`.
- `mixed`-fält accepterar allt och är användbara för att markera ett fält som obligatoriskt
  eller indexerat utan att begränsa dess typ.
- Fält som inte deklareras i schemat är obegränsade.

Misslyckad validering utlöser ett `StorageException` innan något skrivs.

## Fälttyper och flaggor

Typer som stöds: `string`, `int`, `float`, `bool`, `mixed`.

Flaggor per fält: `index()` (likhetsindex), `unique()` (unikhet upprätthålls
vid skrivning), `range()` (ordnat index för `gt`/`lt`/`between`/`prefix` och
ordnade intervallfrågor) och `required()`.

## Schemaändringar

Index synkroniseras när lagret konstrueras. Om en schemaändring ändrar
den deklarerade indexuppsättningen ändras indexmanifestet och berörda index
byggs om från befintliga poster; ändringar av valideringsregler gäller bara
framtida skrivningar och skriver aldrig om lagrade poster.

Samma `Schema`-objekt kan återanvändas för att mappa typade kolumner i en
[SQL-spegel](https://storh.inline0.dev/sv/docs/sql-mirror), även för samlingar vars lager
inte använder schemat självt.
