
# Séma

A sémák használata nem kötelező. A séma két egymástól független feladatot lát el: érvényesít minden írást, és megadja, mely mezők kapnak [indexeket](https://storh.inline0.dev/hu/docs/indexes). A séma nélküli gyűjtemények bármilyen tömbadatot elfogadnak.

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

A séma gyűjteménynevének meg kell egyeznie a tároló gyűjteménynevével; ellenkező esetben a példányosítás hibát jelez. Ha a sémát átadja a konstruktornak, az azonnal szinkronizálja a deklarált indexeket is.

## Érvényesítési szabályok

- A `required` mezőknek jelen kell lenniük az írt adatokban. A rendszer csak a jelenlétet ellenőrzi: a kifejezetten megadott `null` is megfelel a kötelező mező feltételének.
- A típusellenőrzés csak a jelen lévő, nem null értékű mezőkre vonatkozik. A `string` mező elutasítja a `int` értéket; a `float` mező a `float` és a `int` értéket is elfogadja.
- A `mixed` mezők bármit elfogadnak, és hasznosak, ha egy mezőt kötelezőként vagy indexeltként szeretne megjelölni anélkül, hogy megszabná a típusát.
- A sémában nem deklarált mezőkre nincs korlátozás.

A sikertelen érvényesítés `StorageException` hibát okoz, mielőtt bármit kiírna a rendszer.

## Mezőtípusok és jelölők

Támogatott típusok: `string`, `int`, `float`, `bool`, `mixed`.

Mezőnkénti jelölők: `index()` (egyenlőségi index), `unique()` (az egyediséget íráskor ellenőrzi), `range()` (rendezett index a `gt`/`lt`/`between`/`prefix` műveletekhez és a rendezett tartománylekérdezésekhez), valamint `required()`.

## Sémamódosítások

Az indexek a tároló példányosításakor szinkronizálódnak. Ha egy sémamódosítás megváltoztatja a deklarált indexek halmazát, az indexjegyzék is változik, az érintett indexek pedig újraépülnek a meglévő rekordokból; az érvényesítési szabályok módosításai csak a jövőbeli írásokra vonatkoznak, a tárolt rekordokat soha nem írják át.

Ugyanaz a `Schema` objektum a típusoszlopok leképezésére is felhasználható egy [SQL tükörben](https://storh.inline0.dev/hu/docs/sql-mirror), olyan gyűjteményeknél is, amelyek tárolója maga nem használja a sémát.
