
# Schemă

Schemele sunt opționale. O schemă are două roluri independente: validează fiecare scriere și declară câmpurile care primesc [indexuri](https://storh.inline0.dev/ro/docs/indexes). Colecțiile fără schemă acceptă orice date de tip 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);
```

Numele colecției din schemă trebuie să corespundă cu numele colecției din stocare; în caz contrar, construirea eșuează. Transmiterea schemei către constructor sincronizează imediat și indexurile declarate.

## Reguli de validare

- Câmpurile `required` trebuie să fie prezente în datele scrise. Se verifică prezența: o valoare explicită `null` satisface cerința pentru un câmp obligatoriu.
- Câmpurile tipizate sunt verificate doar când sunt prezente și nu au valoarea null. Un câmp `string` respinge o valoare `int`; un câmp `float` acceptă atât `float`, cât și `int`.
- Câmpurile `mixed` acceptă orice valoare și sunt utile pentru a marca un câmp drept obligatoriu sau indexat, fără a-i restricționa tipul.
- Câmpurile nedeclarate în schemă nu au restricții.

O validare eșuată declanșează o eroare `StorageException` înainte de orice scriere.

## Tipuri și flag-uri pentru câmpuri

Tipuri acceptate: `string`, `int`, `float`, `bool`, `mixed`.

Flag-uri pentru fiecare câmp: `index()` (index de egalitate), `unique()` (unicitatea este impusă la scriere), `range()` (index ordonat pentru `gt`/`lt`/`between`/`prefix` și interogări ordonate pe intervale) și `required()`.

## Modificări ale schemei

Indexurile sunt sincronizate la construirea stocării. Dacă o modificare a schemei schimbă setul de indexuri declarate, manifestul indexurilor se modifică, iar indexurile afectate sunt reconstruite din înregistrările existente; modificările regulilor de validare se aplică doar scrierilor viitoare și nu rescriu niciodată înregistrările stocate.

Același obiect `Schema` poate fi reutilizat pentru maparea coloanelor tipizate într-o oglindă [SQL](https://storh.inline0.dev/ro/docs/sql-mirror), inclusiv pentru colecțiile a căror stocare nu folosește schema respectivă.
