
# Skema

Skema bersifat opsional. Skema menjalankan dua fungsi terpisah: memvalidasi setiap penulisan dan mendeklarasikan kolom mana yang mendapatkan [indeks](https://storh.inline0.dev/id/docs/indexes). Koleksi tanpa skema menerima data array apa pun.

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

Nama koleksi pada skema harus sama dengan nama koleksi penyimpanan; jika tidak, konstruksi akan memunculkan error. Meneruskan skema ke konstruktor juga langsung menyinkronkan indeks yang dideklarasikan.

## Aturan validasi

- Kolom `required` harus ada dalam data yang ditulis. Yang diperiksa adalah keberadaannya: `null` eksplisit memenuhi syarat untuk kolom wajib.
- Kolom bertipe hanya diperiksa jika ada dan tidak bernilai null. Kolom `string` menolak nilai `int`; kolom `float` menerima `float` maupun `int`.
- Kolom `mixed` menerima nilai apa pun dan berguna untuk menandai kolom sebagai wajib atau berindeks tanpa membatasi tipenya.
- Kolom yang tidak dideklarasikan dalam skema tidak dibatasi.

Validasi yang gagal akan memunculkan `StorageException` sebelum apa pun ditulis.

## Tipe dan flag kolom

Tipe yang didukung: `string`, `int`, `float`, `bool`, `mixed`.

Flag untuk setiap kolom: `index()` (indeks kesetaraan), `unique()` (keunikan diterapkan saat penulisan), `range()` (indeks terurut untuk `gt`/`lt`/`between`/`prefix` dan kueri rentang terurut), serta `required()`.

## Perubahan skema

Indeks disinkronkan saat penyimpanan dikonstruksi. Jika perubahan skema mengubah kumpulan indeks yang dideklarasikan, manifest indeks berubah dan indeks yang terdampak dibangun ulang dari catatan yang ada; perubahan aturan validasi hanya berlaku untuk penulisan berikutnya dan tidak pernah menulis ulang catatan yang tersimpan.

Objek `Schema` yang sama dapat digunakan kembali untuk memetakan kolom bertipe dalam mirror [SQL](https://storh.inline0.dev/id/docs/sql-mirror), termasuk untuk koleksi yang penyimpanannya sendiri tidak menggunakan skema tersebut.
