انتقل إلى محتوى الدرس
الدرس 40
دورة MySQL

تصميم مخطط قاعدة بيانات علائقية متكامل والأعمدة المولدة في MySQLMySQL Complete Relational Schema Design and Generated Columns

تعلّم تصميم مخطط قاعدة بيانات علائقية متكامل والأعمدة المولدة في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بتوظيف كل ما تعلمناه حول أنواع البيانات والقيود والعلاقات العلائقية وقواعد التطبيع 3NF، نصمم الآن مخطط قاعدة بيانات متجر إلكتروني متكامل يتكون من 4 طبقات مترابطة بمحرك InnoDB:

  • جدولا customers وcategories (كيانات أب مستقلة): لتخزين حسابات العملاء وأقسام المتجر دون اعتماد على جداول أخرى.
  • جدول products (تابع 1:N للأقسام): يربط كل منتج بقسمه مع فرض قيد CHECK (price >= 0).
  • جدولا orders وorder_items: لتمثيل فواتير الشراء وعناصر كل فاتورة.
مخطط يوضح ترتيب إنشاء جداول المخطط العلائقي والطوابع الزمنية التلقائية والفرق بين الأعمدة المولدة VIRTUAL و STORED في MySQL 8
SQL
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، نحذف جداول الأبناء والوسيط أولاً قبل حذف جداول الآباء.
SQL
-- 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 بتحديث طابعه الزمني تلقائياً كلما تغيرت قيمة أي عمود في الصف.
SQL
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؛ بل يتولى المحرك حسابها وتحديثها تلقائياً كلما تغيرت الأعمدة الداخلة في معادلتها.
SQL
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 وتُكتب فعلياً على القرص؛ ويُستخدم عند الحاجة لتضمين العمود في مفتاح أساسي أو فهرس نص كامل.
SQL
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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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 لعدم استهلاكها مساحة تخزين.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ استعلامات SQL المشروحة في قسم هندسة مخطط متجر متكامل داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم ترتيب إنشاء الجداول بالاعتمادية وقارن مخرجات الاستعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

عند تشغيل ملف SQL ينشئ جدول العملاء customers (الأب) وجدول الطلبات orders (الابن المرتبط بمفتاح أجنبي)، أي جدول يجب إنشاؤه أولاً؟

يجب إنشاء جدول الأب customers أولاً حتى يتمكن محرك InnoDB من التحقق من المفتاح المرجعي عند إنشاء جدول الابن.

02

أي تعريف عمود مما يلي يسجل الوقت الحالي تلقائياً عند الإدراج ويحدثه تلقائياً عند تعديل الصف؟

تضمن صيغة DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP التسجيل التلقائي والتحديث التلقائي معاً.

03

ما هي الصيغة الصحيحة لتعريف عمود مولد يحسب حاصل ضرب الكمية qty في السعر unit_price تلقائياً في MySQL 8؟

تُكتب الصيغة القياسية GENERATED ALWAYS AS (qty * unit_price) VIRTUAL.

04

ما هو الفرق الجوهري بين العمود المولد الافتراضي VIRTUAL والعمود المولد المخزن STORED في MySQL 8؟

العمود VIRTUAL لا يستهلك مساحة تخزين على القرص ويُحسب عند القراءة، بينما STORED يُحسب عند الكتابة ويُحفظ فعلياً على القرص.

05

عند عدم كتابة كلمة VIRTUAL أو STORED في تعريف العمود المولد في MySQL 8، فإن الوضع الافتراضي المعتمد تلقائياً هو VIRTUAL.

صواب؛ يعتمد محرك MySQL الوضع VIRTUAL افتراضياً للأعمدة المولدة.

06

لا يُسمح داخل معادلة العمود المولد GENERATED ALWAYS AS باستدعاء دوال غير حتمية مثل NOW() أو RAND().

صواب؛ يجب أن تكون معادلة العمود المولد حتمية تماماً وتعطي نفس النتيجة لنفس المدخلات دائماً.

07

عند حذف الجداول المرتبطة بمفاتيح أجنبية فعالة بأمر DROP TABLE IF EXISTS، ما هو الترتيب الصحيح للحذف؟

يجب حذف الجداول الوسيطة وجداول الأبناء أولاً قبل حذف جداول الآباء التي تشير إليها.

08

أي ممارستين مما يلي تعدان أساسيتين في قائمة فحص جودة مخطط MySQL 8 الإنتاجي؟ (اختر إجابتين)

التصريح بمحرك InnoDB وترميز utf8mb4 وفرض قيود التكامل المرجعي والتحقق في تعريف الجدول من أهم أسس الجودة.