أساسيات قواعد البيانات (Database Basics)
قبل أن نبدأ في كتابة استعلامات SQL، من الضروري جداً أن نفهم كيف تُنظم البيانات في قواعد البيانات العلائقية. في هذا الدرس الشامل، سنتعلم المفاهيم الأساسية: ما هي الجداول، الصفوف، الأعمدة، أنواع البيانات، المفاتيح الأساسية والأجنبية، وكيف تُربط الجداول ببعضها لتشكيل قاعدة بيانات متكاملة. سنستخدم أمثلة واقعية من الحياة اليومية لتبسيط هذه المفاهيم، مع رسوم توضيحية نصية لكل مفهوم.
1. ما هي قاعدة البيانات العلائقية؟
قاعدة البيانات العلائقية (Relational Database) هي مجموعة منظمة من البيانات المخزنة في جداول (Tables) مترابطة. كلمة "علائقية" تعني أن الجداول يمكن أن ترتبط ببعضها البعض من خلال علاقات محددة. هذا النموذج تم اختراعه في السبعينيات على يد إدغار كود (Edgar F. Codd)، وأصبح المعيار الأكثر استخداماً في العالم لتنظيم البيانات.
لنتخيل قاعدة بيانات لمدرسة. هذه القاعدة قد تحتوي على عدة جداول: جدول للطلاب، جدول للمعلمين، جدول للمواد الدراسية، جدول للدرجات، وهكذا. كل جدول يخزن نوعاً معيناً من المعلومات، والجداول مرتبطة ببعضها لتشكيل منظومة متكاملة.
2. الجدول (Table): الوحدة الأساسية لتخزين البيانات
الجدول هو الهيكل الأساسي في قاعدة البيانات العلائقية. يشبه الجدول جدول Excel أو جدول ورقي عادي، يحتوي على صفوف وأعمدة. كل جدول يُخزن نوعاً محدداً من الكيانات (Entities). على سبيل المثال:
- جدول students يخزن معلومات الطلاب
- جدول products يخزن معلومات المنتجات في متجر إلكتروني
- جدول employees يخزن معلومات الموظفين في شركة
لنرى مثالاً عملياً لجدول طلاب:
+----+-----------+-----+--------+------------+
| id | name | age | gender | city |
+----+-----------+-----+--------+------------+
| 1 | أحمد علي | 20 | ذكر | الرياض |
| 2 | فاطمة | 19 | أنثى | جدة |
| 3 | محمد | 21 | ذكر | الدمام |
| 4 | سارة | 20 | أنثى | مكة |
| 5 | علي | 22 | ذكر | المدينة |
+----+-----------+-----+--------+------------+
شرح مكونات الجدول:
- اسم الجدول (Table Name):
students- يجب أن يكون واضحاً ويعبر عن محتوى الجدول - الأعمدة (Columns):
id, name, age, gender, city- تمثل الخصائص أو الصفات - الصفوف (Rows): كل صف يمثل طالباً واحداً بمعلوماته الكاملة
3. الصفوف (Rows): السجلات الفردية
الصف (Row) يُسمى أيضاً سجل (Record) أو صف بيانات (Tuple). كل صف يمثل كياناً واحداً مستقلاً. في جدول الطلاب أعلاه، كل صف يمثل طالباً واحداً بكل معلوماته.
على سبيل المثال، الصف الأول:
| 1 | أحمد علي | 20 | ذكر | الرياض |
هذا الصف يخبرنا أن هناك طالباً رقمه التعريفي 1، اسمه أحمد علي، عمره 20 سنة، جنسه ذكر، ويسكن في الرياض. كل هذه المعلومات مجتمعة تشكل سجلاً كاملاً لهذا الطالب.
ملاحظة مهمة: عدد الصفوف في الجدول يمكن أن يكون صفراً (جدول فارغ) أو ملايين الصفوف. لا يوجد حد نظري لعدد الصفوف، لكن الحد العملي يعتمد على سعة التخزين وأداء النظام.
4. الأعمدة (Columns): الخصائص والصفات
العمود (Column) يُسمى أيضاً حقل (Field) أو سمة (Attribute). كل عمود يمثل خاصية أو صفة معينة للكيان. في جدول الطلاب، لدينا خمسة أعمدة:
تفصيل الأعمدة:
- id: رقم تعريفي فريد لكل طالب (عدد صحيح)
- name: اسم الطالب (نص)
- age: عمر الطالب (عدد صحيح)
- gender: جنس الطالب (نص)
- city: مدينة الطالب (نص)
كل عمود له نوع بيانات (Data Type) محدد يحدد نوع القيم التي يمكن تخزينها فيه. على سبيل المثال، عمود age يقبل فقط أرقاماً صحيحة، بينما name يقبل نصوصاً.
5. أنواع البيانات (Data Types) الأساسية
كل عمود في الجدول يجب أن يكون له نوع بيانات محدد. أنواع البيانات تضمن سلامة البيانات وتحسن الأداء. إليك أهم أنواع البيانات في SQL:
أنواع البيانات العددية (Numeric Types)
- INT أو INTEGER: أعداد صحيحة (مثل: 1, 100, -50)
- مثال:
age INTلتخزين العمر
- مثال:
- DECIMAL(p, s) أو NUMERIC(p, s): أعداد عشرية دقيقة
- مثال:
price DECIMAL(10, 2)لتخزين السعر (10 أرقام إجمالاً، 2 بعد الفاصلة)
- مثال:
- FLOAT أو DOUBLE: أعداد عشرية تقريبية (للحسابات العلمية)
- مثال:
temperature FLOAT
- مثال:
أنواع البيانات النصية (String Types)
- VARCHAR(n): نص متغير الطول (حتى n حرف)
- مثال:
name VARCHAR(100)- اسم حتى 100 حرف
- مثال:
- CHAR(n): نص ثابت الطول (دائماً n حرف)
- مثال:
country_code CHAR(2)- رمز الدولة (SA, US, EG)
- مثال:
- TEXT: نص طويل جداً (للمقالات والوصف المفصل)
- مثال:
description TEXT
- مثال:
أنواع البيانات الزمنية (Date and Time Types)
- DATE: تاريخ فقط (YYYY-MM-DD)
- مثال:
birth_date DATE- تاريخ الميلاد
- مثال:
- TIME: وقت فقط (HH:MM:SS)
- مثال:
start_time TIME
- مثال:
- DATETIME أو TIMESTAMP: تاريخ ووقت معاً
- مثال:
created_at TIMESTAMP- وقت الإنشاء
- مثال:
أنواع أخرى
- BOOLEAN: قيمة منطقية (TRUE أو FALSE)
- مثال:
is_active BOOLEAN
- مثال:
- BLOB: بيانات ثنائية (صور، ملفات)
- مثال:
profile_picture BLOB
- مثال:
6. المفتاح الأساسي (Primary Key): المعرّف الفريد
المفتاح الأساسي (Primary Key) هو عمود أو مجموعة أعمدة تُحدد بشكل فريد كل صف في الجدول. بمعنى آخر، لا يمكن أن يكون هناك صفان لهما نفس قيمة المفتاح الأساسي.
خصائص المفتاح الأساسي:
- فريد (Unique): لا يمكن تكرار القيمة في الجدول
- غير فارغ (NOT NULL): يجب أن يحتوي على قيمة دائماً
- ثابت (Immutable): يُفضل عدم تغيير قيمته بعد الإنشاء
- واحد لكل جدول: كل جدول يجب أن يحتوي على مفتاح أساسي واحد فقط
في جدول الطلاب السابق، العمود id هو المفتاح الأساسي:
+----+-----------+-----+--------+------------+
| id | name | age | gender | city | ← id هو المفتاح الأساسي
+----+-----------+-----+--------+------------+
| 1 | أحمد علي | 20 | ذكر | الرياض | ← لا يمكن وجود طالب آخر برقم 1
| 2 | فاطمة | 19 | أنثى | جدة |
| 3 | محمد | 21 | ذكر | الدمام |
+----+-----------+-----+--------+------------+
مثال على إنشاء جدول بمفتاح أساسي:
CREATE TABLE students (
id INT PRIMARY KEY, -- المفتاح الأساسي
name VARCHAR(100),
age INT,
gender VARCHAR(10),
city VARCHAR(50)
);
7. المفتاح الأجنبي (Foreign Key): الربط بين الجداول
المفتاح الأجنبي (Foreign Key) هو عمود في جدول يشير إلى المفتاح الأساسي في جدول آخر. يُستخدم لإنشاء علاقات بين الجداول والحفاظ على سلامة البيانات المرجعية (Referential Integrity).
لنفترض أن لدينا جدولين: students و enrollments (التسجيلات في المواد):
+----+-----------+
| id | name |
+----+-----------+
| 1 | أحمد |
| 2 | فاطمة |
| 3 | محمد |
+----+-----------+
+----+------------+----------------+
| id | student_id | course_name | ← student_id هو مفتاح أجنبي
+----+------------+----------------+
| 1 | 1 | الرياضيات | ← يشير إلى الطالب رقم 1 (أحمد)
| 2 | 1 | الفيزياء | ← أحمد مسجل في مادتين
| 3 | 2 | الكيمياء | ← يشير إلى الطالب رقم 2 (فاطمة)
| 4 | 3 | الرياضيات | ← يشير إلى الطالب رقم 3 (محمد)
+----+------------+----------------+
شرح العلاقة:
- العمود
student_idفي جدولenrollmentsهو مفتاح أجنبي - يشير إلى العمود
id(المفتاح الأساسي) في جدولstudents - هذا يعني أن كل تسجيل في جدول
enrollmentsمرتبط بطالب محدد في جدولstudents - لا يمكن إدراج
student_idغير موجود في جدولstudents(سلامة البيانات المرجعية)
8. أنواع العلاقات بين الجداول
علاقة واحد إلى كثير (One-to-Many)
هذا هو النوع الأكثر شيوعاً. سجل واحد في الجدول الأول يرتبط بعدة سجلات في الجدول الثاني.
مثال: طالب واحد يمكن أن يسجل في عدة مواد (علاقة واحد إلى كثير بين students و enrollments)
علاقة كثير إلى كثير (Many-to-Many)
عدة سجلات في الجدول الأول ترتبط بعدة سجلات في الجدول الثاني. تُنفذ عادةً باستخدام جدول وسيط (Junction Table).
مثال: عدة طلاب يمكن أن يسجلوا في عدة مواد، وكل مادة يمكن أن يسجل فيها عدة طلاب
جدول students جدول student_courses (وسيط) جدول courses
+----+-------+ +----+------------+----------+ +----+------------+
| id | name | | id | student_id | course_id| | id | name |
+----+-------+ +----+------------+----------+ +----+------------+
| 1 | أحمد | ←---→ | 1 | 1 | 101 | ←→ | 101| رياضيات |
| 2 | فاطمة | ←---→ | 2 | 1 | 102 | ←→ | 102| فيزياء |
+----+-------+ | 3 | 2 | 101 | | 103| كيمياء |
+----+------------+----------+ +----+------------+
علاقة واحد إلى واحد (One-to-One)
سجل واحد في الجدول الأول يرتبط بسجل واحد فقط في الجدول الثاني. نادرة الاستخدام.
مثال: كل طالب له ملف شخصي واحد فقط يحتوي على معلومات إضافية
9. القيم الفارغة (NULL Values)
NULL تعني "لا توجد قيمة" أو "غير معروف". هي ليست صفراً وليست نصاً فارغاً، بل هي حالة خاصة تعني غياب البيانات.
+----+-----------+-------+
| id | name | email |
+----+-----------+-------+
| 1 | أحمد | NULL | ← البريد الإلكتروني غير معروف
| 2 | فاطمة | f@example.com |
| 3 | محمد | NULL |
+----+-----------+-------+
متى نستخدم NULL؟
- عندما تكون البيانات اختيارية (مثل رقم الهاتف الثاني)
- عندما تكون البيانات غير معروفة بعد (مثل تاريخ التخرج لطالب لم يتخرج)
متى نمنع NULL؟
- في المفاتيح الأساسية (دائماً NOT NULL)
- في الحقول الضرورية (مثل الاسم، تاريخ الميلاد)
10. مثال عملي شامل: قاعدة بيانات متجر إلكتروني
لنجمع كل ما تعلمناه في مثال واقعي. سنصمم قاعدة بيانات بسيطة لمتجر إلكتروني بثلاثة جداول:
+----+-------------+-------------------+
| id | name | email | ← id هو المفتاح الأساسي
+----+-------------+-------------------+
| 1 | أحمد محمد | ahmed@email.com |
| 2 | سارة علي | sara@email.com |
| 3 | محمد حسن | mohamed@email.com |
+----+-------------+-------------------+
+----+------------------+--------+
| id | name | price | ← id هو المفتاح الأساسي
+----+------------------+--------+
| 1 | لابتوب Dell | 3500 |
| 2 | ماوس لاسلكي | 50 |
| 3 | لوحة مفاتيح | 120 |
+----+------------------+--------+
+----+-------------+------------+----------+
| id | customer_id | product_id | quantity |
+----+-------------+------------+----------+
| 1 | 1 | 1 | 1 | ← أحمد طلب لابتوب واحد
| 2 | 1 | 2 | 2 | ← أحمد طلب ماوسين
| 3 | 2 | 3 | 1 | ← سارة طلبت لوحة مفاتيح
| 4 | 3 | 1 | 1 | ← محمد طلب لابتوب
+----+-------------+------------+----------+
↑ ↑
مفتاح أجنبي مفتاح أجنبي
يشير إلى يشير إلى
customers products
تحليل العلاقات:
- جدول
ordersيربط بين العملاء والمنتجات customer_idمفتاح أجنبي يشير إلىcustomers.idproduct_idمفتاح أجنبي يشير إلىproducts.id- علاقة Many-to-Many: عميل واحد يمكن أن يطلب عدة منتجات، ومنتج واحد يمكن أن يُطلب من عدة عملاء
ملخص المفاهيم الأساسية
- الجدول (Table): هيكل يخزن البيانات في صفوف وأعمدة
- الصف (Row): سجل واحد يمثل كياناً واحداً
- العمود (Column): خاصية أو صفة محددة
- نوع البيانات (Data Type): يحدد نوع القيم المسموح بها
- المفتاح الأساسي (Primary Key): معرّف فريد لكل صف
- المفتاح الأجنبي (Foreign Key): يربط جدولين معاً
- NULL: قيمة تعني "لا توجد بيانات"
الخطوة التالية: أول استعلام SQL (First Query)
أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم أول استعلام (First Query) وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي