
# Схема

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