Ana içeriğe geç

SQL'de CREATE TABLE: Şema Tasarımında Ustalık ve En İyi Uygulamalar

CREATE TABLE ifadesinin veritabanınızı nasıl şekillendirdiğini anlayın. Ölçeklenebilir şemalar oluşturmak için temel söz dizimini, veri türlerini, kısıtlamaları ve optimizasyon tekniklerini öğrenin.
· 7 dk. oku

Yapay Zeka ile Keşfedin

CREATE TABLE deyimi, her ilişkisel veritabanı tasarımının temelidir. Hangi verileri sakladığınızı, nasıl yapılandırıldığını ve doğruluğunu sağlayan kuralları tanımlar.

Bu eğitimde, sizleri CREATE TABLE söz diziminin temel unsurları, pratik tasarım seçimleri ve gerçek dünya örnekleriyle adım adım ilerleterek hem mevcut ihtiyaçlara hem de gelecekteki büyümeye hizmet eden sezgisel ve verimli tablolar oluşturmanıza yardımcı olacağım.

SQL'e yeniyseniz, sağlam bir temel oluşturmak için Introduction to SQL kursumuz veya Intermediate SQL kursumuzla başlamayı düşünebilirsiniz. Ayrıca indirilebilen SQL Basics Cheat Sheet'in, en yaygın SQL işlevlerinin tümünü içerdiği için yararlı bir başvuru kaynağı olduğunu düşünüyorum.

Veritabanı Tasarımında CREATE TABLE'ın Rolü

CREATE TABLE deyimi, verilerinizin nasıl depolandığını, düzenlendiğini ve erişildiğini tanımlayan temel Veri Tanımlama Dili (DDL) komutudur ve onu yazmadan önce tablonun neyi temsil ettiğine, diğerleriyle nasıl bağlandığına ve yapısının gelecekteki sorguları nasıl destekleyeceğine karar vermelisiniz. 

Temel söz dizimi, ardından her biri bir veri türü ve isteğe bağlı kısıtlamalarla tanımlanan sütunlardan oluşan bir liste gelen tablo adını içerir. Aşağıdaki söz dizimini inceleyin:

-- Create table syntax
CREATE TABLE schema_name.table_name (
    column_name data_type constraint,
    column_name data_type constraint,
    column_name data_type constraint,
    ...
);

Burada:

  • schema_name: Tabloları düzenlemek için isteğe bağlı ad alanı.

  • table_name: Varlık için açık ve açıklayıcı ad.

  • column_name: Tablodaki bir alanın (öznitelik) adı.

  • data_type: INT, VARCHAR veya DATE gibi formatı tanımlar.

  • constraint: PRIMARY KEY, NOT NULL veya UNIQUE gibi isteğe bağlı kurallar.

Bu söz dizimi, MySQL, PostgreSQL ve SQL Server gibi başlıca SQL platformlarında tutarlıdır; gelişmiş seçeneklerde yalnızca küçük lehçe farklılıkları vardır. Bu nedenle, bu platformlar arasında tutarlılığı korumak için tablo ve sütun adlarında net adlandırma kurallarına bağlı kalmalısınız.

Sütunlar, Veri Türleri ve Kısıtlamaların Tanımlanması

Tablo yapısının nasıl oluşturulacağını gördükten sonra, veriyi şekillendiren sütunların nasıl tanımlanacağına bakalım. Bir sütun tanımı üç öğeden oluşur: sütun adı, veri türü ve kısıtlamaları.

Doğru veri türlerini seçmek depolamayı ve sorgu performansını optimize eder; örneğin sayısal kimlikler için INT, değişken uzunluklu metin için VARCHAR kullanmak gibi. Gereksiz yere büyük veri türleri kullanmak gibi kötü seçimler, boşa alan kullanımına ve daha yavaş sorgulara yol açabilir.

Kısıtlamalar, verilerinizi güvenilir ve bağlantılı tutan kuralları uygular. Örneğin PRIMARY KEY her satırı benzersiz olarak tanımlar ve FOREIGN KEY tabloları ilişkiyi korumak için birbirine bağlar. DEFAULT kısıtlaması otomatik değerler atarken, CHECK belirli ölçütleri karşılayan değerleri sağlar. 

Aşağıdaki örnekte iyi tanımlanmış kısıtlamalar ve veri türleri gösterilmektedir. 

-- Create table syntax with data types and constraints defined
CREATE TABLE orders (
    order_id INT PRIMARY KEY,          -- Proper PK
    user_id INT NOT NULL,              -- Required relationship
    total DECIMAL(10,2) NOT NULL,      -- Exact monetary value
    status VARCHAR(20) DEFAULT 'new',  -- Controlled default
    FOREIGN KEY (user_id) REFERENCES users(user_id)  -- Enforce relationship
);

Aşağıdaki sorgu, eksik anahtarlar ve kısıtlamalar, fazla büyük türler ve kesin olmayan veri tercihleri nedeniyle tutarsız veya verimsiz depolamaya yol açabilen kötü tablo tasarımına bir örnek gösterir.

CREATE TABLE orders (
    id VARCHAR(50),        -- Unnecessary string PK
    user VARCHAR(255),     -- No relationship enforced
    total FLOAT,           -- Risky for money calculations
    status TEXT            -- No constraints or defaults
);

İyi bir uygulama olarak, veri türlerini ve kısıtlamaları tablo tasarımınıza ve iş gereksinimlerinize uygun şekilde her zaman açıkça tanımladığınızdan emin olun.

Şunu öneririm: Tablolar oluşturmayı, tablolar arasında ilişkileri ve kısıtlamaları uygulamayı öğrenmek için Introduction to Relational Databases in SQL kursumuza katılın.

Gerçek Dünya Senaryoları için Tablolar Tasarlama

CREATE TABLE söz dizimini anladıktan sonra, size gerçek iş akışlarıyla eşleşen tabloların nasıl tasarlanacağını göstereceğim. 

E-ticaret örneği

Bir e-ticaret sistemi oluşturmak istediğinizi varsayalım. customers, orders ve products tablolarınız olacak ve bu tablolar, ilişkileri ve başvuru bütünlüğünü sağlamak için yabancı anahtarlarla bağlanacaktır.

Önce, kullanıcı profillerini depolamak için aşağıdaki şemaya sahip customers tablosunu oluşturacaksınız:

-- Create customers table to store user profiles
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,               
    name VARCHAR(150) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

İkinci olarak, platformdaki her öğeyi depolamak için products tablosu aşağıdaki şemaya sahip olacaktır.

-- Create products table for catalog of items for sale
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    price DECIMAL(10,2) NOT NULL,               -- Accurate money type
    stock INT CHECK (stock >= 0),               -- Prevent negative inventory
    created_at TIMESTAMP DEFAULT NOW()
);

Son olarak, müşterilerin yaptığı satın alımları depolamak için orders tablosuna sahip olacaksınız.

-- Create orders table
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NOT NULL,                   -- Link order → customer
    order_date TIMESTAMP DEFAULT NOW(),
    total_amount DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    -- Enforce relationship and ensure customer exists
);

Birden çok tablo oluştururken, başvuru bütünlüğü için her zaman alt tablodaki bir sütun ile üst tablodaki PRIMARY KEY arasında ilişki kurmak üzere FOREIGN KEY kısıtlamasını kullanın. Örneğimizde bu ilişki, var olmayan bir müşteri için sipariş oluşturulamayacağını garanti eder.

Geçici ve klonlanmış tablolar

Bazen, canlı şemayı etkilemeden hızlı bir kullanım durumu için bir tablo oluşturmak veya bir veri dönüşümünü test etmek isteyebilirsiniz. Böyle bir durumda geçici veya klonlanmış bir tablo oluşturabilirsiniz. Her birinin nasıl oluşturulacağına bakalım:

  • Geçici tablolar: Bunlar genellikle yalnızca mevcut veritabanı oturumuna görünür, kısa ömürlü tablolardır ve oturum sona erdiğinde otomatik olarak silinir. Karmaşık veri dönüşümleri, çok adımlı veri işleme veya test için kullanışlıdır. Aşağıdaki sorgu, PostgreSQL'de geçici bir tablonun nasıl oluşturulacağını gösterir.
-- Temporary copy for short-term analysis
CREATE TEMPORARY TABLE temp_sales AS
SELECT * FROM sales
WHERE sale_date >= CURRENT_DATE - INTERVAL '7 days';
  • Klonlanmış tablolar: Mevcut tabloların dizinler ve kısıtlamalar dahil birebir kopyalarıdır. Verinin bütünlüğünün, değişiklikler sırasında korunması gereken hassas işlemler için kullanışlıdırlar.
-- Create quick structural clone for testing or recovery
CREATE TABLE orders_backup AS
SELECT * FROM orders;

Normalizasyon ve denormalizasyon

Tabloları tasarlarken, sistemin etkinliğini ve sürdürülebilirliğini optimize etmek için normalizasyon ile denormalizasyon arasında denge kurmak, özel kullanım durumlarına, veri hacmine ve sorgu kalıplarına bağlıdır. Aşağıda her yöntemin ne zaman kullanılacağına dair bir özet bulunmaktadır:

  • Normalizasyon: Bu yöntem, büyük tabloları daha küçük ve ilişkili olanlara bölmeyi ve anahtar olmayan her bilginin yalnızca bir kez saklanmasını içerir. Avantajı, gelişmiş verimlilik, en aza indirilmiş tekrar ve daha kolay bakımdır.
  • Denormalizasyon: Müşterinin adını her sipariş satırına dahil etmek gibi stratejik tekrar eklemeyi içerir. Bu yöntem, özellikle birleştirmelerin yavaş olduğu durumlarda, belirli raporlama veya analitik ihtiyaçlar için okuma performansını artırır.

Tablo Oluşturmayı Optimize Etme ve Otomatikleştirme

Veritabanınız için tablolar oluştururken performansı ve gelecekteki sürdürülebilirliği akılda tutmalısınız. Veritabanı tasarımındaki geniş deneyimlerime dayanarak, aşağıdaki optimizasyon tekniklerini faydalı buluyorum:

  • Dizinleme: Aramalarda sık kullanılan sütunlara dizin eklemek sorguları hızlandırır. PRIMARY KEY tanımladığınızda otomatik olarak benzersiz bir dizin oluşturur.
  • Bölümleme (partitioning): Büyük tablolar için bölümleme, veriyi tarih gibi ölçütlere göre daha küçük ve yönetilebilir parçalara ayırır; tarama kapsamını sınırlayarak sorgu verimliliğini artırır.
  • Hesaplanan sütunlar: SQL Server ve PostgreSQL gibi bazı veritabanları, diğer sütunlardan dinamik olarak değer hesaplayan sütunlar tanımlamanıza izin verir. Bu yaklaşım, yinelenen veri depolamayı azaltabilir ve sorgu hızını iyileştirebilir.

Modern iş akışlarında, otomasyon şema tasarımı ve yönetiminde önemli bir rol oynar. Süreci belgelemek, çoğaltmak veya otomatikleştirmek için aşağıdaki araç ve sorgulara güvenebilirsiniz:

Araç/Yöntem

Amaç

Örnek uygulama

pg_dump/ Veritabanı Yedekleri

Mevcut bir veritabanından CREATE TABLE betikleri oluşturmak için kullanılır.

Test veya geçiş için üretim ortamını çoğaltma.

Information Schema Sorguları

Şema meta verilerini almak için yerleşik veritabanı görünümleri INFORMATION_SCHEMA.COLUMNS'ı doğrudan sorgulama.

Belgelendirmeyi otomatikleştirme veya sütun tanımlarına dayalı olarak uygulama kodunu dinamik olarak üretme.

SQL İşlevleri/Saklı Yordamlar

Bir tablonun var olup olmadığını kontrol eden, varsa düşüren ve sonra yeniden oluşturan veritabanı rutinleri yazma (genellikle IF EXISTS / CREATE TABLE deseni olarak adlandırılır).

Dağıtım veya kurulum betiklerini otomatikleştirme

Görsel planlama için, pgAdmin, MySQL Workbench veya SQL Server Management Studio gibi GUI araçlarını kullanarak DDL betikleri üretebilir, ilişki diyagramları çizebilir ve teknik ve teknik olmayan ekip üyeleri arasında iş birliğini geliştirebilirsiniz.

Yaygın Hatalar ve En İyi Uygulamalar

SQL'de verimli ve sürdürülebilir tablolar tasarlamak, veritabanınızın en iyi şekilde çalışmasını sağlar. SQL'de tablo oluştururken önerdiğim ipuçları şunlardır: 

  • Aşırı normalizasyon: Tabloları çok sayıda küçük parçaya bölmek birleştirmeleri karmaşıklaştırabilir ve sorguları yavaşlatabilir; yetersiz normalizasyon ise veri tekrarına yol açabilir. Bunu önlemek için, başlangıçta her zaman 3NF kullanın; ardından yalnızca okuma hızını güncelleme basitliğine tercih ettiğiniz belirli raporlama tabloları için denormalizasyon uygulayın.

  • Zayıf kısıtlama tasarımı: Yabancı anahtarların eksik olması gibi kısıtlamaları tanımlamamak, temizlenmesi zor yetim kayıtlar veya tutarsız verilere yol açabilir. Birleştirmelerin hızlı olmasını sağlamak için FOREIGN KEY olarak görev yapan her sütuna mutlaka bir dizin belirtin.

  • Açık adlandırma ve dokümantasyon: Her zaman öngörülebilir, açıklayıcı tablo ve sütun adları kullanın. Şema güncellemeleri için basit bir değişiklik günlüğü tutun ve gelecekteki geliştiricilerin anlamayabileceği kısaltmalardan kaçının.

  • İzinler ve güvenlik hususları: Üretim ortamları için tablolar tasarlarken, tablo oluşturma, değiştirme veya düşürme gibi yalnızca gerekli ayrıcalıkları verin ve kritik verileri korumak için okuma/yazma erişimini ayırın. Ek olarak, değişiklikleri izlemek için şema düzeyinde kontroller ve denetim günlükleri uygulayın; bu sayede yetkisiz erişimi önlerken uyumluluk ve veri güvenliğini sağlayın.

Sonuç

Bulut platformlarındaki gelişmelerle birlikte, CREATE TABLE deyimi daha esnek hale geliyor. Artık otomasyon araçları ve sunucusuz özellikler şema yönetimini ve geçişleri basitleştiriyor. Ölçeklenebilir veritabanları oluşturmanıza yardımcı olmak için şema geçiş çerçeveleri (Flyway, Liquibase), boyutsal modelleme ve ileri düzey normalizasyon ile denormalizasyon stratejileri gibi konuları keşfetmenizi öneririm.

Ayrıca Database Design kursumuza katılmanızı tavsiye ederim; bu kursta veritabanları oluşturmayı ve yönetmeyi, ihtiyaçlarınıza uygun DBMS'yi seçmeyi öğrenirsiniz. Son olarak, veri mühendisliği ve veri ambarının temellerini öğrenmek için Associate Data Engineer in SQL kariyer yolumuzu deneyin. 

Allan Ouko

Yazar

Allan Ouko

Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.

SSS

Tablolar arasındaki ilişkileri nasıl oluştururum?

Başka bir tablodaki sütunlara referans veren FOREIGN KEY kısıtlamalarını kullanın.

Başka bir tablonun yapısını temel alarak tablo oluşturabilir miyim?

Evet, mevcut bir tablonun yapısını ve isteğe bağlı olarak verilerini klonlamak için CREATE TABLE AS SELECT deyimini kullanabilirsiniz.

Geçici tablo ile normal tablo arasındaki fark nedir?

Geçici tablolar yalnızca bir oturum veya işlem süresince var olurken, normal tablolar veritabanında kalıcıdır.

FOREIGN KEY kısıtlamalarında kullanılan sütunları neden dizinlemeliyim?

Ebeveyn ve çocuk tablolar arasındaki birleştirme işlemlerini hızlandırmak için sütunları dizinlemelisiniz.

Konular

İlgili