
MySQL Database Yapısı, Constraints, Views ve Güvenlik
MySQL yalnızca veri depolamak için kullanılmaz. Ayrıca database yapılarını tasarlamak, ilişkileri tanımlamak, veri bütünlüğünü korumak, sorgu performansını iyileştirmek ve uygulamaları SQL injection gibi tehlikeli saldırılara karşı korumak için de kullanılır.
SELECT, WHERE, INSERT, UPDATE, DELETE, JOIN, GROUP BY gibi temel SQL komutlarını öğrendikten sonra ve HAVING, bir sonraki önemli adım databases'nun ve tabloların nasıl oluşturulduğunu ve kontrol edildiğini anlamaktır. Buna databases oluşturma, tablolar oluşturma, kısıtlamaları tanımlama, indexes kullanma, tarihleri yönetme, görünüm oluşturma ve prepared statements ile güvenli sorgular yazma dahildir.
Bu makalede öğrenme yolunda gösterilen MySQL konuları açıklanmaktadır: DB Oluştur, DB Bırak, Tablo Oluştur, Tablo Bırak, Tabloyu Değiştir, Kısıtlamalar, NOT NULL, UNIQUE, Birincil Anahtar, Yabancı Anahtar, CHECK, DEFAULT, Dizin Oluştur, Otomatik Artış, Tarihler, Görünümler, SQL Enjeksiyonu ve Hazırlanan İfadeler.
MySQL Veritabanı Oluştur
Bir database oluşturmak genellikle bir MySQL projesi oluşturmanın ilk adımıdır. database, tabloları, görünümleri, indexes’i, ilişkileri ve diğer database nesnelerini barındıran bir kapsayıcıdır.
MySQL'da, CREATE DATABASE ifadesi kullanılarak bir database oluşturulabilir.
CREATE DATABASE company_db;Bu komut, şirket_db adında yeni bir database oluşturur. database'yu oluşturduktan sonra içinde tablolar oluşturmadan önce onu seçmeniz gerekir.
USE company_db;Gerçek uygulamalarda database adlarının açık ve anlamlı olması gerekir. Örneğin okul_db, e-ticaret_db, blog_db veya envanter_db gibi adların anlaşılması, rastgele adlardan daha kolaydır.
Zaten mevcut değilse, bir database da oluşturabilirsiniz. Bu, kurulum komut dosyalarını birden çok kez çalıştırırken hataların önlenmesine yardımcı olur.
CREATE DATABASE IF NOT EXISTS company_db;Veritabanı oluşturma genellikle proje kurulumu, dağıtımı, testi sırasında veya geliştirme için yeni bir ortam hazırlanırken yapılır.
MySQL Bırakma DB'si
DROP DATABASE deyimi, içindeki tüm tablolar ve veriler de dahil olmak üzere database'nun tamamını siler.
DROP DATABASE company_db;Bu komut tehlikelidir çünkü database yapısını ve depolanan verileri kalıcı olarak kaldırır. Kullanmadan önce her zaman doğru database üzerinde çalıştığınızdan ve veriler önemliyse bir yedeğin mevcut olduğundan emin olmalısınız.
Daha güvenli bir sürüm, database mevcut değilse bir hatayı önlemek için IF EXISTS kullanır.
DROP DATABASE IF EXISTS company_db;Üretim sistemlerinde database'nun düşürülmesi güvenilir yöneticilerle sınırlandırılmalıdır. Geliştiriciler, inceleme, yedekleme ve onay olmadan canlı bir database üzerinde yıkıcı komutları asla çalıştırmamalıdır.
MySQL Tablo Oluştur
Tablo, verileri satırlar ve sütunlar halinde saklar. Her tablo, kullanıcılar, ürünler, siparişler, gönderiler, ödemeler, yorumlar veya kategoriler gibi net bir kavramı temsil etmelidir.
CREATE TABLE ifadesi bir tabloyu ve sütunlarını tanımlamak için kullanılır.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);Bu örnek, dört sütunlu bir kullanıcılar tablosu oluşturur: id, name, email ve created_at.
Kimlik sütunu otomatik olarak artan bir birincil anahtardır. Ad sütunu boş olamaz. E-posta sütunu benzersiz olmalıdır. created_at sütunu, satırın oluşturulduğu tarih ve saati saklar.
İyi tablo tasarımı önemlidir çünkü performansı, veri kalitesini ve sürdürülebilirliği etkiler. İyi tasarlanmış bir tablo, uygun veri türlerini, anlaşılır sütun adlarını, anlamlı kısıtlamaları ve gerektiğinde indexes’i kullanır.
MySQL Bırakma Tablosu
DROP TABLE deyimi bir tabloyu ve içinde depolanan tüm verileri siler.
DROP TABLE users;Bu komut tablo yapısını ve kayıtları kalıcı olarak kaldırır. Özellikle üretim ortamlarında dikkatli kullanılmalıdır.
Ayrıca bir tabloyu yalnızca mevcutsa bırakabilirsiniz.
DROP TABLE IF EXISTS users;Bir tabloyu bırakmak, satırları silmekten farklıdır. DELETE tablodaki verileri kaldırırken DROP TABLE tablonun kendisini kaldırır.
DELETE FROM users;DELETE ifadesi tablo yapısını korur. DROP TABLE hem yapıyı hem de verileri kaldırır.
MySQL Alt Tabla
ALTER TABLE ifadesi mevcut bir tabloyu değiştirmek için kullanılır. Sütunlar ekleyebilir, sütunları değiştirebilir, sütunları yeniden adlandırabilir, sütunları çıkarabilir, kısıtlamalar ekleyebilir veya indexes oluşturabilir.
Örneğin, kullanıcılar tablosuna bir telefon sütunu ekleyebilirsiniz.
ALTER TABLE users
ADD phone VARCHAR(30);Mevcut bir sütunun veri türünü veya boyutunu değiştirebilirsiniz.
ALTER TABLE users
MODIFY name VARCHAR(150) NOT NULL;Artık gerekmiyorsa bir sütunu da bırakabilirsiniz.
ALTER TABLE users
DROP COLUMN phone;Gerçek projelerde masa değiştirme işlemleri dikkatli yapılmalıdır. Tablo zaten veri içeriyorsa sütunların değiştirilmesi veri kaybına, dönüştürme sorunlarına veya uygulama hatalarına neden olabilir.
Laravel gibi çerçeveler genellikle tablo değişikliklerini geçişler yoluyla yönetir. Geçiş, database tablolarını farklı ortamlarda güvenli bir şekilde oluşturmanın ve değiştirmenin sürüm kontrollü bir yoludur.
MySQL Kısıtlamaları
Kısıtlamalar, veri bütünlüğünü korumak için tablo sütunlarına uygulanan kurallardır. database'nun geçerli, tutarlı ve güvenilir veriler içermesini sağlamaya yardımcı olurlar.
Yaygın MySQL kısıtlamaları arasında NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK ve DEFAULT bulunur.
Kısıtlamalar önemlidir çünkü uygulama kodu tek başına verileri korumak için yeterli değildir. Bir kullanıcı, komut dosyası, içe aktarma aracı veya başka bir hizmet, database'ya veri ekleyebilir. Kısıtlamalar, önemli kuralların uygulanmasından database'nun kendisini sorumlu kılmaktadır.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(150) NOT NULL,
sku VARCHAR(100) UNIQUE,
price DECIMAL(10, 2) CHECK (price >= 0),
status VARCHAR(20) DEFAULT 'active'
);Bu tabloda geçersiz ürün verilerini önlemek için birden fazla kısıtlama kullanılmaktadır. Ad gereklidir, SKU benzersiz olmalıdır, fiyat negatif olamaz ve durumun varsayılan bir değeri vardır.
MySQL NOT NULL
NOT NULL kısıtlaması, bir sütunun NULL değerlerini depolamasını engeller. Bu, sütunun her zaman bir değere sahip olması gerektiği anlamına gelir.
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL
);Bu örnekte her müşterinin bir adı ve e-posta adresi olması gerekir. MySQL, bu sütunlara NULL eklemeye çalışan tüm satırları reddedecektir.
NOT NULL, ilişkinin zorunlu olduğu durumlarda adlar, e-postalar, sipariş numaraları, ürün başlıkları, kullanıcı parolaları ve yabancı anahtar referansları gibi gerekli alanlar için kullanışlıdır.
Ancak her sütun NOT NULL olmamalıdır. Uygulamanın boş değerlere izin vermesi durumunda orta_ad, ikinci_telefon, silinen_at veya notlar gibi isteğe bağlı veriler geçersiz kılınabilir.
MySQL UNIQUE
UNIQUE kısıtlaması, bir sütunda veya sütun grubunda yinelenen değerleri önler.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(150) NOT NULL UNIQUE
);Bu, iki kullanıcının aynı e-posta adresine sahip olamayacağı anlamına gelir.
UNIQUE kısıtlamaları genellikle e-postalar, kullanıcı adları, ürün SKU'ları, fatura numaraları, ulusal kimlikler, bilgiler ve API belirteçleri için kullanılır.
Ayrıca birden fazla sütunda benzersiz bir kural da tanımlayabilirsiniz. Buna bileşik benzersiz kısıtlama denir.
CREATE TABLE course_registrations (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
UNIQUE (student_id, course_id)
);Bu örnekte aynı öğrenci aynı derse birden fazla kayıt yaptıramaz.
MySQL Birincil Anahtar
PRIMARY KEY, bir tablodaki her satırı benzersiz şekilde tanımlar. Her tablonun genellikle bir birincil anahtarı olmalıdır.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
body TEXT
);Kimlik sütunu her gönderiyi benzersiz şekilde tanımlar. Hiçbir iki satır aynı birincil anahtar değerine sahip olamaz ve birincil anahtar NULL olamaz.
Birincil anahtarlar kayıtları bulmak, kayıtları güncellemek, kayıtları silmek, ilişkiler oluşturmak ve yabancı anahtarları kullanarak tabloları bağlamak için kullanılır.
Çoğu MySQL tablosu, birincil anahtar olarak otomatik artan bir tamsayı kullanır. Bazı sistemler, özellikle de dağıtılmış sistemler bunun yerine UUID'leri kullanabilir, ancak otomatik artan kimlikler basit ve birçok uygulama için yaygındır.
MySQL Yabancı Anahtar
FOREIGN KEY, iki tablo arasında bir ilişki oluşturur. Bir tablodaki değerin başka bir tablodaki geçerli bir satıra karşılık gelmesini sağlar.
Örneğin bir sipariş genellikle bir kullanıcıya aittir. Siparişler tablosu, kullanıcılar tablosuna başvuran bir user_id'yi saklayabilir.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);Bu, her siparişin mevcut bir kullanıcıya ait olması gerektiği anlamına gelir. MySQL, bir siparişin mevcut olmayan bir kullanıcı kimliğine referans vermesine izin vermez.
Yabancı anahtarlar ilişkisel bütünlüğü korur. Kullanıcısız siparişler, gönderisiz yorumlar veya siparişsiz sipariş_ürünleri gibi yetim kayıtların önlenmesine yardımcı olurlar.
Yabancı anahtarlar ayrıca güncelleme ve silme eylemlerini de tanımlayabilir.
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (post_id) REFERENCES posts(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);ON DELETE CASCADE ile bir gönderiyi sildiğinizde ilgili yorumlar da silinir. Bu yararlı olabilir ancak ilgili birçok kaydı otomatik olarak kaldırabileceğinden dikkatli kullanılmalıdır.
MySQL CHECK
CHECK kısıtlaması, değerlerin eklenmeden veya güncellenmeden önce karşılanması gereken bir koşulu tanımlamak için kullanılır.
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) CHECK (salary >= 0)
);Bu, negatif maaşların depolanmasını önler.
CHECK kısıtlamaları pozitif fiyatlar, geçerli yüzdeler, minimum yaşlar, kabul edilen durum değerleri ve sayısal aralıklar gibi kurallar için kullanışlıdır.
CREATE TABLE coupons (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL UNIQUE,
discount_percent INT CHECK (discount_percent BETWEEN 1 AND 100)
);Bu örnekte yalnızca 1 ile 100 arasındaki indirim yüzdelerine izin verilmektedir.
Basit veri kuralları için CHECK kısıtlamaları kullanılmalıdır. Daha karmaşık business logic genellikle uygulama kodunda veya stored procedures'da ele alınır.
MySQL DEFAULT
DEFAULT kısıtlaması, ekleme sırasında hiçbir değer sağlanmadığında bir sütuna varsayılan bir değer atar.
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(150) NOT NULL,
status VARCHAR(30) DEFAULT 'pending',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);Bir görev durum olmadan eklenirse, MySQL otomatik olarak bekleyenleri saklar. created_at sağlanmazsa MySQL geçerli tarih ve saati saklar.
INSERT INTO tasks (title)
VALUES ('Prepare database backup');DEFAULT değerleri kesici uçları basitleştirir ve tutarlılığın korunmasına yardımcı olur. Genellikle durumlar, zaman damgaları, sayaçlar, bayraklar ve konfigürasyon benzeri değerler için kullanılırlar.
MySQL Dizin Oluştur
index, MySQL'nun verileri daha hızlı bulmasına yardımcı olan bir database yapısıdır. Seçilen sütunlar için organize bir arama sistemi gibi çalışır.
CREATE INDEX deyimi, bir veya daha fazla sütunda bir index oluşturur.
CREATE INDEX idx_users_email
ON users (email);Bu index, e-postayla aramaları daha hızlı yapabilir.
SELECT *
FROM users
WHERE email = 'adnan@example.com';Dizinler, WHERE, JOIN, ORDER BY ve GROUP BY yan tümcelerinde sıklıkla kullanılan sütunlar için kullanışlıdır.
CREATE INDEX idx_orders_user_id
ON orders (user_id);Bu index, belirli bir kullanıcı için siparişleri alan sorguları iyileştirebilir.
Ancak indexes ücretsiz değildir. Repositorylama alanı kaplarlar ve INSERT, UPDATE ve DELETE işlemlerini yavaşlatabilirler çünkü MySQL'nun veriler değiştiğinde index'yu güncellemesi gerekir.
İyi bir indexing stratejisi gerçek sorgu modellerine odaklanır. indexes’i rastgele oluşturmayın. Sık aranan, birleştirilen, filtrelenen veya sıralanan sütunlar için bunları oluşturun.
MySQL Otomatik Artış
AUTO_INCREMENT, yeni bir satır eklendiğinde bir sütun için otomatik olarak yeni bir sayısal değer üretir. Genellikle birincil anahtarlarla kullanılır.
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);Yeni bir kategori eklerken kimliği girmenize gerek yoktur.
INSERT INTO categories (name)
VALUES ('Programming');MySQL, bir sonraki kullanılabilir numarayı otomatik olarak kimlik sütununa atayacaktır.
AUTO_INCREMENT birçok sistem için basit ve pratiktir. Kayıtlara başvurulmasını kolaylaştırır ve birincil anahtar oluşturmanın otomatik olmasını sağlar.
Önemli bir ayrıntı da silinen kimliklerin genellikle yeniden kullanılmamasıdır. 5. satır silinirse, bir sonraki eklenen satır daha yüksek bir sayıyla devam edebilir. Bu normaldir ve bir hata olarak değerlendirilmemelidir.
MySQL Tarihler
MySQL çeşitli tarih ve saat veri türleri sağlar. En yaygın olanları DATE, TIME, DATETIME ve TIMESTAMP'tır.
TARİH: yalnızca 2026-06-10 gibi bir tarihi saklar.
TIME: yalnızca 14:30:00 gibi bir saati saklar.
DATETIME: tarih ve saati birlikte saklar.
TIMESTAMP: tarih ve saati saklar ve sıklıkla created_at ve update_at değerleri için kullanılır.
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(150) NOT NULL,
event_date DATE NOT NULL,
starts_at DATETIME NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Tarihler, kayıtları filtrelemek, raporlar oluşturmak, etkinlikleri izlemek, etkinlikleri planlamak ve günlükleri yönetmek için önemlidir.
SELECT *
FROM events
WHERE event_date >= '2026-06-01';Ayrıca NOW(), CURDATE(), DATE(), YEAR(), MONTH() ve DATEDIFF() gibi MySQL tarih işlevlerini de kullanabilirsiniz.
SELECT NOW();
SELECT CURDATE();
SELECT YEAR(created_at) FROM users;Profesyonel uygulamalarda zaman dilimleri dikkatli kullanılmalıdır. Çoğu sistem, tarihleri database'da UTC'de saklar ve bunları uygulamadaki kullanıcının yerel saatine dönüştürür.
MySQL Görünümler
Görünüm, SELECT sorgusunu temel alan sanal bir tablodur. Genellikle verileri kendisi saklamaz. Bunun yerine, kayıtlı bir sorgu aracılığıyla bir veya daha fazla tablodaki verileri gösterir.
Görünümler CREATE VIEW deyimi kullanılarak oluşturulur.
CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE status = 'active';Görünümü oluşturduktan sonra normal bir tablo gibi sorgulayabilirsiniz.
SELECT *
FROM active_users;Görünümler, karmaşık sorguları basitleştirmek, hassas sütunları gizlemek, daha temiz raporlama yapıları sağlamak veya sınırlı verileri belirli kullanıcılara veya hizmetlere sunmak istediğinizde kullanışlıdır.
Örneğin uzun bir birleştirme sorgusunu birçok yerde tekrarlamak yerine bir görünüm oluşturabilir ve gerektiğinde onu sorgulayabilirsiniz.
CREATE VIEW order_summary AS
SELECT
orders.id AS order_id,
users.name AS customer_name,
orders.total,
orders.created_at
FROM orders
INNER JOIN users ON users.id = orders.user_id;Görünümler okunabilirliği artırabilir ancak uygun tablo tasarımının yerine kullanılmamalıdır. Çok karmaşık görünümlerde hata ayıklamak zorlaşabilir ve dikkatsizce kullanılırsa performansı etkileyebilir.
MySQL Enjeksiyon
SQL injection, kullanıcı girişinin uygun koruma olmadan doğrudan bir SQL sorgusuna eklenmesi durumunda ortaya çıkan ciddi bir güvenlik açığıdır.
Örneğin, kullanıcı girişi doğrudan SQL dizesine birleştirildiğinde bu tür bir sorgu tehlikelidir.
SELECT *
FROM users
WHERE email = '$email' AND password = '$password';Bir saldırgan girişi kontrol ederse sorgunun anlamını değiştirmeye çalışabilir. Bu, yetkisiz oturum açmaya, veri sızıntılarına, veri değişikliğine ve hatta database kayıtlarının silinmesine neden olabilir.
SQL injection yalnızca bir MySQL sorunu değildir. Geliştiriciler SQL sorgularını yanlış oluşturduğunda birçok database sisteminde bu durumla karşılaşılabilir.
SQL injection'nun ana nedenleri şunlardır:
Kullanıcı girişini doğrudan SQL sorgularına birleştirme.
validation olmadan form verilerine, URL parametrelerine, çerezlere veya başlıklara güvenme.
Parametre bağlama olmadan ham SQL kullanma.
Kullanıcılara ayrıntılı database hataları gösteriliyor.
database kullanıcısına gereğinden fazla izin verilmesi.
SQL injection risklerini azaltmak için geliştiriciler prepared statements kullanmalı, girişleri doğrulamalı, gerektiğinde çıktıdan kaçmalı, en az ayrıcalıklı database hesaplarını kullanmalı ve dahili hata ayrıntılarını açığa çıkarmaktan kaçınmalıdır.
MySQL Hazırlanan Tablolar
Hazırlanan ifadeler, SQL sorgularını enjeksiyon saldırılarından korumanın en önemli yollarından biridir. SQL yapısını kullanıcı tarafından sağlanan değerlerden ayırırlar.
Kullanıcı girişini doğrudan sorguya yerleştirmek yerine yer tutucular kullanılır. Değerler daha sonra güvenli bir şekilde bağlanır.
SELECT *
FROM users
WHERE email = ?;PHP'da, prepared statements PDO ile yaygın olarak kullanılır.
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=company_db;charset=utf8mb4',
'root',
'',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$email = $_POST['email'] ?? '';
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE email = :email');
$stmt->execute([
'email' => $email,
]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>Bu örnekte:email adlandırılmış bir yer tutucudur. Gerçek e-posta değeri, yürütme() işlevine ayrı olarak iletilir. PDO, değeri SQL komutunun bir parçası olarak ele almak yerine güvenli bir şekilde işler.
Kullanıcı girişi söz konusu olduğunda SELECT, INSERT, UPDATE ve DELETE sorguları için hazırlanan ifadeler kullanılmalıdır.
<?php
$stmt = $pdo->prepare(
'INSERT INTO users (name, email) VALUES (:name, :email)'
);
$stmt->execute([
'name' => $name,
'email' => $email,
]);
?>Hazırlanan bildirimler tüm güvenlik uygulamalarının yerine geçmez ancak güvenli database programlama için temel bir gereksinimdir.
Bu MySQL Konseptleri Birlikte Nasıl Çalışır?
Gerçek bir uygulamada bu kavramlar birbirinden ayrı değildir. Güvenilir ve emniyetli bir database katmanı oluşturmak için birlikte çalışırlar.
Örneğin, bir e-ticaret sistemi bir database oluşturabilir, kullanıcılar ve siparişler için tablolar tanımlayabilir, kayıtları bağlamak için birincil anahtarları ve yabancı anahtarları kullanabilir, daha hızlı arama için indexes ekleyebilir, izleme için varsayılan zaman damgalarını kullanabilir, raporlar için görünümler oluşturabilir ve kullanıcı girişini korumak için prepared statements'yu kullanabilir.
CREATE DATABASE IF NOT EXISTS shop_db;
USE shop_db;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL CHECK (total >= 0),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_orders_user_id
ON orders (user_id);
CREATE VIEW user_order_summary AS
SELECT
users.id AS user_id,
users.name,
users.email,
COUNT(orders.id) AS total_orders,
SUM(orders.total) AS total_spent
FROM users
LEFT JOIN orders ON orders.user_id = users.id
GROUP BY users.id, users.name, users.email;Bu örnekte database oluşturma, tablo oluşturma, kısıtlamalar, otomatik artış, birincil anahtarlar, yabancı anahtarlar, indexes, tarihler ve görünümler tek bir yapıda gösterilmektedir.
Uygulama daha sonra kullanıcı girişine göre veri eklerken, güncellerken, silerken veya alırken prepared statements kullanmalıdır.
MySQL Veritabanı Tasarımı için En İyi Uygulamalar
İyi MySQL tasarımı, geçerli SQL yazmaktan daha fazlasıdır. Açık bir yapı, veri bütünlüğü, performans farkındalığı ve güvenlik gerektirir.
Açık ve tutarlı database, tablo ve sütun adları kullanın.
Her sütun için uygun veri türlerini seçin.
Önemli tablolara birincil anahtarlar ekleyin.
İlişkilerin korunması gerektiğinde yabancı anahtarları kullanın.
Gerekli alanlar için NOT NULL kullanın.
Çoğaltılmaması gereken değerler için UNIQUE kullanın.
Yaygın otomatik değerler için DEFAULT değerlerini kullanın.
Gerçek sorgu ihtiyaçlarına göre indexes oluşturun.
DROP DATABASE ve DROP TABLE komutlarına dikkat edin.
Tüm kullanıcı girişi için prepared statements kullanın.
Yıkıcı değişikliklerden önce yedekleri saklayın.
Profesyonel projelerdeki database değişikliklerini takip etmek için geçişleri kullanın.
Sonuç
MySQL database yapısı, backend geliştiricileri, tam yığın geliştiricileri ve veri odaklı uygulamalarla çalışan herkes için temel bir beceridir. databases'nun nasıl oluşturulacağını, tabloların nasıl tasarlanacağını, kısıtlamaların nasıl tanımlanacağını, indexes'nun nasıl kullanılacağını, tarihlerin nasıl yönetileceğini, görünümlerin nasıl oluşturulacağını ve SQL injection'dan sorguların nasıl korunacağını anlamak, geliştiricilerin daha güvenli ve daha güvenilir sistemler oluşturmasına yardımcı olur.
CREATE DATABASE, CREATE TABLE, ALTER TABLE ve CREATE INDEX gibi komutlar database'nun yapısını tanımlar. NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK ve DEFAULT gibi kısıtlamalar depolanan verilerin kalitesini korur. Görünümler veri erişimini basitleştirirken prepared statements, uygulamaları tehlikeli SQL injection saldırılarına karşı korur.
Bu konuları dikkatli bir şekilde öğrenmek, ister basit bir blog, ister bir Laravel uygulaması, bir yönetici kontrol paneli, bir e-ticaret platformu veya büyük bir backend sistemi oluşturuyor olun, gerçek projelerde MySQL ile çalışmak için güçlü bir temel sağlar.

