
# Схема

Схемите са незадължителни. Една схема изпълнява две независими задачи: валидира всеки запис и декларира кои полета получават [индекси](https://storh.inline0.dev/bg/docs/indexes). Колекциите без схема приемат данни във всеки масив.

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

Името на колекцията в схемата трябва да съвпада с името на колекцията в хранилището; в противен случай конструирането завършва с грешка. Подаването на схемата на конструктора синхронизира декларираните индекси веднага.

## Правила за валидиране

- `required` полетата трябва да присъстват в записваните данни. Проверява се наличието: изрична стойност `null` удовлетворява задължително поле.
- Типизираните полета се проверяват само когато присъстват и не са null. Поле от тип `string` отхвърля стойност `int`; поле от тип `float` приема както `float`, така и `int`.
- Полетата `mixed` приемат всякакви стойности и са полезни, когато искате да обозначите поле като задължително или индексирано, без да ограничавате типа му.
- Полетата, които не са декларирани в схемата, нямат ограничения.

Неуспешното валидиране предизвиква `StorageException`, преди да бъде записано каквото и да е.

## Типове полета и флагове

Поддържани типове: `string`, `int`, `float`, `bool`, `mixed`.

Флагове за поле: `index()` (индекс за равенство), `unique()` (уникалността се налага при запис), `range()` (подреден индекс за `gt`/`lt`/`between`/`prefix` и заявки за подреден диапазон) и `required()`.

## Промени в схемата

Индексите се синхронизират при конструиране на хранилището. Ако промяна в схемата измени набора от декларирани индекси, манифестът на индексите се променя и засегнатите индекси се изграждат отново от съществуващите записи; промените в правилата за валидиране се прилагат само към бъдещи записи и никога не променят вече съхранените записи.

Същият обект `Schema` може да се използва повторно за задаване на типизирани колони в [огледалото в SQL](https://storh.inline0.dev/bg/docs/sql-mirror), включително за колекции, чието хранилище не използва самата схема.
