
# Schéma

Les schémas sont facultatifs. Un schéma remplit deux fonctions indépendantes : il valide chaque écriture et déclare les champs dotés d’[index](https://storh.inline0.dev/fr/docs/indexes). Les collections sans schéma acceptent toutes les données sous forme de tableaux.

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

Le nom de la collection du schéma doit correspondre à celui du magasin ; sinon, la construction échoue. Le passage du schéma au constructeur synchronise aussi immédiatement les index déclarés.

## Règles de validation

- Les champs `required` doivent être présents dans les données écrites. Seule la présence est vérifiée : la valeur `null` explicite satisfait aussi cette exigence.
- Les champs typés ne sont vérifiés que s’ils sont présents et non nuls. Un champ `string` rejette une valeur `int` ; un champ `float` accepte à la fois `float` et `int`.
- Les champs `mixed` acceptent n’importe quelle valeur et permettent d’indiquer qu’un champ est obligatoire ou indexé sans imposer son type.
- Les champs non déclarés dans le schéma sont libres de toute restriction.

Un échec de validation déclenche une `StorageException` avant toute écriture.

## Types et indicateurs de champ

Types pris en charge : `string`, `int`, `float`, `bool`, `mixed`.

Indicateurs par champ : `index()` (index d’égalité), `unique()` (unicité imposée à l’écriture), `range()` (index ordonné pour `gt`/`lt`/`between`/`prefix` et les requêtes de plage ordonnées), et `required()`.

## Modifications du schéma

Les index sont synchronisés à la construction du magasin. Si une modification du schéma change l’ensemble d’index déclarés, le manifeste des index est mis à jour et les index concernés sont reconstruits à partir des enregistrements existants ; les modifications des règles de validation ne s’appliquent qu’aux écritures futures et ne réécrivent jamais les enregistrements stockés.

Le même objet `Schema` peut être réutilisé pour mapper des colonnes typées dans un [miroir SQL](https://storh.inline0.dev/fr/docs/sql-mirror), y compris pour les collections dont le magasin n’utilise pas lui-même le schéma.
