
# Esquema

Los esquemas son opcionales. Un esquema cumple dos funciones independientes: valida cada escritura y declara qué campos tienen [índices](https://storh.inline0.dev/es/docs/indexes). Las colecciones sin esquema aceptan datos en cualquier arreglo.

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

El nombre de colección del esquema debe coincidir con el del almacén; de lo contrario, la construcción falla. Si pasa el esquema al constructor, también se sincronizan de inmediato los índices declarados.

## Reglas de validación

- Los campos `required` deben estar presentes en los datos escritos. Solo se comprueba que estén presentes: `null` explícito satisface el requisito.
- Los campos tipados solo se comprueban si están presentes y no son nulos. Un campo `string` rechaza un valor `int`; un campo `float` acepta tanto `float` como `int`.
- Los campos `mixed` aceptan cualquier valor y sirven para marcar un campo como obligatorio o indexado sin limitar su tipo.
- Los campos no declarados en el esquema no tienen restricciones.

Si la validación falla, se produce un error `StorageException` antes de escribir nada.

## Tipos y propiedades de los campos

Tipos admitidos: `string`, `int`, `float`, `bool` y `mixed`.

Propiedades por campo: `index()` (índice de igualdad), `unique()` (unicidad aplicada al escribir), `range()` (índice ordenado para `gt`/`lt`/`between`/`prefix` y consultas de rango ordenadas) y `required()`.

## Cambios en el esquema

Los índices se sincronizan al construir el almacén. Si un cambio en el esquema modifica el conjunto de índices declarados, cambia el manifiesto de índices y se reconstruyen los índices afectados a partir de los registros existentes; los cambios en las reglas de validación solo se aplican a las escrituras futuras y nunca reescriben los registros almacenados.

El mismo objeto `Schema` puede reutilizarse para asignar columnas tipadas en una [réplica de SQL](https://storh.inline0.dev/es/docs/sql-mirror), incluso en colecciones cuyo almacén no use el esquema.
