“Ayarlar” Tablosu Kabusu
Tüm SaaS uygulamaları, sonunda dinamik verilerle ilgili aynı mimari duvara çarpar: Örneğin, elinizde bir users tablosu var ve birden ürün yöneticisi kullanıcıların karanlık mod tercihlerini kaydetmelerini istiyor. Bir theme sütununu eklemek için bir migration yazıyorsunuz. Bir hafta sonra, notification_time tercihinin eklenmesi isteniyor. Başka bir migration. Kısa süre içinde, tablonuzda çoğu boş olan 40 nullable sütun oluşuyor.
Bazı geliştiriciler bunu çözmek için tamamen NoSQL veritabanı, örneğin MongoDB’ye geçmeyi deniyorlar. Ancak bu durumda ilişkilendirme bütünlüğü, ACID uyumluluğu ve yabancı anahtarlar gibi güçlü özellikleri kaybediyorsunuz.
Sonuç olarak, JSONB sütunu PostgreSQL içinde harika bir çözüm sunuyor.
JSONB’nin Gücü
PostgreSQL, bir sütunda ham JSON verisi saklamanıza izin verir. Ancak standart bir metin alanının aksine, JSONB (JSON Binary) tipi aslında özel bir ikili formatta ayrıştırılır ve saklanır. Bu, PostgreSQL’in bunu bir standart tamsayı sütunu kadar hızlı bir şekilde dizinlemesine, sorgulamasına ve filtrelemesine olanak tanıdığını gösterir.
Laravel migration’ınızda bunu ayarlamak son derece basit:
Schema::table('users', function (Blueprint $table) {
// Hepsi için tek bir sütun
$table->jsonb('preferences')->default('{}');
});
Eloquent İçinde Casting
Laravel’in Eloquent ORM’i, JSONB ile çalışmayı adeta sihir gibi hale getiriyor. Modelinize bir dizi cast eklediğinizde, Laravel otomatik olarak veritabanındaki JSON’u yerel bir PHP dizisine dönüştürüyor ve kaydettiğinizde tekrar JSON’a çeviriyor.
class User extends Model
{
protected $casts = [
'preferences' => 'array',
];
}
Artık dinamik ayarları bir daha asla başka bir migration yazmadan güncelleyebilirsiniz:
$user = User::find(1);
$user->preferences['theme'] = 'dark';
$user->preferences['marketing_emails'] = false;
$user->save();
JSON İçinde Sorgulama
JSONB olduğundan, JSON yükünün anahtarları üzerinde Laravel’in ok yönü sözdizimini kullanarak son derece hızlı sorgular yazabilirsiniz.
// Karanlık temayı etkinleştirmiş tüm kullanıcıları bulun
$darkUsers = User::where('preferences->theme', 'dark')->get();
Sonuç
Dinamik verileri işlemek için bir NoSQL veritabanına ihtiyacınız yok. PostgreSQL’in katı ilişkilendirme gücünü JSONB sütunlarının esnekliği ile birleştirerek, hem gerektiği yerde katı hem de her yerde sonsuz esnek bir veritabanı mimarisi oluşturabilirsiniz.
Kaynak: Orijinal Makale


