📐 التبعيات الوظيفية والتسوية (Normalization)

تحسين تصميم قواعد البيانات من خلال الأشكال الطبيعية

📚 الفصل ٩
🎯 CS 340
👩‍🎓 شوق العمران
⏱️ دليل شامل

📑 فهرس المحتويات

📋

إرشادات التصميم غير الرسمية

🎯 أهداف تصميم قاعدة البيانات
  1. الحفاظ على المعلومات: الاحتفاظ بكل المفاهيم بما في ذلك الخصائص والكيانات والعلاقات والتخصصات من التصميم المفاهيمي.
  2. الحد الأدنى من التكرار: تقليل التخزين المتكرر وتقليل الحاجة إلى تحديثات متعددة.

سؤال: هل التكرار دائمًا سيئ؟ أحيانًا يكون التكرار مقبولاً لأسباب تتعلق بالأداء!

أربع إرشادات رئيسية

📌 الإرشاد ١: دلالات واضحة

يجب أن تكون دلالات خصائص العلاقة واضحة

  • كل صف (tuple) يجب أن يمثل كيانًا واحدًا أو علاقة واحدة.
  • لا تخلط خصائص من كيانات مختلفة (موظف، قسم، مشروع).
  • استخدم المفاتيح الخارجية للإشارة إلى كيانات أخرى.
  • افصل خصائص الكيان عن خصائص العلاقة.
  • الخلاصة: صمم مخططات يسهل شرحها.
📌 الإرشاد ٢: تجنب الشذوذ

صمم مخططات لا تعاني من شذوذ الإدراج والحذف والتحديث

إذا كان الشذوذ موجودًا، قم بتوثيقه حتى تتمكن التطبيقات من التعامل معه بشكل صحيح.

📌 الإرشاد ٣: تقليل قيم NULL

صمم العلاقات بأقل عدد ممكن من قيم NULL

  • الخصائص التي تحتوي على NULL بشكل متكرر يجب وضعها في علاقات منفصلة.
  • NULL تستهلك مساحة تخزين.
  • NULL لها تفسيرات متعددة (غير منطبق، غير معروف، غير متاح).
  • يمكن أن تسبب مشاكل في JOIN وفهم معنى الخاصية.
📌 الإرشاد ٤: تجنب الصفوف الزائفة

صمم علاقات يمكن ربطها دون توليد صفوف زائفة (خاطئة)

  • اربط على الخصائص التي هي مفاتيح أساسية وخارجية.
  • التصاميم السيئة يمكن أن تولد نتائج خاطئة في JOIN.
  • استخدم دائمًا وصلات غير فقدانية (lossless joins).
💾

التكرار وشذوذ التحديث

⚠️ مشاكل المعلومات المتكررة
  • تهدر مساحة التخزين.
  • تسبب شذوذ التحديث:
    • شذوذ الإدراج (Insertion anomalies).
    • شذوذ الحذف (Deletion anomalies).
    • شذوذ التعديل (Modification anomalies).

الأنواع الثلاثة للشذوذ

🔴 شذوذ التحديث (التعديل)

مثال: لنأخذ EMP_PROJ(رقم_الموظف#, رقم_المشروع#, اسم_الموظف, اسم_المشروع, عدد_الساعات)

المشكلة: تغيير اسم المشروع P1 من "الفوترة" إلى "محاسبة العملاء" يتطلب تحديث جميع الموظفين الـ ١٠٠ العاملين في ذلك المشروع!

التأثير: عدم تناسق البيانات إذا فاتنا بعض التحديثات.

🟠 شذوذ الإدراج

مثال: EMP_PROJ(رقم_الموظف#, رقم_المشروع#, اسم_الموظف, اسم_المشروع, عدد_الساعات)

المشاكل:

  • لا يمكن إدراج مشروع ما لم يتم تعيين موظف له.
  • لا يمكن إدراج موظف ما لم يتم تعيينه في مشروع.

التأثير: فقدان معلومات عن المشاريع/الموظفين.

🟡 شذوذ الحذف

مثال: EMP_PROJ(رقم_الموظف#, رقم_المشروع#, اسم_الموظف, اسم_المشروع, عدد_الساعات)

المشاكل:

  • حذف مشروع يؤدي إلى حذف جميع الموظفين العاملين عليه.
  • حذف الموظف الوحيد في مشروع يؤدي إلى حذف المشروع.

التأثير: فقدان غير مقصود لمعلومات مهمة.

🔗

التبعيات الوظيفية (FDs)

📘 ما هي التبعيات الوظيفية؟

أداة رسمية لتحليل المخططات العلائقية تمكن من اكتشاف ووصف مشاكل التصميم بشكل دقيق.

تعريف: مجموعة من الخصائص X تحدد وظيفيًا مجموعة من الخصائص Y إذا كانت قيمة X تحدد قيمة فريدة لـ Y.

🔑 تعريف رسمي

تتحقق X → Y إذا: كلما كان لصفين نفس القيمة لـ X، يجب أن يكون لهما نفس القيمة لـ Y.

لأي صفين t₁ و t₂: إذا كان t₁[X] = t₂[X]، فإن t₁[Y] = t₂[Y].

X Y

نقاط رئيسية:

  • التبعيات الوظيفية هي خاصية لـ مخطط العلاقة، وليس للحالات الفردية.
  • التبعيات الوظيفية تُستمد من قيود العالم الحقيقي.
  • تستخدم لتحديد الأشكال الطبيعية.

أمثلة على التبعيات الوظيفية

💡 أمثلة شائعة
SSN ENAME

الرقم الضريبي يحدد اسم الموظف.

PNUMBER {PNAME, PLOCATION}

رقم المشروع يحدد اسم المشروع وموقعه.

{SSN, PNUMBER} HOURS

الرقم الضريبي ورقم المشروع معًا يحددان عدد ساعات العمل.

أنواع التبعيات الوظيفية

النوع الوصف مثال تبعية كاملة إزالة أي خاصية من الجانب الأيسر يبطل التبعية. {SSN, PNUMBER} → HOURS تبعية جزئية مجموعة فرعية من الجانب الأيسر يمكنها تحديد الجانب الأيمن. SSN → ENAME (عندما يكون المفتاح {SSN, PNUMBER}) تبعية متعدية X → Y و Y → Z، إذن X → Z. SSN → DNUMBER → DMGR_SSN

تحديد التبعيات من الحالات

⚠️ قواعد مهمة
  • من حالة علاقة، يمكننا فقط استنتاج أن التبعية قد تكون موجودة.
  • يمكننا الجزم بأن تبعيات معينة غير موجودة عندما تخالفها الصفوف.
  • فهم معنى الخصائص والعلاقات أمر ضروري.
  • إذا كانت X → Y في R، فهذا لا يعني أن Y → X في R.
🔑 خاصية المفتاح

إذا كان X مفتاحًا مرشحًا لـ R، فإن X → R

هذا يعني أن المفتاح المرشح يحدد وظيفيًا جميع الخصائص في العلاقة.

🔑

المفاتيح وتصنيفات الخصائص

📘 المفتاح الفائق (Superkey)

المفتاح الفائق هو مجموعة خصائص S ⊆ R حيث لا يوجد صفان لهما نفس القيم لـ S.

مثال: {ID}, {ID, الاسم_الأول, الاسم_الأخير}, {ID, تاريخ_الطلب}

🔑 المفتاح (المفتاح المرشح)

المفتاح هو مفتاح فائق أصغر - إزالة أي خاصية يجعله غير مفتاح فائق.

مثال: {ID} أو {الاسم_الأول, الاسم_الأخير} (إذا كانا فريدين).

🎯 مصطلحات المفاتيح
  • المفتاح المرشح: أي مفتاح صالح للعلاقة.
  • المفتاح الأساسي: مفتاح مرشح واحد يتم اختياره كمعرف رئيسي.
  • المفاتيح الثانوية: مفاتيح مرشحة أخرى لم تُختر كمفاتيح أساسية.
  • خاصية رئيسية (Prime): خاصية تنتمي إلى واحد على الأقل من المفاتيح المرشحة.
  • خاصية غير رئيسية (Non-prime): خاصية لا تنتمي إلى أي مفتاح مرشح.
1️⃣

الشكل الطبيعي الأول (1NF)

📘 تعريف 1NF

تكون العلاقة في الشكل الطبيعي الأول إذا كانت لا تسمح بـ:

  • الخصائص المركبة (خصائص لها أجزاء فرعية).
  • الخصائص متعددة القيم (خصائص لها قيم متعددة).
  • العلاقات المتداخلة (علاقات داخل علاقات).
  • المجموعات المكررة.
✅ متطلبات 1NF

يجب أن تحتوي كل خاصية على قيم ذرية (غير قابلة للتجزئة) فقط

  • تعتبر جزءًا من تعريف العلاقة.
  • معظم أنظمة إدارة قواعد البيانات العلائقية تسمح فقط بعلاقات 1NF.
  • يجب أن تكون جميع القيم من نفس المجال.

التطبيع إلى 1NF

💡 الطريقة ١: علاقة منفصلة

للخصائص متعددة القيم:

  1. أزل الخصائص التي تخالف 1NF.
  2. ضعها في علاقة منفصلة مع المفتاح الأساسي.
  3. المفتاح الأساسي للعلاقة الجديدة = دمج المفتاح الأساسي الأصلي + الخاصية متعددة القيم.
💡 الطريقة ٢: توسيع المفتاح (مع تكرار)

طريقة بديلة:

  1. وسع المفتاح ليشمل الخاصية متعددة القيم.
  2. أنشئ صفًا منفصلاً لكل قيمة.
  3. تحذير: يسبب تكرارًا!
💡 العلاقات المتداخلة

لتطبيع العلاقات المتداخلة:

  1. أزل خصائص العلاقة المتداخلة.
  2. أنشئ علاقة جديدة بالمفتاح الأساسي الأصلي + المفتاح المرشح للعلاقة المتداخلة.
2️⃣

الشكل الطبيعي الثاني (2NF)

📘 تعريف 2NF

مخطط العلاقة R يكون في الشكل الطبيعي الثاني (2NF) إذا:

  1. كان في 1NF، و
  2. كل خاصية غير رئيسية تعتمد اعتمادًا كليًا وظيفيًا على المفتاح الأساسي.
🔑 مفهوم رئيسي: الاعتماد الوظيفي الكامل

اعتماد كامل: إزالة أي خاصية من الجانب الأيسر يبطل التبعية.

✅ {SSN, PNUMBER} → HOURS

اعتماد كامل - لا SSN → HOURS ولا PNUMBER → HOURS يتحققان.

❌ {SSN, PNUMBER} → ENAME

اعتماد جزئي - SSN → ENAME يتحقق.

⚠️ انتهاك 2NF

تنتهك العلاقة 2NF عندما:

  • تعتمد خاصية غير رئيسية على جزء فقط من المفتاح الأساسي المركب.
  • يسمى هذا اعتمادًا جزئيًا.

التطبيع إلى 2NF

💡 عملية تطبيع 2NF

الخطوات:

  1. حدد جميع الاعتمادات الجزئية.
  2. لكل اعتماد جزئي X → Y:
    • أنشئ علاقة جديدة تحتوي على X و Y.
    • أزل Y من العلاقة الأصلية.
    • أبقِ X في العلاقة الأصلية كمفتاح خارجي.
📋 تعريف عام (مفاتيح متعددة)

تكون العلاقة في 2NF إذا كانت كل خاصية غير رئيسية غير معتمدة جزئيًا على أي مفتاح من مفاتيح R.

هذا يأخذ في الاعتبار العلاقات ذات المفاتيح المرشحة المتعددة.

3️⃣

الشكل الطبيعي الثالث (3NF)

📘 تعريف 3NF (بسيط)

مخطط العلاقة R يكون في الشكل الطبيعي الثالث (3NF) إذا:

  1. كان في 2NF، و
  2. لا توجد خاصية غير رئيسية تعتمد اعتمادًا متعديًا على المفتاح الأساسي.
🔑 الاعتماد المتعدي (Transitive Dependency)

اعتماد متعدي: يمكن اشتقاق X → Z من X → Y و Y → Z.

SSN → DNUMBER → DMGR_SSN

إذن: SSN → DMGR_SSN هو اعتماد متعدي.

✅ SSN → ENAME

غير متعدٍ - لا توجد خاصية وسيطة.

⚠️ ملاحظة مهمة

في X → Y → Z حيث X هو المفتاح الأساسي:

  • تكون مشكلة فقط إذا كان Y ليس مفتاحًا مرشحًا.
  • إذا كان Y هو مفتاح مرشح، فلا توجد مشكلة.

تعريف 3NF العام (مفاتيح متعددة)

🎯 تعريف 3NF الرسمي

تكون العلاقة R في 3NF إذا، كلما تحقق X → A، فإن إما:

  1. X هو مفتاح فائق لـ R، أو
  2. A هي خاصية رئيسية في R.
📋 تعريف بديل لـ 3NF

تكون العلاقة في 3NF إذا كانت كل خاصية غير رئيسية:

  1. تعتمد اعتمادًا كليًا وظيفيًا على كل مفتاح، و
  2. تعتمد اعتمادًا غير متعدٍ على كل مفتاح.

ملاحظة: هذا التعريف يظهر أن 3NF تتضمن 2NF.

قاعدة ذهنية للحفظ

💡 تذكر الأشكال الطبيعية
  • 1NF: كل الخصائص تعتمد على المفتاح.
  • 2NF: كل الخصائص تعتمد على المفتاح كاملاً.
  • 3NF: كل الخصائص تعتمد على المفتاح فقط (لا شيء غيره).

صيغة بويز-كود العادية (BCNF)

📘 ما هي BCNF؟

BCNF هي صيغة أقوى من 3NF تتعامل مع العلاقات ذات المفاتيح المرشحة المتداخلة.

عندما تحتوي العلاقة على أكثر من مفتاح مرشح، قد تظهر شذوذ حتى في 3NF.

🔑 تعريف BCNF

تكون العلاقة R في صيغة بويز-كود العادية (BCNF) إذا:

كلما تحقق X → A في R، فإن X هو مفتاح فائق لـ R.

بعبارة أخرى:

كل محدد (الجانب الأيسر) يجب أن يكون مفتاحًا مرشحًا.

📊 تسلسل الأشكال الطبيعية

كل شكل طبيعي هو أقوى من الذي قبله:

  • كل علاقة في 2NF تكون في 1NF.
  • كل علاقة في 3NF تكون في 2NF.
  • كل علاقة في BCNF تكون في 3NF.

نقطة مهمة: يمكن أن تكون العلاقات في 3NF ولكن ليست في BCNF!

3NF مقابل BCNF

⚠️ متى 3NF ≠ BCNF

تذكر تعريف 3NF العام: X → A مقبولة إذا:

  1. X مفتاح فائق، أو
  2. A خاصية رئيسية.

BCNF تسمح فقط بالشرط (أ)

BCNF تزيل الشرط (ب)، مما يجعلها أكثر صرامة من 3NF.

تطبيق BCNF (التحلل)

💡 خوارزمية تطبيع BCNF

لتحليل R إلى BCNF:

  1. لنفترض أن X → A هي التبعية التي تخالف BCNF.
  2. حلل R إلى:
    • R₁ = R - A
    • R₂ = XA
  3. إذا كان أي من R₁ أو R₂ ليس في BCNF، كرر العملية.
⚠️ مفاضلة مع BCNF

مهم: تحلل BCNF قد لا يحافظ على جميع التبعيات الوظيفية!

  • يجب ضمان خاصية الوصل غير الفقداني (lossless join).
  • بعض التبعيات قد تُفقد في التحلل.
  • هذا مقبول أحيانًا لتحقيق BCNF.

اختبار الوصل غير الفقداني

📋 خاصية الوصل غير الفقداني

تحلل D = {R₁, R₂} له خاصية الوصل غير الفقداني إذا كان:

  1. (R₁ ∩ R₂) → (R₁ - R₂) في F⁺، أو
  2. (R₁ ∩ R₂) → (R₂ - R₁) في F⁺.

ترجمة: الخصائص المشتركة يجب أن تحدد وظيفيًا الخصائص الفريدة لإحدى العلاقات.

🎓

بديهيات أرمسترونغ

📘 قواعد استنتاج للتبعيات الوظيفية

بديهيات أرمسترونغ هي قواعد استنتاج مُثبتة وكاملة لاشتقاق التبعيات الوظيفية.

🔑 البديهيات الثلاث

١. الانعكاسية: إذا كان Y ⊆ X، فإن X → Y

مثال: AB → B

٢. التكبير: إذا كان X → Y، فإن XZ → YZ

مثال: إذا A → B، فإن AC → BC

٣. العبور: إذا كان X → Y و Y → Z، فإن X → Z

مثال: إذا A → B و B → C، فإن A → C

قواعد مشتقة

📐 قواعد استنتاج إضافية

الاتحاد: إذا كان X → Y و X → Z، فإن X → YZ

التحلل: إذا كان X → YZ، فإن X → Y و X → Z

يمكن إثبات هذه باستخدام بديهيات أرمسترونغ.

💡 مثال إثبات: قاعدة الاتحاد

أثبت: إذا كان X → Y و X → Z، فإن X → YZ

  1. المعطى: X → Y، X → Z
  2. X → Y يعني XX → XY (تكبير)
  3. كبر X → Z بإضافة Y: XY → ZY
  4. X → XY → ZY يعني X → ZY (عبور)
🔄

خوارزمية الإغلاق

📘 ما هو الإغلاق؟

إغلاق X (يرمز له X⁺): مجموعة كل الخصائص المحددة وظيفيًا بواسطة X بناءً على F.

خاصية رئيسية: المفتاح يحتوي على مجموعة كاملة من الخصائص في إغلاقه.

🔧 خوارزمية الإغلاق

المدخلات: مجموعة تبعيات F، ومجموعة خصائص X

المخرجات: X⁺ (إغلاق X)

X⁺ := X
كرر
  old_X⁺ := X⁺
  لكل تبعية Y → Z في F افعل
    إذا كان X⁺ ⊇ Y فإن
      X⁺ := X⁺ ∪ Z
حتى (X⁺ = old_X⁺)

إيجاد المفاتيح باستخدام الإغلاق

💡 مثال كامل

العلاقة: المورد_قطعة (اسم_المورد، المدينة، الحالة، رقم_القطعة#, اسم_القطعة, الكمية)

التبعيات الوظيفية:

  • fd1: اسم_المورد → المدينة
  • fd2: المدينة → الحالة
  • fd3: رقم_القطعة → اسم_القطعة
  • fd4: {اسم_المورد, رقم_القطعة} → الكمية

أثبت أن {اسم_المورد, رقم_القطعة} هو مفتاح:

الخطوة ١: أظهر أنه مفتاح فائق

  1. {اسم_المورد, رقم_القطعة} → {اسم_المورد, رقم_القطعة} (بديهي)
  2. اسم_المورد → المدينة (fd1)
  3. اسم_المورد → الحالة (عبور عبر fd2)
  4. {اسم_المورد, رقم_القطعة} → الكمية (fd4)
  5. رقم_القطعة → اسم_القطعة (fd3)
  6. إذن: {اسم_المورد, رقم_القطعة}⁺ = {اسم_المورد, رقم_القطعة, المدينة, الحالة, الكمية, اسم_القطعة} ✓

الخطوة ٢: أظهر أنه أصغر (minimal)

  • رقم_القطعة لا يحدده شيء → اسم_المورد وحده ليس مفتاحًا.
  • اسم_المورد ليس في الجانب الأيمن لأي تبعية مع رقم_القطعة وحده → رقم_القطعة وحده ليس مفتاحًا.
  • إذن {اسم_المورد, رقم_القطعة} هو أصغر مفتاح ✓

النتيجة: {اسم_المورد, رقم_القطعة} هو مفتاح!

📊

ملخص الأشكال الطبيعية

الشكل الطبيعي المتطلبات يزيل 1NF لا توجد خصائص مركبة أو متعددة القيم. المجموعات المكررة، العلاقات المتداخلة. 2NF 1NF + لا توجد تبعيات جزئية. الاعتماد الجزئي على المفاتيح المرشحة. 3NF 2NF + لا توجد تبعيات متعدية. الاعتماد المتعدي عبر خصائص غير رئيسية. BCNF كل محدد (الجانب الأيسر) هو مفتاح مرشح. كل التبعيات حيث المحدد ليس مفتاحًا فائقًا.
🎯 إرشادات عملية
  • طبق التسوية إلى على الأقل 3NF عمليًا.
  • BCNF مثالي ولكن قد يضحي بالحفاظ على التبعيات.
  • 4NF و 5NF نادرًا ما تستخدم عمليًا.
  • إلغاء التسوية (Denormalization): مقبول أحيانًا لأداء أفضل (ولكن وثّق ذلك!)
✨ النقاط الرئيسية
  • التسوية تزيل التكرار والشذوذ.
  • كل شكل طبيعي يبني على الذي قبله.
  • الأشكال الطبيعية الأعلى تعني تكامل بيانات أفضل.
  • هناك مفاضلة بين التسوية والأداء.
  • فهم التبعيات الوظيفية أساسي لتصميم قاعدة بيانات جيد.