
# Σχήμα

Τα σχήματα είναι προαιρετικά. Ένα σχήμα επιτελεί δύο ανεξάρτητες λειτουργίες: επικυρώνει κάθε εγγραφή και δηλώνει ποια πεδία αποκτούν [ευρετήρια](https://storh.inline0.dev/el/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/el/docs/sql-mirror), ακόμη και για συλλογές των οποίων ο χώρος αποθήκευσης δεν χρησιμοποιεί ο ίδιος το σχήμα.
