العلاقات والتطبيع
تصميم قاعدة البيانات يبدأ بسؤال: وش العلاقة بين الأشياء؟ وهذا بالضبط اللي ترسمه في مخطط ERD.
واحد لواحد: كل موظف له بطاقة دخول وحدة، وكل بطاقة لموظف واحد.
واحد لكثير: القسم فيه موظفين كثير، والموظف تابع لقسم واحد. المفتاح الأجنبي يكون دايماً في جهة «الكثير»: employees.dept_id.
كثير لكثير: الطلب فيه منتجات كثيرة، والمنتج يظهر في طلبات كثيرة.
علاقة كثير إلى كثير ما تنحفظ مباشرة. نحلها بـجدول وسيط: الطلب الواحد فيه منتجات كثيرة، والمنتج يدخل في طلبات كثيرة، فجدول order_items يربطهم وفيه مفتاحين أجنبيين.
التطبيع (Normalization) هو تقسيم البيانات لجداول بحيث كل معلومة تنحفظ في مكان واحد. شف هذا الجدول السيئ:
| order_id | customer | city | products |
|---|---|---|---|
| 1 | Al Noor Trading | Riyadh | Laptop Pro 14, 27-inch Monitor |
| 4 | Al Noor Trading | Riyadh | Wireless Router, Network Switch 24-port |
| 13 | Al Noor Trading | Riyadh | Laptop Pro 14, Ergonomic Chair |
المشكلة: اسم العميل ومدينته يتكررون مع كل طلب، والمنتجات محشورة في خانة وحدة. لو العميل غيّر مدينته لازم تعدل كل صفوفه، ولو نسيت صف صارت البيانات متناقضة.
| 1NF | كل خانة فيها قيمة وحدة، وما فيه مجموعات متكررة. |
| 2NF | 1NF + كل عمود يعتمد على المفتاح كاملاً، مو على جزء منه. |
| 3NF | 2NF + ما فيه عمود يعتمد على عمود عادي ثاني (مثل المدينة تعتمد على العميل مو على الطلب). |
قاعدة البيانات اللي اشتغلنا عليها مطبّعة لـ 3NF، وهذا اللي خلّى استعلامات الربط ممكنة. في المرحلة الجاية بنبني استوديو ERD عشان ترسم هذي العلاقات بنفسك ويطلع لك كود SQL تلقائياً.