
# Schema

Gli schemi sono facoltativi. Uno schema svolge due funzioni indipendenti: convalida ogni scrittura e dichiara quali campi ottengono [indici](https://storh.inline0.dev/it/docs/indexes). Le raccolte senza schema accettano dati di qualsiasi array.

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

Il nome della raccolta dello schema deve corrispondere a quello della raccolta dell'archivio; altrimenti la costruzione genera un errore. Passando lo schema al costruttore, gli indici dichiarati vengono sincronizzati subito.

## Regole di convalida

- I campi `required` devono essere presenti nei dati scritti. Viene verificata la presenza: un valore `null` esplicito soddisfa il requisito.
- I campi tipizzati vengono controllati solo quando sono presenti e non null. Un campo `string` rifiuta un valore `int`; un campo `float` accetta sia `float` che `int`.
- I campi `mixed` accettano qualsiasi valore e sono utili per contrassegnare un campo come obbligatorio o indicizzato senza vincolarne il tipo.
- I campi non dichiarati nello schema non hanno restrizioni.

Una convalida non riuscita genera un `StorageException` prima che venga scritto alcunché.

## Tipi e flag dei campi

Tipi supportati: `string`, `int`, `float`, `bool`, `mixed`.

Flag per campo: `index()` (indice di uguaglianza), `unique()` (unicità applicata al momento della scrittura), `range()` (indice ordinato per `gt`/`lt`/`between`/`prefix` e query per intervallo ordinate) e `required()`.

## Modifiche allo schema

Gli indici vengono sincronizzati alla creazione dell'archivio. Se una modifica allo schema cambia l'insieme degli indici dichiarati, il manifest degli indici cambia e quelli interessati vengono ricostruiti dai record esistenti; le modifiche alle regole di convalida si applicano solo alle scritture future e non riscrivono mai i record memorizzati.

Lo stesso oggetto `Schema` può essere riutilizzato per mappare colonne tipizzate in un mirror [SQL](https://storh.inline0.dev/it/docs/sql-mirror), anche per raccolte il cui archivio non usa direttamente lo schema.
