
# المخطط

المخططات اختيارية. ويؤدي المخطط وظيفتين مستقلتين: التحقق من كل عملية كتابة، وتحديد الحقول التي تحصل على [فهارس](https://storh.inline0.dev/ar/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/ar/docs/sql-mirror)، بما في ذلك المجموعات التي لا يستخدم مخزنها المخطط نفسه.
