
# Схема

Схемы необязательны. У схемы две независимые задачи: проверять каждую запись и объявлять, какие поля получают [индексы](https://storh.inline0.dev/ru/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/ru/docs/sql-mirror), в том числе для коллекций, хранилище которых само не использует эту схему.
