الوحدة 10: فهم عملية التوحيد (Normalization)

تهدف هذه الوحدة إلى شرح مفهوم التوحيد (Normalization) في قواعد البيانات العلائقية، وكيفية استخدامه لتقليل التكرار، منع حالات الشذوذ، وتحسين سلامة البيانات.

الهدف من الوحدة

تهدف هذه الوحدة إلى شرح مفهوم التوحيد (Normalization) في قواعد البيانات العلائقية، وكيفية استخدامه لتقليل التكرار، منع حالات الشذوذ، وتحسين سلامة البيانات.

10.1 ما هو التوحيد (Normalization)؟

التوحيد (Normalization) هو عملية أساسية في تصميم قواعد البيانات العلائقية. تُعتبر أداة منهجية لتقليل التكرار وتحسين سلامة البيانات.

  • تعريف:

    التوحيد هو عملية تنظيم الجداول (العلاقات) في قاعدة البيانات لتقليل التكرار (Redundancy) ومنع التناقضات (Inconsistencies) وحالات الشذوذ (Anomalies) التي تحدث عند إدخال أو تحديث أو حذف البيانات.

  • الغرض من التوحيد:
    • إزالة الاعتماديات الجزئية والانتقالية: التي تسبب التكرار والمشاكل في التصميم.
    • تحسين سلامة البيانات (Data Integrity): بضمان أن البيانات دقيقة ومتسقة.
    • تسهيل الصيانة والتعديل: حيث أن التغيير في معلومة واحدة لا يتطلب تحديثها في أماكن متعددة.
    • تقليل مساحة التخزين: من خلال تجنب تكرار البيانات.
مفهوم أساسي:

يتم تحقيق التوحيد من خلال تحويل الجداول إلى أشكال طبيعية (Normal Forms) مختلفة، كل شكل منها يتبع مجموعة محددة من القواعد بناءً على الاعتماديات الوظيفية التي تعلمناها في الوحدة السابقة.

10.2 النماذج الموحدة (Normal Forms)

النماذج الموحدة (Normal Forms) هي مجموعة من الإرشادات أو الشروط التي يجب أن تستوفيها الجداول لتقييم مدى توحيدها. كل شكل طبيعي يمثل مستوى أعلى من التنظيم ويُقلل من التكرار وحالات الشذوذ بشكل أكبر.

فيما يلي أبرز النماذج الموحدة التي تُطبق بشكل شائع:

10.3 النموذج الموحد الأول (1NF – First Normal Form)

هو المستوى الأساسي للتطبيع. يجب أن يفي كل جدول في قاعدة البيانات بهذا الشكل الطبيعي ليعتبر "علائقياً" بالمعنى الحقيقي.

  • الشرط:
    • الذرية (Atomicity): كل حقل (خلية) يجب أن يحتوي على قيمة واحدة فقط، وليس مجموعة من القيم أو قيم متعددة.
    • فرادة الصفوف (Unique Rows): كل صف في الجدول يجب أن يكون فريدًا، مما يعني وجود مفتاح أساسي (Primary Key) يُعرف كل صف بشكل فريد.
    • نفس النوع (Same Type): يجب أن تكون جميع القيم في عمود معين من نفس النوع.
مثال: جدول غير 1NF (قبل التطبيق)
StudentID Name Courses
1 علي رياضيات، فيزياء
2 سارة كيمياء

المشكلة هنا هي أن الحقل Courses يحتوي على قيم متعددة ("رياضيات، فيزياء") في صف واحد.

بعد تطبيق 1NF:

لتطبيع هذا الجدول إلى 1NF، نقوم بتفكيك القيم المتعددة إلى صفوف منفصلة، مع تكرار بيانات الطالب لكل مقرر:

StudentID Name Course
1 علي رياضيات
1 علي فيزياء
2 سارة كيمياء

الآن، كل حقل يحتوي على قيمة واحدة. المفتاح الأساسي للجدول الجديد سيكون المفتاح المركب (StudentID, Course).

10.4 النموذج الموحد الثاني (2NF – Second Normal Form)

يُعالج 2NF مشاكل الاعتماديات الجزئية (Partial Dependencies) التي تحدث عندما تعتمد سمات غير رئيسية على جزء فقط من المفتاح الرئيسي المركب.

  • الشرط:
    • يجب أن يكون الجدول في 1NF.
    • لا وجود لاعتمادية جزئية: يجب ألا تعتمد أي سمة غير مفتاحية على جزء فقط من المفتاح الرئيسي المركب. يجب أن تعتمد على المفتاح الرئيسي بالكامل.
مثال: جدول غير 2NF (قبل التطبيق)

تخيل جدول Student_Course_Info لتسجيل الطلاب في المقررات، مع معلومات إضافية عن الطالب والمقرر:

StudentID CourseID StudentName CourseName Instructor
101 CS101 أحمد مقدمة في البرمجة د. سعيد
102 DB201 سارة قواعد البيانات د. ليلى
101 MA101 أحمد حساب التفاضل د. نورا

المفتاح الرئيسي المركب هو (StudentID, CourseID).

المشكلة هنا:

  • StudentName يعتمد فقط على StudentID (جزء من المفتاح المركب).
  • CourseName وInstructor يعتمدان فقط على CourseID (جزء آخر من المفتاح المركب).
  • هذه هي اعتماديات جزئية.
بعد تطبيق 2NF:

لفصل الاعتماديات الجزئية، نقوم بتقسيم الجدول إلى جداول منفصلة:

جدول الطلاب (Students):

StudentID (PK) StudentName
101أحمد
102سارة

جدول المقررات (Courses):

CourseID (PK) CourseName Instructor
CS101مقدمة في البرمجةد. سعيد
DB201قواعد البياناتد. ليلى
MA101حساب التفاضلد. نورا

جدول التسجيل (Enrollment) (الجدول الوسيط):

StudentID (FK) CourseID (FK) (PK المركب)
101CS101
102DB201
101MA101

الآن، جميع السمات غير الرئيسية (لا توجد هنا في جدول Enrollment) تعتمد بشكل كامل على المفتاح الرئيسي المركب (StudentID, CourseID).


-- إنشاء جدول الطلاب
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    StudentName VARCHAR(100) NOT NULL
);

-- إنشاء جدول المقررات
CREATE TABLE Courses (
    CourseID VARCHAR(10) PRIMARY KEY,
    CourseName VARCHAR(100) NOT NULL,
    Instructor VARCHAR(100)
);

-- إنشاء جدول التسجيل (للعلاقة M:N بين الطلاب والمقررات)
CREATE TABLE Enrollment (
    StudentID INT,
    CourseID VARCHAR(10),
    PRIMARY KEY (StudentID, CourseID), -- مفتاح رئيسي مركب
    FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
    FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
                        

10.5 النموذج الموحد الثالث (3NF – Third Normal Form)

يُعالج 3NF مشاكل الاعتماديات الانتقالية (Transitive Dependencies) التي تحدث عندما تعتمد سمة غير رئيسية على سمة غير رئيسية أخرى.

  • الشرط:
    • يجب أن يكون الجدول في 2NF.
    • لا وجود لاعتمادية انتقالية: يجب ألا تعتمد أي سمة غير مفتاحية على سمة أخرى غير مفتاحية. (أي أن السمات غير الرئيسية تعتمد مباشرة فقط على المفتاح الرئيسي).
مثال: جدول غير 3NF (قبل التطبيق)

تخيل جدول Employees_Departments:

EmployeeID EmployeeName DepartmentID DepartmentName DepartmentLocation
101 علي D01 الموارد البشرية الرياض
102 سارة D02 التسويق جدة
103 فهد D01 الموارد البشرية الرياض

المفتاح الرئيسي هو EmployeeID.

المشكلة هنا:

  • EmployeeID $\rightarrow$ DepartmentID
  • DepartmentID $\rightarrow$ DepartmentName و DepartmentID $\rightarrow$ DepartmentLocation
  • هذا يعني أن EmployeeID $\rightarrow$ DepartmentName و EmployeeID $\rightarrow$ DepartmentLocation بشكل انتقالي عبر DepartmentID.
  • DepartmentName وDepartmentLocation يعتمدان على DepartmentID، وDepartmentID ليست المفتاح الرئيسي للجدول.
  • هذه هي اعتماديات انتقالية.
بعد تطبيق 3NF:

لفصل الاعتماديات الانتقالية، نقوم بتقسيم الجدول إلى جداول منفصلة:

جدول الموظفين (Employees):

EmployeeID (PK) EmployeeName DepartmentID (FK)
101عليD01
102سارةD02
103فهدD01

جدول الأقسام (Departments):

DepartmentID (PK) DepartmentName DepartmentLocation
D01الموارد البشريةالرياض
D02التسويقجدة

الآن، كل سمة غير رئيسية في جدول Employees (مثل EmployeeName) تعتمد مباشرة على المفتاح الرئيسي EmployeeID. ومعلومات القسم موجودة في جدول منفصل.


-- إنشاء جدول الأقسام
CREATE TABLE Departments (
    DepartmentID VARCHAR(10) PRIMARY KEY,
    DepartmentName VARCHAR(100) NOT NULL,
    DepartmentLocation VARCHAR(100)
);

-- إنشاء جدول الموظفين
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName VARCHAR(100) NOT NULL,
    DepartmentID VARCHAR(10),
    FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);
                        

10.6 نموذج بويس-كود الموحَّد (BCNF – Boyce-Codd Normal Form)

يُعتبر BCNF شكلاً طبيعيًا أكثر صرامة من 3NF، ويُعالج بعض الحالات الخاصة التي قد تسبب مشاكل في 3NF، خاصة عندما يكون هناك تداخل بين المفاتيح المحتملة (Candidate Keys).

  • الشرط:
    • يجب أن يكون الجدول في 3NF.
    • لكل اعتماد وظيفي غير بديهي ($X \rightarrow Y$) في الجدول، يجب أن يكون X مفتاحًا فائقًا (Super Key). المفتاح الفائق هو أي مجموعة من السمات التي تُحدد بشكل فريد كل صف في الجدول (بما في ذلك المفتاح الرئيسي).

أهمية BCNF:

  • حل الحالات المعقدة: يُعالج حالات الشذوذ التي لا يغطيها 3NF بشكل كامل، خاصة عندما يحتوي الجدول على مفتاحين أو أكثر متداخلين.
  • أقصى درجات التطبيع: يضمن BCNF أن كل اعتماد وظيفي يعتمد فقط على مفتاح فائق، مما يُقلل التكرار إلى أقصى حد ممكن.
مثال: جدول Course_Instructor_Student

تخيل جدولاً يسجل المقررات، المدرسين الذين يدرسونها، والطلاب المسجلين. (هذا مثال كلاسيكي يُستخدم لشرح BCNF)

StudentID Course Instructor
1قواعد بياناتأحمد
2قواعد بياناتأحمد
3ذكاء اصطناعيسارة
1ذكاء اصطناعيسارة

الاعتماديات المفترضة:

  • (StudentID, Course) $\rightarrow$ Instructor (الجمع بين الطالب والمقرر يحدد المدرس – لأن الطالب يسجل في مقرر، والمقرر يدرسه مدرس واحد). هذا هو المفتاح الرئيسي.
  • Instructor $\rightarrow$ Course (كل مدرس يدرس مقررًا واحدًا فقط). هذه هي المشكلة: Instructor ليس مفتاحًا فائقًا، لكنه يحدد Course.

الجدول في 3NF (لا توجد اعتماديات جزئية أو انتقالية بالنسبة للمفتاح الرئيسي المركب). لكنه ليس في BCNF لأن Instructor (المُحدِّد) ليس مفتاحًا فائقًا.

بعد تطبيق BCNF:

نفصل الجدول إلى جدولين:

جدول Enrollment (التسجيل):

StudentID (PK جزء) Course (PK جزء)
1قواعد بيانات
2قواعد بيانات
3ذكاء اصطناعي
1ذكاء اصطناعي

جدول Course_Taught_By (المقررات التي يدرسها المدرسون):

Instructor (PK) Course
أحمدقواعد بيانات
سارةذكاء اصطناعي

الآن، كل الاعتماديات في كلا الجدولين تعتمد على مفتاح فائق. في جدول Course_Taught_By، Instructor هو المفتاح الرئيسي وبالتالي مفتاح فائق.

10.7 التوحيد وتصميم قواعد البيانات

التوحيد ليس مجرد مجموعة من القواعد النظرية؛ بل هو عملية عملية وحاسمة في تصميم قواعد البيانات ذات الكفاءة العالية والموثوقية.

  • يساعد التوحيد على:
    • تقليل التكرار (Redundancy): يضمن أن كل معلومة مخزنة مرة واحدة فقط.
    • منع حالات الشذوذ (Anomalies):
      • شذوذ الإدخال (Insertion Anomaly): عدم القدرة على إضافة بيانات لكيان دون وجود بيانات لكيان آخر.
      • شذوذ التحديث (Update Anomaly): الحاجة لتحديث نفس البيانات في أماكن متعددة.
      • شذوذ الحذف (Deletion Anomaly): فقدان بيانات غير مقصودة عند حذف سجل.
    • تسهيل صيانة البيانات والتطبيقات: تصبح قاعدة البيانات أسهل في الفهم والتعديل مع تطور المتطلبات.
    • تعزيز سلامة البيانات (Data Integrity): بضمان اتساق البيانات ودقتها.
ملاحظات عملية (Practical Considerations):
  • لا يجب الإفراط في التوحيد: على الرغم من فوائد التوحيد، فإن الوصول إلى أشكال طبيعية عالية جدًا (مثل 4NF أو 5NF) قد يؤدي إلى إنشاء عدد كبير جدًا من الجداول الصغيرة. هذا قد يزيد من تعقيد الاستعلامات (يتطلب المزيد من الروابط - JOINs) ويقلل من الأداء في بعض التطبيقات.
  • يفضل الموازنة بين التطبيع والكفاءة: في العالم الحقيقي، غالبًا ما يُفضل المصممون التنازل عن مستوى توحيد أعلى قليلاً (مثل التوقف عند 3NF أو BCNF) من أجل تحسين أداء الاستعلامات أو تبسيط التصميم، خاصة في أنظمة مستودعات البيانات (Data Warehouses) حيث التكرار قد يكون مقبولاً لسرعة الاستعلام. هذا ما يُعرف بعملية "فك التطبيع" (Denormalization).

10.8 المصطلحات الأساسية والاختصارات (Key Terms and Abbreviations)

المصطلح (الإنجليزية) المصطلح (العربية) التعريف
Normalization التوحيد عملية تنظيم الجداول في قاعدة البيانات لتقليل التكرار ومنع التناقضات وحالات الشذوذ.
Normal Form (NF) الشكل الطبيعي مجموعة من القواعد التي يجب أن يلتزم بها الجدول لتقييم مدى توحيده.
1NF (First Normal Form) النموذج الموحد الأول شرطه أن كل حقل يحتوي على قيمة واحدة فقط، وكل صف فريد (ذرية القيم وعدم تكرار الصفوف).
2NF (Second Normal Form) النموذج الموحد الثاني شرطه أن يكون الجدول في 1NF، ولا وجود لاعتمادية جزئية على جزء من المفتاح المركب.
3NF (Third Normal Form) النموذج الموحد الثالث شرطه أن يكون الجدول في 2NF، ولا وجود لاعتمادية انتقالية بين الحقول غير المفتاحية.
BCNF (Boyce-Codd Normal Form) نموذج بويس-كود الموحَّد شرطه أن يكون الجدول في 3NF، ولكل اعتماد وظيفي X → Y، يجب أن يكون X مفتاحًا فائقًا.
Redundancy التكرار وجود نفس البيانات في أكثر من مكان داخل قاعدة البيانات.
Anomaly شذوذ / حالة شاذة مشكلة تحدث في قاعدة البيانات بسبب سوء التصميم (مثل مشاكل الإدخال، التحديث، الحذف).
Insertion Anomaly حالة الإدخال الشاذة صعوبة إدخال بيانات جديدة بسبب تصميم غير صحيح.
Update Anomaly حالة التحديث الشاذة تضارب أو فقدان التناسق عند تعديل البيانات المتكررة.
Deletion Anomaly حالة الحذف الشاذة فقدان بيانات أخرى مهمة (غير مستهدفة بالحذف) عند حذف سجل.
Functional Dependency (FD) الاعتمادية الوظيفية علاقة بين مجموعتين من الحقول حيث تحدد مجموعة القيم في الأخرى.
Partial Dependency اعتمادية جزئية اعتماد سمة غير رئيسية على جزء فقط من المفتاح الرئيسي المركب.
Transitive Dependency اعتمادية انتقالية اعتماد سمة غير رئيسية على سمة غير رئيسية أخرى في نفس الجدول.
Super Key مفتاح فائق أي مجموعة من السمات التي يمكنها تعريف كل سجل بشكل فريد (بما في ذلك المفتاح الرئيسي).

ملخص الوحدة

  • التوحيد (Normalization) هو عملية تنظيم الجداول لتقليل التكرار ومنع حالات الشذوذ.
  • يُنجز التوحيد من خلال تطبيق النماذج الموحدة (Normal Forms):
    • 1NF: كل حقل قيمة ذرية واحدة، وكل صف فريد.
    • 2NF: في 1NF + لا اعتمادية جزئية.
    • 3NF: في 2NF + لا اعتمادية انتقالية.
    • BCNF: في 3NF + كل مُحدِّد هو مفتاح فائق.
  • التوحيد يُحسن سلامة البيانات، ويُسهل صيانة قاعدة البيانات، لكن يجب الموازنة بين مستوى التطبيع والأداء.

10.9 تمارين مقترحة (Suggested Exercises)

اختبر فهمك لمفاهيم هذه الوحدة بالإجابة على الأسئلة التالية:

  1. تخيل جدولاً غير مُطبع يُسمى Student_Course_Grade_Instructor_Dept يحتوي على الأعمدة التالية: StudentID, StudentName, CourseID, CourseName, InstructorName, InstructorDept, Grade.
    أعد تصميم هذا الجدول خطوة بخطوة إلى 1NF ثم 2NF ثم 3NF. لكل خطوة، اذكر المشكلة (إن وجدت) والحل، مع توضيح الجداول الناتجة والمفاتيح الأساسية والخارجية.
    الاعتماديات المفترضة:
    • StudentID $\rightarrow$ StudentName
    • CourseID $\rightarrow$ CourseName
    • InstructorName $\rightarrow$ InstructorDept
    • (StudentID, CourseID) $\rightarrow$ Grade
    • CourseID $\rightarrow$ InstructorName (كل مقرر يدرسه مدرس واحد فقط)
  2. أعطِ مثالًا عمليًا لـ حالة إدخال شاذة (Insertion Anomaly) في جدول غير مُطبع، ثم اشرح كيف يمكن حلها باستخدام عملية التوحيد، موضحًا الأشكال الطبيعية التي ستساعد في ذلك.
  3. صف الفرق الأساسي بين النموذج الموحد الثالث (3NF) ونموذج بويس-كود الموحَّد (BCNF). أعطِ مثالًا عمليًا لجدول يكون في 3NF ولكنه ليس في BCNF، واشرح سبب ذلك وكيف يمكن تطبيعه إلى BCNF.
  4. بالنظر إلى الجدول التالي الذي يُمثل تسجيلات الطلاب في مشاريع متعددة:
    ProjectID ProjectName StudentID StudentName Advisor AdvisorDept
    P1المكتبة الرقميةS1ليلىد. ناصرعلوم حاسب
    P1المكتبة الرقميةS2أحمدد. ناصرعلوم حاسب
    P2نظام إدارة المستشفىS3فاطمةد. سارةنظم معلومات

    الاعتماديات المفترضة:

    • ProjectID $\rightarrow$ ProjectName
    • StudentID $\rightarrow$ StudentName
    • Advisor $\rightarrow$ AdvisorDept
    • (ProjectID, StudentID) هو المفتاح الرئيسي.
    حلل هذا الجدول وقُم بتوحيده إلى BCNF، مع الرسم التوضيحي للجداول الجديدة والمفاتيح الرئيسية والخارجية.