
# Şema

Şemalar isteğe bağlıdır. Bir şema birbirinden bağımsız iki iş yapar: her yazmayı doğrular ve hangi alanların [dizin](https://storh.inline0.dev/tr/docs/indexes) alacağını belirtir. Şema olmayan koleksiyonlar her türlü dizi verisini kabul eder.

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

Şemanın koleksiyon adı, deponun koleksiyon adıyla eşleşmelidir; aksi durumda oluşturma hata verir. Şemanın oluşturucuya aktarılması, tanımlı dizinleri de hemen eşitler.

## Doğrulama kuralları

- `required` alanlar yazılan veride bulunmalıdır. Denetlenen şey varlıktır: açıkça belirtilmiş bir `null`, zorunlu bir alanı karşılar.
- Türü belirlenmiş alanlar yalnızca mevcut ve null değilse denetlenir. `string` alanı `int` değerini reddeder; `float` alanı hem `float` hem de `int` değerini kabul eder.
- `mixed` alanları her şeyi kabul eder; bir alanı türünü kısıtlamadan zorunlu veya indeksli olarak işaretlemek için kullanışlıdır.
- Şemada tanımlanmayan alanlarda kısıtlama yoktur.

Doğrulama başarısız olursa herhangi bir veri yazılmadan önce `StorageException` fırlatılır.

## Alan türleri ve bayraklar

Desteklenen türler: `string`, `int`, `float`, `bool`, `mixed`.

Alan başına bayraklar: `index()` (eşitlik indeksi), `unique()` (benzersizlik yazma sırasında uygulanır), `range()` (`gt`/`lt`/`between`/`prefix` için sıralı indeks ve sıralı aralık sorguları) ve `required()`.

## Şema değişiklikleri

İndeksler, depo oluşturulurken eşitlenir. Bir şema değişikliği tanımlanan indeks kümesini değiştirirse indeks bildirimi de değişir ve etkilenen indeksler mevcut kayıtlardan yeniden oluşturulur; doğrulama kurallarındaki değişiklikler yalnızca gelecekteki yazmalara uygulanır ve kayıtlı verileri hiçbir zaman yeniden yazmaz.

Aynı `Schema` nesnesi, [SQL yansısındaki türü belirlenmiş sütunları eşlemek için yeniden kullanılabilir](https://storh.inline0.dev/tr/docs/sql-mirror); deponun kendisi şemayı kullanmayan koleksiyonlar için de.
