في هذا الدرس 6تصفّح المواضيع
بتوظيف كل ما تعلمناه حول أنواع البيانات والقيود والعلاقات العلائقية وقواعد التطبيع 3NF، نصمم الآن مخطط قاعدة بيانات متجر إلكتروني متكامل يتكون من 4 طبقات مترابطة بمحرك InnoDB:
- جدولا
customersوcategories(كيانات أب مستقلة): لتخزين حسابات العملاء وأقسام المتجر دون اعتماد على جداول أخرى. - جدول
products(تابع 1:N للأقسام): يربط كل منتج بقسمه مع فرض قيدCHECK (price >= 0). - جدولا
ordersوorder_items: لتمثيل فواتير الشراء وعناصر كل فاتورة.
CREATE TABLE store_categories (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(80) NOT NULL,
slug VARCHAR(90) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
نظراً لأن محرك InnoDB يتحقق فوراً من وجود الجدول الأب عند تنفيذ قيد FOREIGN KEY داخل جملة CREATE TABLE، يجب ترتيب أوامر ملف بناء المخطط (DDL Script) وفق تسلسل الاعتمادية الهندسي:
- ترتيب الإنشاء (الأب أولاً ثم الابن): نبدأ بإنشاء الجداول المستقلة (
customers،categories)، تليها الجداول التابعة (products،orders)، وأخيراً جداول الربط الوسيطة (order_items). - ترتيب الحذف (الابن أولاً ثم الأب): عند إعادة تصفير الجداول بأمر
DROP TABLE IF EXISTS، نحذف جداول الأبناء والوسيط أولاً قبل حذف جداول الآباء.
-- Drop children first, then parents
DROP TABLE IF EXISTS order_items;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS store_categories;
يُشترط في الجداول الإنتاجية الاحترافية تضمين أعمدة التدقيق الزمني لتوثيق لحظة إنشاء السجل ولحظة آخر تعديل طرأ عليه تلقائياً من داخل محرك MySQL:
- عمود الإنشاء
created_at: يُعرف بالصيغةDEFAULT CURRENT_TIMESTAMPليسجل وقت إدراج الصف تلقائياً. - عمود التحديث
updated_at: يُضاف إليه القيدON UPDATE CURRENT_TIMESTAMPليقوم خادم MySQL بتحديث طابعه الزمني تلقائياً كلما تغيرت قيمة أي عمود في الصف.
CREATE TABLE store_products (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(40) NOT NULL UNIQUE,
unit_price DECIMAL(10, 2) NOT NULL CHECK (unit_price >= 0),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
يدعم MySQL 8 ميزة هندسية قوية جداً هي الأعمدة المولدة تلقائياً (Generated Columns)، وهي أعمدة تُحسب قيمتها آلياً بواسطة معادلة تعتمد على أعمدة أخرى داخل نفس الصف:
- الصيغة القياسية:
col_name type GENERATED ALWAYS AS (expr) [VIRTUAL | STORED]. - اتساق حسابي مضمون بنسبة 100%: لا تُمرر قيم الأعمدة المولدة يدوياً في جمل
INSERTأوUPDATE؛ بل يتولى المحرك حسابها وتحديثها تلقائياً كلما تغيرت الأعمدة الداخلة في معادلتها.
CREATE TABLE store_order_items (
order_id INT UNSIGNED NOT NULL,
product_id INT UNSIGNED NOT NULL,
qty SMALLINT UNSIGNED NOT NULL DEFAULT 1,
unit_price DECIMAL(10, 2) NOT NULL,
line_total DECIMAL(12, 2)
GENERATED ALWAYS AS (qty * unit_price) VIRTUAL,
PRIMARY KEY (order_id, product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
يوفر محرك MySQL 8 وضعين لتخزين الأعمدة المولدة يجب اختيار الأنسب منهما بعناية:
- الوضع الافتراضي
VIRTUAL: لا يستهلك أي مساحة تخزين داخل الصف على القرص، بل تُحسب قيمته لحظياً في الذاكرة عند تنفيذSELECT. وتتميز أعمدةVIRTUALبإضافتها الفورية ودعمها للفهارس الثانوية في InnoDB. - الوضع المخزن
STORED: تُحسب قيمته عند تنفيذINSERTأوUPDATEوتُكتب فعلياً على القرص؛ ويُستخدم عند الحاجة لتضمين العمود في مفتاح أساسي أو فهرس نص كامل.
CREATE TABLE customer_accounts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
full_name VARCHAR(101)
GENERATED ALWAYS AS (CONCAT(fname, ' ', lname)) VIRTUAL,
email_domain VARCHAR(100)
GENERATED ALWAYS AS (SUBSTRING_INDEX(email, '@', -1)) STORED
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
يلخص الجدول المرجعي التالي المقارنة الدقيقة بين الأعمدة المولدة الافتراضية VIRTUAL والمخزنة STORED في MySQL 8:
| وجه المقارنة | العمود الافتراضي VIRTUAL | العمود المخزن STORED |
|---|---|---|
| الوضع الافتراضي | نعم (هو الافتراضي عند عدم التحديد) | يتطلب كتابة كلمة STORED صراحةً |
| استهلاك مساحة القرص | صفر بايت داخل صفوف الجدول | يستهلك مساحة فعلية على القرص لكل صف |
| توقيت حساب المعادلة | لحظياً عند القراءة بأمر SELECT | عند الكتابة والتعديل بـ INSERT / UPDATE |
| سرعة الإضافة بـ ALTER | فورية في بيانات وصف الجدول | تتطلب إعادة بناء الجدول لحفظ القيم |
| دعم الفهارس الثانوية | مدعوم في محرك InnoDB | مدعوم في محرك InnoDB |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس هندسة مخطط متجر علائقي متكامل وفق 3NF، وترتيب أوامر إنشاء وحذف الجداول حسب الاعتمادية، وإعداد أعمدة التدقيق الزمني التلقائي (created_at وupdated_at)، وبناء الأعمدة المولدة تلقائياً عبر GENERATED ALWAYS AS والفرق بين وضعي VIRTUAL وSTORED.
الخطوة التالية والدرس القادم
انتقل الآن إلى الوحدة الحادية عشرة والدرس الحادي والأربعين «الربط الداخلي INNER JOIN والاستعلام من عدة جداول في MySQL» لاحتراف ربط الجداول المترابطة واستخراج التقارير المشتركة.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Schema Design تصميم المخطط
- تعلّم تصميم مخطط قاعدة بيانات علائقية متكامل والأعمدة المولدة في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 Designing E Commerce Schema Blueprint هندسة مخطط متجر متكامل
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم هندسة مخطط متجر متكامل في MySQL 8.
- للمراجعة
- 03 Ordering DDL Table Creation ترتيب إنشاء الجداول بالاعتمادية
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم ترتيب إنشاء الجداول بالاعتمادية في MySQL 8.
- للمراجعة
- 04 Automatic Audit Timestamps أعمدة التتبع الزمني التلقائي
- المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم أعمدة التتبع الزمني التلقائي في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 DDL DDL
- Data Definition Language
- أوامر تعريف بنية البيانات (CREATE و ALTER و DROP) المستخدمة لهندسة مخططات الجداول.
- للمراجعة
- 02 ERD ERD
- Entity-Relationship Diagram
- المخطط الهيكلي الذي يربط جداول الآباء والأبناء والمفاتيح الأجنبية ودرجات العلاقة.
- للمراجعة
- 03 CPU CPU
- Central Processing Unit
- وحدة المعالجة المركزية التي تحسب معادلات الأعمدة الافتراضية VIRTUAL لحظياً عند القراءة.
- للمراجعة
- 04 I/O I/O
- Input / Output Disk Operations
- عمليات القراءة والكتابة على القرص التي توفرها الأعمدة الافتراضية VIRTUAL لعدم استهلاكها مساحة تخزين.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ استعلامات SQL المشروحة في قسم هندسة مخطط متجر متكامل داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم ترتيب إنشاء الجداول بالاعتمادية وقارن مخرجات الاستعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
عند تشغيل ملف SQL ينشئ جدول العملاء customers (الأب) وجدول الطلبات orders (الابن المرتبط بمفتاح أجنبي)، أي جدول يجب إنشاؤه أولاً؟
يجب إنشاء جدول الأب customers أولاً حتى يتمكن محرك InnoDB من التحقق من المفتاح المرجعي عند إنشاء جدول الابن.
أي تعريف عمود مما يلي يسجل الوقت الحالي تلقائياً عند الإدراج ويحدثه تلقائياً عند تعديل الصف؟
تضمن صيغة DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP التسجيل التلقائي والتحديث التلقائي معاً.
ما هي الصيغة الصحيحة لتعريف عمود مولد يحسب حاصل ضرب الكمية qty في السعر unit_price تلقائياً في MySQL 8؟
تُكتب الصيغة القياسية GENERATED ALWAYS AS (qty * unit_price) VIRTUAL.
ما هو الفرق الجوهري بين العمود المولد الافتراضي VIRTUAL والعمود المولد المخزن STORED في MySQL 8؟
العمود VIRTUAL لا يستهلك مساحة تخزين على القرص ويُحسب عند القراءة، بينما STORED يُحسب عند الكتابة ويُحفظ فعلياً على القرص.
عند عدم كتابة كلمة VIRTUAL أو STORED في تعريف العمود المولد في MySQL 8، فإن الوضع الافتراضي المعتمد تلقائياً هو VIRTUAL.
صواب؛ يعتمد محرك MySQL الوضع VIRTUAL افتراضياً للأعمدة المولدة.
لا يُسمح داخل معادلة العمود المولد GENERATED ALWAYS AS باستدعاء دوال غير حتمية مثل NOW() أو RAND().
صواب؛ يجب أن تكون معادلة العمود المولد حتمية تماماً وتعطي نفس النتيجة لنفس المدخلات دائماً.
عند حذف الجداول المرتبطة بمفاتيح أجنبية فعالة بأمر DROP TABLE IF EXISTS، ما هو الترتيب الصحيح للحذف؟
يجب حذف الجداول الوسيطة وجداول الأبناء أولاً قبل حذف جداول الآباء التي تشير إليها.
أي ممارستين مما يلي تعدان أساسيتين في قائمة فحص جودة مخطط MySQL 8 الإنتاجي؟ (اختر إجابتين)
التصريح بمحرك InnoDB وترميز utf8mb4 وفرض قيود التكامل المرجعي والتحقق في تعريف الجدول من أهم أسس الجودة.