
# Şema Doğrulaması

Şemalar anlık görüntüler arasında değiştiğinde (sütunlar eklendiğinde, kaldırıldığında veya yeniden adlandırıldığında) merql bu farklılıkları tespit eder ve bildirir. Şema uyumsuzlukları birleştirmeyi engellemez; ancak çağıranın nasıl ilerleyeceğine karar verebilmesi için görünür hale getirilir.

## Tespit

`SchemaValidator::validate()`, her tablonun sütun kümelerini base, ours ve theirs anlık görüntülerinde karşılaştırır. Şunları bildirir:

- ours içinde eklenen sütunlar (ours içinde bulunup base içinde bulunmayanlar)
- ours içinde kaldırılan sütunlar (base içinde bulunup ours içinde bulunmayanlar)
- theirs içinde eklenen sütunlar
- theirs içinde kaldırılan sütunlar

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Tespit edilenler

| Değişiklik | Tespit edilir | Notlar |
|---|---|---|
| Sütun eklendi | Evet | Her taraf için ayrı bildirilir (ours/theirs) |
| Sütun kaldırıldı | Evet | Taraf başına bildirilir |
| Sütun türü değişti | Hayır | Türler saklanır ancak karşılaştırılmaz |
| Sütun yeniden adlandırıldı | Hayır | Ekleme + kaldırma olarak görünür |
| Birincil anahtar değişti | Hayır | Kimlik, anlık görüntü sırasında sabitlenir |

## Birleştirme sırasındaki davranış

Bir sütun bir anlık görüntüde bulunup diğerinde bulunmadığında, birleştirme eksik sütun değerini `null` olarak kabul eder. Bunun anlamı:

- theirs içinde null olmayan bir değerle eklenen sütun `null -> value` olarak görünür (theirs değişikliği kabul edilir)
- theirs içinde kaldırılan sütun, theirs içindeki tüm satırlarda `null` değerine sahipmiş gibi görünür

Birleştirme devam eder ve bir sonuç üretir. Şema uyumsuzlukları bilgilendirme amaçlıdır. Uygulamadan önce hedef veritabanı şemasının birleştirilmiş verilerle eşleştiğini doğrulamak çağıranın sorumluluğundadır.

## Uyumsuzluklara erişme

Şema uyuşmazlıkları hem `ThreeWayMerge` (`schemaMismatches()` aracılığıyla) hem de `MergeResult` üzerinde (`schemaMismatches()` ve `hasSchemaMismatches()` aracılığıyla) kullanılabilir. `ConflictResolver::resolve()` boyunca korunurlar.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
