Proje: OkulUp API · Hub: OkulUp API — Decisions

SchoolSetting — JSON Kolonu ile Feature/Policy Yönetimi

Karar

Her okul için özelleştirilebilir ayarlar (features, policies, branding, support) ayrı tablolar değil, school_settings tablosundaki JSON kolonlarında saklanır.

Neden

  • Feature sayısı zamanla değişiyor — her yeni özellik için migration yazmak yerine JSON array’e ekleme yeterli
  • DEFAULT_FEATURES sabitine ekleme → tüm mevcut okullara otomatik uygulanır (merge logic)
  • Tek kayıt per okul → okul başına 1 row, join basit
  • Policy ve branding da aynı pattern — tutarlılık

Nasıl Çalışır

// DEFAULT ile DB değerleri merge edilir
getResolvedFeatures() = array_merge(DEFAULT_FEATURES, $this->features ?? [])
 
// SchoolSetting yoksa otomatik oluşturulur:
$school->getOrCreateSettings()

Alternatifler

  • Ayrı bool kolonlar: Her yeni feature için migration
  • EAV (Entity-Attribute-Value): Overkill ve complex query
  • Ayrı tablo per özellik: Join karmaşıklığı

Dezavantaj

PHPStan için JSON array shape tanımlamak gerekiyor (@property array<string, mixed>).