بناء قاعدة بيانات لمتجر إلكتروني هو تمرين ممتاز لفهم علاقات البيانات. لضمان نظام متماسك وقابل للتوسع، سنستخدم نموذج العلاقات (Relational Schema) الذي يعتمد على الجداول المرتبطة ببعضها.
المكونات الأساسية لقاعدة بيانات المتجر (Entities)
لبناء متجر بسيط، نحتاج إلى 5 جداول رئيسية على الأقل:
1. جدول المستخدمين (Users)
يحتوي على بيانات العملاء الأساسية.
• user_id (مفتاح أساسي - PK)
• full_name, email, password_hash, address
2. جدول المنتجات (Products)
يحتوي على تفاصيل السلع.
• product_id (PK)
• name, description, price, stock_quantity
• category_id (مفتاح أجنبي - FK)
3. جدول الطلبات (Orders)
يسجل عملية الشراء (بدون تفاصيل المنتجات داخلها).
• order_id (PK)
• user_id (FK) - لربط الطلب بصاحبه.
• order_date, total_amount, status (قيد التنفيذ، تم الشحن، إلخ).
4. جدول تفاصيل الطلب (Order_Items)
هذا الجدول هو "الجسر" (Bridge) لأن الطلب الواحد قد يحتوي على عدة منتجات.
• order_item_id (PK)
• order_id (FK)
• product_id (FK)
• quantity, unit_price
5. جدول التصنيفات (Categories)
• category_id (PK)
• category_name
مخطط العلاقات (ER Diagram)
يوضح هذا المخطط كيف ترتبط الجداول ببعضها (علاقة رأس بأطراف One-to-Many):
قواعد ذهبية لتصميم متماسك:
1. الذرية (Atomicity): لا تضع أكثر من معلومة في حقل واحد (مثلاً: لا تضع رقم الهاتف والعنوان في حقل "بيانات التواصل"، افصلهما).
2. تجنب التكرار (Normalization): بدلاً من كتابة اسم العميل في كل طلب، نكتفي بوضع رقم العميل user_id فقط.
3. تجميد السعر (Price Snapshots): لاحظ أننا وضعنا unit_price في جدول "تفاصيل الطلب". لماذا؟ لأن سعر المنتج قد يتغير مستقبلاً في جدول المنتجات، لكننا نريد الاحتفاظ بالسعر الذي اشترى به العميل فعلياً وقت الطلب.
4. الفهارس (Indexing): تأكد من عمل Index لحقل email في جدول المستخدمين، و order_date في جدول الطلبات لتسريع عمليات البحث.
مثال لـ استعلام (SQL) لإنشاء جدول الطلبات:

-- 1. إنشاء جدول التصنيفات
CREATE TABLE Categories (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(100) NOT NULL
);

-- 2. إنشاء جدول المستخدمين
CREATE TABLE Users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(150) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
address TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 3. إنشاء جدول المنتجات
CREATE TABLE Products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
stock_quantity INT DEFAULT 0,
category_id INT,
FOREIGN KEY (category_id) REFERENCES Categories(category_id) ON DELETE SET NULL
);

-- 4. إنشاء جدول الطلبات
CREATE TABLE Orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10, 2) NOT NULL,
status ENUM('Pending', 'Shipped', 'Delivered', 'Cancelled') DEFAULT 'Pending',
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE
);

-- 5. إنشاء جدول تفاصيل الطلب (المنتجات داخل كل طلب)
CREATE TABLE Order_Items (
order_item_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT NOT NULL,
unit_price DECIMAL(10, 2) NOT NULL, -- السعر وقت الشراء
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id)
);