Veritabanı Şema Tasarımı
Bu bölümde, e-ticaret web uygulaması için veritabanı şema tasarımını detaylı olarak ele alacağız. Veritabanı şeması, uygulamanın veri yapısını tanımlar ve tablolar arasındaki ilişkileri gösterir.Entity İlişki Diyagramı (ERD)
Aşağıda, e-ticaret uygulaması için tasarlanan veritabanı şemasının Entity İlişki Diyagramı (ERD) bulunmaktadır. Bu diyagram, tablolar arasındaki ilişkileri görsel olarak temsil eder.Tablo Yapıları
Aşağıda, e-ticaret uygulaması için tasarlanan veritabanı tablolarının detaylı açıklamaları bulunmaktadır.1. USERS Tablosu
Bu tablo, sistemdeki kullanıcıları temsil eder. Müşteriler ve yöneticiler gibi farklı kullanıcı türleri bu tabloda saklanır.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| username | VARCHAR(50) | Kullanıcı adı, benzersiz |
| VARCHAR(100) | E-posta adresi, benzersiz | |
| password | VARCHAR(255) | Şifrelenmiş parola |
| first_name | VARCHAR(50) | Kullanıcının adı |
| last_name | VARCHAR(50) | Kullanıcının soyadı |
| phone | VARCHAR(20) | Telefon numarası |
| is_active | BOOLEAN | Hesabın aktif olup olmadığı |
| role | VARCHAR(20) | Kullanıcı rolü (ADMIN, USER, vb.) |
| created_at | TIMESTAMP | Hesabın oluşturulma tarihi |
| updated_at | TIMESTAMP | Hesabın son güncellenme tarihi |
2. CATEGORIES Tablosu
Bu tablo, ürün kategorilerini temsil eder. Kategoriler hiyerarşik bir yapıda olabilir (ana kategoriler ve alt kategoriler).| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| name | VARCHAR(100) | Kategori adı |
| description | TEXT | Kategori açıklaması |
| parent_id | BIGINT | Üst kategori ID’si (NULL ise ana kategoridir) |
| created_at | TIMESTAMP | Kategorinin oluşturulma tarihi |
| updated_at | TIMESTAMP | Kategorinin son güncellenme tarihi |
3. PRODUCTS Tablosu
Bu tablo, sistemdeki ürünleri temsil eder.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| name | VARCHAR(255) | Ürün adı |
| description | TEXT | Ürün açıklaması |
| price | DECIMAL(10,2) | Ürün fiyatı |
| stock_quantity | INT | Stok miktarı |
| image_url | VARCHAR(255) | Ana ürün görselinin URL’si |
| category_id | BIGINT | Kategori ID’si (Yabancı anahtar) |
| created_at | TIMESTAMP | Ürünün oluşturulma tarihi |
| updated_at | TIMESTAMP | Ürünün son güncellenme tarihi |
4. PRODUCT_IMAGES Tablosu
Bu tablo, ürünlere ait görselleri temsil eder. Bir ürünün birden fazla görseli olabilir.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| product_id | BIGINT | Ürün ID’si (Yabancı anahtar) |
| image_url | VARCHAR(255) | Görsel URL’si |
| is_primary | BOOLEAN | Ana görsel olup olmadığı |
| created_at | TIMESTAMP | Görselin oluşturulma tarihi |
5. ADDRESSES Tablosu
Bu tablo, kullanıcılara ait adresleri temsil eder. Bir kullanıcının birden fazla adresi olabilir.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| user_id | BIGINT | Kullanıcı ID’si (Yabancı anahtar) |
| address_line1 | VARCHAR(255) | Adres satırı 1 |
| address_line2 | VARCHAR(255) | Adres satırı 2 (opsiyonel) |
| city | VARCHAR(100) | Şehir |
| state | VARCHAR(100) | Eyalet/İl |
| postal_code | VARCHAR(20) | Posta kodu |
| country | VARCHAR(100) | Ülke |
| is_default | BOOLEAN | Varsayılan adres olup olmadığı |
| address_type | VARCHAR(20) | Adres tipi (SHIPPING, BILLING) |
| created_at | TIMESTAMP | Adresin oluşturulma tarihi |
| updated_at | TIMESTAMP | Adresin son güncellenme tarihi |
6. ORDERS Tablosu
Bu tablo, kullanıcılar tarafından verilen siparişleri temsil eder.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| user_id | BIGINT | Kullanıcı ID’si (Yabancı anahtar) |
| order_date | TIMESTAMP | Sipariş tarihi |
| total_amount | DECIMAL(10,2) | Toplam sipariş tutarı |
| status | VARCHAR(20) | Sipariş durumu (PENDING, SHIPPED, DELIVERED) |
| shipping_addr_id | BIGINT | Teslimat adresi ID’si (Yabancı anahtar) |
| billing_addr_id | BIGINT | Fatura adresi ID’si (Yabancı anahtar) |
| created_at | TIMESTAMP | Siparişin oluşturulma tarihi |
| updated_at | TIMESTAMP | Siparişin son güncellenme tarihi |
7. ORDER_DETAILS Tablosu
Bu tablo, siparişlerdeki ürünleri ve miktarlarını temsil eder.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| order_id | BIGINT | Sipariş ID’si (Yabancı anahtar) |
| product_id | BIGINT | Ürün ID’si (Yabancı anahtar) |
| quantity | INT | Ürün miktarı |
| price | DECIMAL(10,2) | Birim fiyat (sipariş anındaki) |
| subtotal | DECIMAL(10,2) | Alt toplam (miktar * birim fiyat) |
| created_at | TIMESTAMP | Kaydın oluşturulma tarihi |
8. PAYMENTS Tablosu
Bu tablo, siparişlere ait ödeme bilgilerini temsil eder.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| order_id | BIGINT | Sipariş ID’si (Yabancı anahtar) |
| payment_date | TIMESTAMP | Ödeme tarihi |
| payment_method | VARCHAR(50) | Ödeme yöntemi (CREDIT_CARD, PAYPAL, vb.) |
| amount | DECIMAL(10,2) | Ödeme tutarı |
| status | VARCHAR(20) | Ödeme durumu (PENDING, COMPLETED, FAILED) |
| created_at | TIMESTAMP | Kaydın oluşturulma tarihi |
| updated_at | TIMESTAMP | Kaydın son güncellenme tarihi |
9. REVIEWS Tablosu
Bu tablo, kullanıcıların ürünlere yaptığı değerlendirmeleri ve yorumları temsil eder.| Alan Adı | Veri Tipi | Açıklama |
|---|---|---|
| id | BIGINT | Birincil anahtar, otomatik artan |
| product_id | BIGINT | Ürün ID’si (Yabancı anahtar) |
| user_id | BIGINT | Kullanıcı ID’si (Yabancı anahtar) |
| rating | INT | Değerlendirme puanı (1-5) |
| comment | TEXT | Yorum metni |
| review_date | TIMESTAMP | Değerlendirme tarihi |
| created_at | TIMESTAMP | Kaydın oluşturulma tarihi |
| updated_at | TIMESTAMP | Kaydın son güncellenme tarihi |
İlişkiler ve Kısıtlamalar
Veritabanı tablolarının birbirleriyle olan ilişkileri ve kısıtlamaları aşağıda açıklanmıştır:Birincil Anahtarlar (Primary Keys)
Her tabloda,id alanı birincil anahtar olarak tanımlanmıştır. Bu alan, otomatik artan bir değere sahiptir ve her kayıt için benzersizdir.
Yabancı Anahtarlar (Foreign Keys)
-
CATEGORIES Tablosu:
parent_id->CATEGORIES.id(Kendi kendine referans - self-reference)
-
PRODUCTS Tablosu:
category_id->CATEGORIES.id
-
PRODUCT_IMAGES Tablosu:
product_id->PRODUCTS.id
-
ADDRESSES Tablosu:
user_id->USERS.id
-
ORDERS Tablosu:
user_id->USERS.idshipping_addr_id->ADDRESSES.idbilling_addr_id->ADDRESSES.id
-
ORDER_DETAILS Tablosu:
order_id->ORDERS.idproduct_id->PRODUCTS.id
-
PAYMENTS Tablosu:
order_id->ORDERS.id
-
REVIEWS Tablosu:
product_id->PRODUCTS.iduser_id->USERS.id
Benzersizlik Kısıtlamaları (Unique Constraints)
-
USERS Tablosu:
usernamealanı benzersiz olmalıdır.emailalanı benzersiz olmalıdır.
-
CATEGORIES Tablosu:
namealanı, aynıparent_iddeğerine sahip kategoriler arasında benzersiz olmalıdır.
Diğer Kısıtlamalar
-
PRODUCTS Tablosu:
pricealanı sıfırdan büyük olmalıdır.stock_quantityalanı sıfır veya daha büyük olmalıdır.
-
REVIEWS Tablosu:
ratingalanı 1 ile 5 arasında olmalıdır.
-
ORDERS Tablosu:
statusalanı yalnızca belirli değerleri alabilir (PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED).
-
PAYMENTS Tablosu:
statusalanı yalnızca belirli değerleri alabilir (PENDING, COMPLETED, FAILED, REFUNDED).
İndeksler
Veritabanı performansını artırmak için aşağıdaki indeksler oluşturulacaktır:-
USERS Tablosu:
usernameveemailalanları için benzersiz indeksler.
-
PRODUCTS Tablosu:
category_idalanı için indeks.namealanı için indeks (arama işlemleri için).
-
ORDERS Tablosu:
user_idalanı için indeks.statusalanı için indeks (filtreleme işlemleri için).
-
ORDER_DETAILS Tablosu:
order_idveproduct_idalanları için indeksler.
-
REVIEWS Tablosu:
product_idalanı için indeks.
Normalizasyon
Veritabanı şeması, aşağıdaki normalizasyon kurallarına uygun olarak tasarlanmıştır:- Birinci Normal Form (1NF): Tüm tablolardaki alanlar atomiktir (bölünemez).
- İkinci Normal Form (2NF): Tüm tablolar 1NF’dedir ve tüm alanlar birincil anahtara tam bağımlıdır.
- Üçüncü Normal Form (3NF): Tüm tablolar 2NF’dedir ve birincil anahtar olmayan alanlar, birincil anahtara geçişsiz olarak bağımlıdır.