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.

+----------------+       +----------------+       +----------------+
|     USERS      |       |   CATEGORIES   |       |    PRODUCTS    |
+----------------+       +----------------+       +----------------+
| PK: id         |       | PK: id         |       | PK: id         |
| username       |       | name           |       | name           |
| email          |       | description    |       | description    |
| password       |       | parent_id (FK) |       | price          |
| first_name     |       +----------------+       | stock_quantity |
| last_name      |                                | image_url      |
| phone          |                                | category_id(FK)|
| is_active      |                                +----------------+
| role           |                                        |
+----------------+                                        |
        |                                                 |
        |                                                 |
        v                                                 v
+----------------+       +----------------+       +----------------+
|    ADDRESSES   |       |     ORDERS     |       | PRODUCT_IMAGES |
+----------------+       +----------------+       +----------------+
| PK: id         |       | PK: id         |       | PK: id         |
| user_id (FK)   |<----->| user_id (FK)   |       | product_id (FK)|
| address_line1  |       | order_date     |       | image_url      |
| address_line2  |       | total_amount   |       | is_primary     |
| city           |       | status         |       +----------------+
| state          |       | shipping_addr_id|
| postal_code    |       | billing_addr_id |
| country        |       +----------------+
| is_default     |               |
| address_type   |               |
+----------------+               |
                                 v
+----------------+       +----------------+       +----------------+
|    PAYMENTS    |       | ORDER_DETAILS  |       |    REVIEWS     |
+----------------+       +----------------+       +----------------+
| PK: id         |       | PK: id         |       | PK: id         |
| order_id (FK)  |<------| order_id (FK)  |       | product_id (FK)|
| payment_date   |       | product_id (FK)|<------| user_id (FK)   |
| payment_method |       | quantity       |       | rating         |
| amount         |       | price          |       | comment        |
| status         |       | subtotal       |       | review_date    |
+----------------+       +----------------+       +----------------+

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 TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
usernameVARCHAR(50)Kullanıcı adı, benzersiz
emailVARCHAR(100)E-posta adresi, benzersiz
passwordVARCHAR(255)Şifrelenmiş parola
first_nameVARCHAR(50)Kullanıcının adı
last_nameVARCHAR(50)Kullanıcının soyadı
phoneVARCHAR(20)Telefon numarası
is_activeBOOLEANHesabın aktif olup olmadığı
roleVARCHAR(20)Kullanıcı rolü (ADMIN, USER, vb.)
created_atTIMESTAMPHesabın oluşturulma tarihi
updated_atTIMESTAMPHesabı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 TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
nameVARCHAR(100)Kategori adı
descriptionTEXTKategori açıklaması
parent_idBIGINTÜst kategori ID’si (NULL ise ana kategoridir)
created_atTIMESTAMPKategorinin oluşturulma tarihi
updated_atTIMESTAMPKategorinin son güncellenme tarihi

3. PRODUCTS Tablosu

Bu tablo, sistemdeki ürünleri temsil eder.

Alan AdıVeri TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
nameVARCHAR(255)Ürün adı
descriptionTEXTÜrün açıklaması
priceDECIMAL(10,2)Ürün fiyatı
stock_quantityINTStok miktarı
image_urlVARCHAR(255)Ana ürün görselinin URL’si
category_idBIGINTKategori ID’si (Yabancı anahtar)
created_atTIMESTAMPÜrünün oluşturulma tarihi
updated_atTIMESTAMPÜ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 TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
product_idBIGINTÜrün ID’si (Yabancı anahtar)
image_urlVARCHAR(255)Görsel URL’si
is_primaryBOOLEANAna görsel olup olmadığı
created_atTIMESTAMPGö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 TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
user_idBIGINTKullanıcı ID’si (Yabancı anahtar)
address_line1VARCHAR(255)Adres satırı 1
address_line2VARCHAR(255)Adres satırı 2 (opsiyonel)
cityVARCHAR(100)Şehir
stateVARCHAR(100)Eyalet/İl
postal_codeVARCHAR(20)Posta kodu
countryVARCHAR(100)Ülke
is_defaultBOOLEANVarsayılan adres olup olmadığı
address_typeVARCHAR(20)Adres tipi (SHIPPING, BILLING)
created_atTIMESTAMPAdresin oluşturulma tarihi
updated_atTIMESTAMPAdresin son güncellenme tarihi

6. ORDERS Tablosu

Bu tablo, kullanıcılar tarafından verilen siparişleri temsil eder.

Alan AdıVeri TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
user_idBIGINTKullanıcı ID’si (Yabancı anahtar)
order_dateTIMESTAMPSipariş tarihi
total_amountDECIMAL(10,2)Toplam sipariş tutarı
statusVARCHAR(20)Sipariş durumu (PENDING, SHIPPED, DELIVERED)
shipping_addr_idBIGINTTeslimat adresi ID’si (Yabancı anahtar)
billing_addr_idBIGINTFatura adresi ID’si (Yabancı anahtar)
created_atTIMESTAMPSiparişin oluşturulma tarihi
updated_atTIMESTAMPSiparişin son güncellenme tarihi

7. ORDER_DETAILS Tablosu

Bu tablo, siparişlerdeki ürünleri ve miktarlarını temsil eder.

Alan AdıVeri TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
order_idBIGINTSipariş ID’si (Yabancı anahtar)
product_idBIGINTÜrün ID’si (Yabancı anahtar)
quantityINTÜrün miktarı
priceDECIMAL(10,2)Birim fiyat (sipariş anındaki)
subtotalDECIMAL(10,2)Alt toplam (miktar * birim fiyat)
created_atTIMESTAMPKaydın oluşturulma tarihi

8. PAYMENTS Tablosu

Bu tablo, siparişlere ait ödeme bilgilerini temsil eder.

Alan AdıVeri TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
order_idBIGINTSipariş ID’si (Yabancı anahtar)
payment_dateTIMESTAMPÖdeme tarihi
payment_methodVARCHAR(50)Ödeme yöntemi (CREDIT_CARD, PAYPAL, vb.)
amountDECIMAL(10,2)Ödeme tutarı
statusVARCHAR(20)Ödeme durumu (PENDING, COMPLETED, FAILED)
created_atTIMESTAMPKaydın oluşturulma tarihi
updated_atTIMESTAMPKaydı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 TipiAçıklama
idBIGINTBirincil anahtar, otomatik artan
product_idBIGINTÜrün ID’si (Yabancı anahtar)
user_idBIGINTKullanıcı ID’si (Yabancı anahtar)
ratingINTDeğerlendirme puanı (1-5)
commentTEXTYorum metni
review_dateTIMESTAMPDeğerlendirme tarihi
created_atTIMESTAMPKaydın oluşturulma tarihi
updated_atTIMESTAMPKaydı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)

  1. CATEGORIES Tablosu:

    • parent_id -> CATEGORIES.id (Kendi kendine referans - self-reference)
  2. PRODUCTS Tablosu:

    • category_id -> CATEGORIES.id
  3. PRODUCT_IMAGES Tablosu:

    • product_id -> PRODUCTS.id
  4. ADDRESSES Tablosu:

    • user_id -> USERS.id
  5. ORDERS Tablosu:

    • user_id -> USERS.id
    • shipping_addr_id -> ADDRESSES.id
    • billing_addr_id -> ADDRESSES.id
  6. ORDER_DETAILS Tablosu:

    • order_id -> ORDERS.id
    • product_id -> PRODUCTS.id
  7. PAYMENTS Tablosu:

    • order_id -> ORDERS.id
  8. REVIEWS Tablosu:

    • product_id -> PRODUCTS.id
    • user_id -> USERS.id

Benzersizlik Kısıtlamaları (Unique Constraints)

  1. USERS Tablosu:

    • username alanı benzersiz olmalıdır.
    • email alanı benzersiz olmalıdır.
  2. CATEGORIES Tablosu:

    • name alanı, aynı parent_id değerine sahip kategoriler arasında benzersiz olmalıdır.

Diğer Kısıtlamalar

  1. PRODUCTS Tablosu:

    • price alanı sıfırdan büyük olmalıdır.
    • stock_quantity alanı sıfır veya daha büyük olmalıdır.
  2. REVIEWS Tablosu:

    • rating alanı 1 ile 5 arasında olmalıdır.
  3. ORDERS Tablosu:

    • status alanı yalnızca belirli değerleri alabilir (PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED).
  4. PAYMENTS Tablosu:

    • status alanı 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:

  1. USERS Tablosu:

    • username ve email alanları için benzersiz indeksler.
  2. PRODUCTS Tablosu:

    • category_id alanı için indeks.
    • name alanı için indeks (arama işlemleri için).
  3. ORDERS Tablosu:

    • user_id alanı için indeks.
    • status alanı için indeks (filtreleme işlemleri için).
  4. ORDER_DETAILS Tablosu:

    • order_id ve product_id alanları için indeksler.
  5. REVIEWS Tablosu:

    • product_id alanı için indeks.

Normalizasyon

Veritabanı şeması, aşağıdaki normalizasyon kurallarına uygun olarak tasarlanmıştır:

  1. Birinci Normal Form (1NF): Tüm tablolardaki alanlar atomiktir (bölünemez).

  2. İkinci Normal Form (2NF): Tüm tablolar 1NF’dedir ve tüm alanlar birincil anahtara tam bağımlıdır.

  3. Üçüncü Normal Form (3NF): Tüm tablolar 2NF’dedir ve birincil anahtar olmayan alanlar, birincil anahtara geçişsiz olarak bağımlıdır.

Bu normalizasyon kuralları, veri tekrarını en aza indirir ve veri bütünlüğünü sağlar.

Sonuç

Bu bölümde, e-ticaret web uygulaması için veritabanı şema tasarımını detaylı olarak ele aldık. Tablolar, alanlar, ilişkiler ve kısıtlamalar, uygulamanın gereksinimlerini karşılayacak şekilde tasarlanmıştır. Bir sonraki bölümde, MySQL kurulumu ve yapılandırması konusunu ele alacağız.