Veritabanı Şeması Nedir?
Kısa tanım
Veritabanı şeması, bir veritabanındaki verinin yapısını tanımlayan plandır: hangi tabloların bulunduğu, her tablonun hangi sütunlara ve veri tiplerine sahip olduğu, tabloların birincil ve yabancı anahtarlarla nasıl ilişkilendiği ve hangi kısıtların ve indekslerin geçerli olduğu. İlişkisel veritabanlarında şema SQL'in DDL komutlarıyla tanımlanır ve her yazmada veritabanı tarafından zorunlu kılınır.
Diğer adları: database schema, veri modeli, DB şeması, tablo yapısı

“Şema” kelimesinin iki kullanımı
Gündelik kullanımda veritabanı şeması, verinin bütün yapısını ifade eder: tablolar, sütunlar, tipler, ilişkiler, kısıtlar, indeksler ve görünümler (view). Bazı veritabanlarında ise SCHEMA ayrıca bir isim alanıdır. PostgreSQL'de tablolar public.orders veya billing.invoices gibi şemalar altında gruplanır ve yetkiler şema bazında verilebilir; MySQL'de ise SCHEMA, DATABASE ile eş anlamlıdır. Bir de karıştırılmaması gereken üçüncü anlam vardır: SEO'da “schema” denildiğinde genellikle Schema.org sözlüğüyle yazılan yapılandırılmış veri kastedilir ve bunun veritabanı yapısıyla ilgisi yoktur.
İş kuralları şemada yaşar
İyi bir şema yalnızca veriyi saklamaz, hangi verinin geçerli olduğunu da söyler. Aşağıdaki tanımdaki her satır bir iş kuralıdır:
CREATE TABLE invoices (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
customer_id bigint NOT NULL REFERENCES customers (id),
number text NOT NULL UNIQUE,
currency char(3) NOT NULL DEFAULT 'TRY',
amount numeric(12,2) NOT NULL CHECK (amount >= 0),
status text NOT NULL CHECK (status IN ('draft', 'issued', 'paid', 'void')),
issued_at timestamptz
);- Birincil anahtar her faturayı tekil olarak tanımlar; yabancı anahtar var olmayan bir müşteriye fatura kesilmesini engeller.
UNIQUEaynı fatura numarasının iki kez kullanılmasını,CHECKnegatif tutarı ve tanımsız durumları reddeder.- Para için
numericseçilmesi bilinçlidir: kayan noktalı tipler (float) ondalık değerleri tam temsil edemez ve kuruş hataları üretir. timestamptzzamanı saat dilimi bilgisiyle saklar; farklı saat dilimlerindeki sunucu ve kullanıcılar aynı anı aynı şekilde yorumlar.
Bu kuralların uygulama kodunda da bulunması doğaldır, ama son savunma hattı veritabanıdır: başka bir servis, elle çalıştırılan bir betik veya hatalı bir sürüm de aynı kurallara takılır.
Normalizasyon ve bilinçli denormalizasyon
Normalizasyonun özü, her bilginin tek bir yerde durmasıdır. Müşterinin şehrini her sipariş satırına kopyalamak, şehir değiştiğinde kayıtların bir kısmının güncellenip bir kısmının eski kalması riskini doğurur. Bu yüzden müşteri bilgisi kendi tablosunda tutulur, siparişler ona anahtarla başvurur. Ancak her tekrar hata değildir. Siparişteki teslimat adresi, müşteri sonradan taşınsa bile sipariş anındaki hâliyle kalmalıdır; bu bir kopya değil, tarihsel bir kayıttır. Okuma performansı için yapılan denormalizasyon (ör. bir ürünün yorum sayısını ayrı bir sütunda tutmak) da meşrudur, yeter ki kopyanın nasıl güncel tutulacağı açıkça tasarlansın.
“Şemasız” veritabanı diye bir şey yok
İlişkisel veritabanları şemayı yazma anında uygular (schema-on-write). Birçok NoSQL sistemi ise kayıtları önceden tanımlı bir yapı olmadan kabul eder ve “şemasız” diye anılır. Oysa şema ortadan kalkmaz, uygulama koduna taşınır: kodun bir dokümanda hangi alanların bulunacağını varsayması da bir şemadır. Fark, bu şemayı kimin denetlediğidir. Aynı koleksiyonda üç farklı biçimde kaydedilmiş doküman, raporlama sırasında ortaya çıkan klasik bir sorundur. Bazı doküman veritabanları bu yüzden isteğe bağlı şema doğrulaması sunar.
Şemayı yaşatmak
- Şemayı elle değil, depoda sürümlenen veritabanı migrasyonlarıyla değiştirin; böylece her ortam aynı yapıya sahip olur.
- İsimlendirmede tutarlı olun: tablo adlarında tekil veya çoğul, sütunlarda
snake_casegibi bir kural seçip her yerde uygulayın. - Bir ORM kullanılıyorsa model tanımları ile gerçek şemanın ayrışmadığını CI'da düzenli olarak kontrol edin.
- Sorgulanan ve birleştirilen sütunlara gereken indeksleri şema tasarımının parçası olarak düşünün; sonradan eklemek büyük tablolarda daha zahmetlidir.

