يبدأ بناء قاعدة بيانات ناجحة قبل كتابة أمر CREATE TABLE. التصميم الجيد يحدد البيانات المطلوبة والعلاقات بينها والقيود التي تمنع السجلات غير الصحيحة. في هذا الدرس نطبّق الفكرة على نظام تعليمي صغير باستخدام MySQL.
من المتطلبات إلى جداول
ابدأ بتحديد الكيانات الأساسية في المشروع. في مثالنا يوجد «قسم» و«طالب». لكل قسم اسم فريد، ولكل طالب اسم وبريد إلكتروني وحالة ومعرّف للقسم الذي ينتمي إليه. يتحول كل كيان عادة إلى جدول، وتتحول خصائصه إلى أعمدة.
العلاقة هنا هي: قسم واحد يمكن أن يضم عدة طلاب، وكل طالب ينتمي إلى قسم واحد. نمثّل هذه العلاقة بمفتاح خارجي في جدول الطلاب يشير إلى المفتاح الأساسي في جدول الأقسام.
اختيار أسماء وأنواع بيانات واضحة
- استخدم أسماء ثابتة ومفهومة للجداول والأعمدة.
- اختر نوعًا يناسب القيمة الفعلية؛ فالرقم التعريفي يختلف عن النص والتاريخ.
- حدّد
NOT NULLعندما تكون القيمة مطلوبة. - استخدم
UNIQUEللبيانات التي يجب ألا تتكرر، مثل البريد في هذا المثال. - لا تضف فهرسًا لكل عمود؛ أنشئ الفهارس وفق الاستعلامات الفعلية.
إنشاء قاعدة البيانات
CREATE DATABASE learning_center
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE learning_center;
يدعم الترميز utf8mb4 النصوص العربية ومجموعة واسعة من المحارف. وقد تختلف التهيئة الأنسب حسب إصدار MySQL ومتطلبات المشروع، لذلك راجع إعدادات الخادم قبل اعتمادها في الإنتاج.
إنشاء جدول الأقسام
CREATE TABLE departments (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
يضمن المفتاح الأساسي وجود معرّف فريد لكل قسم. ويمنع القيد UNIQUE تكرار اسم القسم، بينما يسجل العمود created_at وقت إنشاء السجل تلقائيًا.
إنشاء جدول الطلاب والعلاقة
CREATE TABLE students (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
department_id BIGINT UNSIGNED NOT NULL,
name VARCHAR(150) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_students_department
FOREIGN KEY (department_id)
REFERENCES departments(id)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE=InnoDB;
يمنع المفتاح الخارجي إضافة طالب إلى قسم غير موجود. ويمنع ON DELETE RESTRICT حذف قسم ما دام مرتبطًا بطلاب. القرار المناسب للحذف يعتمد على قواعد العمل؛ فقد تحتاج في مشروع آخر إلى الأرشفة بدل الحذف.
فحص البنية وتجربة البيانات
SHOW TABLES;
DESCRIBE departments;
DESCRIBE students;
INSERT INTO departments (name)
VALUES ('علوم الحاسوب');
INSERT INTO students (department_id, name, email)
VALUES (1, 'سارة أحمد', 'sara@example.com');
بعد الإدخال يمكنك ربط الجدولين في استعلام واحد:
SELECT s.name, s.email, d.name AS department
FROM students AS s
JOIN departments AS d
ON d.id = s.department_id;
أخطاء تصميم شائعة
- تخزين عدة قيم داخل عمود نصي واحد بدل إنشاء جدول وعلاقة مناسبين.
- تكرار البيانات نفسها في سجلات كثيرة دون حاجة.
- غياب المفاتيح والقيود التي تحمي سلامة البيانات.
- اختيار أنواع أكبر أو أصغر من المطلوب دون تقييم.
- تغيير بنية قاعدة الإنتاج مباشرة دون نسخة احتياطية وخطة ترحيل واختبار.
راجع الدروس السابقة
إذا احتجت مراجعة المفاهيم، اقرأ مقدمة MySQL للمبتدئين، أو ارجع إلى تشغيل MySQL باستخدام Docker.
مصادر MySQL الرسمية
الخلاصة: حوّل المتطلبات إلى كيانات وعلاقات، واختر الأنواع والقيود بوعي، ثم اختبر البنية على بيانات تجريبية قبل نقلها إلى بيئة حقيقية.