التطبيع حتى 3NF
الأشكال الطبيعية الأول والثاني والثالث والشذوذات التي تزيلها
التطبيع حتى 3NF درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
لماذا يطرح المحاورون أسئلة عن التطبيع
يُعدّ التطبيع من أساسيات نمذجة قواعد البيانات، ويستخدمه المحاورون لاختبار مدى فهمك لسلامة البيانات على مستوى التصميم. غالبًا ما يبدو السؤال هكذا: «ما التطبيع، ولماذا هو مهم؟»
التطبيع هو عملية تنظيم الأعمدة والجداول بهدف تقليل التكرار ومنع حالات شذوذ التحديث والإدراج والحذف. ويضيف كل شكل طبيعي (1NF و2NF و3NF) قاعدة أكثر صرامة.
تذكر الإجابة القوية حالات الشذوذ التي يزيلها التطبيع، لا تعريفات الكتاب فقط.
حالات الشذوذ الثلاث
قبل التعرّف إلى الأشكال الطبيعية، تعلّم المشكلات التي تعالجها. فالجدول سيئ التصميم الذي يخزّن كل شيء في مكان واحد يعاني ثلاث حالات شذوذ:
- شذوذ التحديث: تُخزَّن المعلومة نفسها في صفوف متعددة، لذا يجب تعديلها جميعًا، وإلا أصبحت البيانات غير متسقة.
- شذوذ الإدراج: لا يمكنك إضافة معلومة من دون تقديم بيانات أخرى غير مرتبطة بها أيضًا، مثل عدم القدرة على إضافة منتج من دون طلب.
- شذوذ الحذف: يؤدي حذف صف واحد عن طريق الخطأ إلى محو معلومة مستقلة أخرى.
إذا استطعت اكتشاف هذه الحالات في جدول نموذجي، فستتمكن من تبرير كل خطوة من خطوات التطبيع.
جدول البداية غير المُطبَّع
إليك مثالًا كلاسيكيًا في المقابلات: جدول واحد عريض يخلط بين الطلبات والعملاء والمنتجات. لاحظ تكرار بريد العميل الإلكتروني وسعر المنتج في صفوف متعددة. هنا تكمن حالات الشذوذ.
مهمتك في المقابلة هي ترقية هذا الجدول وصولًا إلى 3NF، مع شرح كل عملية تقسيم.
-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
order_id INT,
customer_id INT,
customer_email VARCHAR(255),
product_id INT,
product_name VARCHAR(100),
unit_price DECIMAL(10,2),
quantity INT
);الشكل الطبيعي الأول (1NF)
يتطلب 1NF أن يحتوي كل عمود على قيمة ذرّية واحدة، وألا توجد مجموعات متكررة أو مصفوفات داخل خلية.
ينتهك الجدول 1NF إذا كان أحد الأعمدة يخزّن قائمة مفصولة بفواصل مثل 'phone1, phone2'، أو إذا كانت لديك أعمدة مثل product1, product2, product3.
الحل هو وضع كل قيمة في صف خاص بها. يريد المحاور أن يسمع منك: «قيم ذرّية، لا مجموعات متكررة، ومفتاح يحدد كل صف.»
-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'
-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
customer_id INT,
phone VARCHAR(20),
PRIMARY KEY (customer_id, phone)
);التبعيات الوظيفية
لكي تشرح 2NF و3NF، يجب أن تستخدم مصطلح التبعية الوظيفية. نكتب A -> B لنعني «أن A يحدد B»: فلكل قيمة من A قيمة واحدة بالضبط من B.
في جدول الطلبات لدينا:
customer_id -> customer_emailproduct_id -> product_name, unit_priceorder_id, product_id -> quantity
يدور التطبيع في جوهره حول ضمان اعتماد كل عمود غير مفتاحي على المفتاح بأكمله، وليس على شيء سوى المفتاح.
الشكل الطبيعي الثاني (2NF)
ينطبق 2NF عندما يكون المفتاح الأساسي مركبًا. فهو يمنع اعتماد عمود غير مفتاحي على جزء من المفتاح فقط، وتسمى هذه الحالة تبعية جزئية.
مفتاح بند الطلب لدينا هو (order_id, product_id). لكن product_name وunit_price يعتمدان على product_id وحده، وليس على المفتاح كاملًا. هذه تبعية جزئية، ولذلك ينتهك الجدول 2NF.
الحل هو نقل سمات المنتج إلى جدول products الذي يكون مفتاحه product_id.
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
unit_price DECIMAL(10,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);الشكل الطبيعي الثالث (3NF)
يزيل 3NF التبعيات الانتقالية: أي عمود غير مفتاحي يعتمد على عمود غير مفتاحي آخر بدلًا من اعتماده مباشرة على المفتاح.
لنفترض أن جدول orders يحتوي على customer_id وcustomer_email. لدينا هنا order_id -> customer_id -> customer_email. يعتمد البريد الإلكتروني على المفتاح عبر customer_id فقط، وهذه تبعية انتقالية.
الحل هو فصل العملاء في جدول خاص بهم. عندها تعتمد الأعمدة غير المفتاحية في كل جدول على مفتاحه وحده.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_email VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);وسيلة التذكّر في سطر واحد
يحب المحاورون المرشح الذي يستطيع تلخيص 3NF في جملة واحدة. والصياغة التقليدية هي:
«يجب أن يعتمد كل عمود غير مفتاحي على المفتاح، وعلى المفتاح بأكمله، وليس على شيء سوى المفتاح.»
- المفتاح -> 1NF (يوجد مفتاح، والقيم ذرّية).
- المفتاح بأكمله -> 2NF (لا توجد تبعية جزئية).
- لا شيء سوى المفتاح -> 3NF (لا توجد تبعية انتقالية).
يسمح لك هذا السطر الواحد بإعادة بناء الأشكال الثلاثة عند الحاجة.
BCNF: سؤال المتابعة
قد يطرح المحاور الدقيق سؤالًا عن الشكل الطبيعي لـ Boyce-Codd (BCNF)، وهو إصدار أكثر صرامة من 3NF.
يتطلب BCNF أنه لكل تبعية وظيفية X -> Y، يجب أن يكون X مفتاحًا فائقًا. يسمح 3NF باستثناء نادر عندما تكون السمة التابعة جزءًا من مفتاح مرشح، أما BCNF فيزيل حتى هذا الاستثناء.
لن ترى انتهاكات BCNF كثيرًا في الواقع العملي، لكن ذكره والقول «إن BCNF هو 3NF من دون استثناءات للسمات الأولية» يدل على عمق فهمك.
متى لا ينبغي إجراء التطبيع
تقرّ الإجابة على مستوى خبير بوجود مفاضلة. يحسّن التطبيع سلامة البيانات، لكنه قد يضر بأداء القراءة لأن تنفيذ الاستعلام يتطلب عددًا أكبر من عمليات الربط.
يُعدّ إلغاء التطبيع المتعمد مقبولًا عندما:
- يكون حجم القراءة كبيرًا وتشكل عمليات الربط عنق الزجاجة.
- تبني طبقة للتحليلات أو إعداد التقارير، مثل مخططات النجمة التي سنتناولها لاحقًا.
- تستطيع إبقاء النسخة المكررة متزامنة، باستخدام المشغلات أو ETL أو طرق العرض المادية.
قل: «أجرِ التطبيع لضمان سلامة بيانات OLTP، وألغِ التطبيع عمدًا لزيادة سرعة القراءة في OLAP.»
الشرح على السبورة
اجمع كل ذلك معًا. في مقابلة مباشرة، عندما تُعطى جدولًا فوضويًا:
- حدّد المفتاح المرشح وسجّل التبعيات الوظيفية.
- تحقق من الذرّية والمجموعات المتكررة (1NF).
- إذا كان المفتاح مركبًا، فتحقق من التبعيات الجزئية (2NF).
- تحقق من التبعيات بين الأعمدة غير المفتاحية (3NF).
- ارسم الجداول الناتجة مع المفاتيح الأساسية والخارجية.
إن شرح هذه الخطوات بصوت عالٍ هو بالضبط ما يقيّمه المحاور.
تحقق سريع
اختبر مدى استيعابك للأشكال الطبيعية.
مراجعة: التطبيع حتى 3NF
يمكنك الآن الإجابة عن سؤال مقابلات التطبيع الشائع من أوله إلى آخره:
- يزيل التطبيع حالات شذوذ التحديث والإدراج والحذف من خلال تقليل التكرار.
- 1NF: قيم ذرّية، ولا مجموعات متكررة.
- 2NF: لا توجد تبعية جزئية على مفتاح مركب.
- 3NF: لا توجد تبعية انتقالية بين عمود غير مفتاحي وآخر غير مفتاحي.
- لخّص ذلك بعبارة «المفتاح، والمفتاح بأكمله، ولا شيء سوى المفتاح.»
- يجعل BCNF قواعد 3NF أكثر صرامة؛ وألغِ التطبيع عمدًا للتحليلات الكثيفة القراءة.
الأسئلة الشائعة
هل درس «التطبيع حتى 3NF» مجاني؟
نعم — نص درس «التطبيع حتى 3NF» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «التطبيع حتى 3NF»؟
الأشكال الطبيعية الأول والثاني والثالث والشذوذات التي تزيلها تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التطبيع حتى 3NF»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التطبيع حتى 3NF
- نمذجة ER وتعددية العلاقات
- مخطط النجمة وتصميم مستودع البيانات
- مجموعة مسائل مقابلة تجريبية كاملة