مرحباً، أهلاً بكم في سلسلة قاعدة البيانات باستخدام Postgres.
اليوم سنتحدث عن Data Modeling (نمذجة البيانات)، وهي مهمة جداً لأنها تسهل تنظيم المعلومات ضمن قاعدة البيانات.
بدون نموذج مضبوط:
القضية ليست فقط تخزين البيانات، بل يجب أن نعرف ما هي العلاقة بين هذه البيانات مع بعضها.
مثل:
هذه الأمور تساعد على:
العلاقة واحد لواحد تعني أن كل سجل في الجدول الأول يرتبط بسجل واحد فقط في الجدول الثاني.
| الشخص (Person) | البروفايل (Profile) |
|---|---|
| ID = 1 | Person ID = 1 |
| Name = John | Followers = 100 |
لتنجح علاقة one-to-one:
User ID في جدول profile unique (فريد)one-to-manyالعلاقة واحد لكثير تعني أن سجل واحد يمكن أن يرتبط بعدة سجلات.
| القسم (Department) | الموظفون (Employees) |
|---|---|
| ID = 1, Name = IT | Employee 1: John - Dept ID = 1 |
| Employee 2: Sarah - Dept ID = 1 | |
| Employee 3: Mike - Dept ID = 1 |
هذه العلاقة موجودة بشكل افتراضي عند إنشاء foreign key.
العلاقة كثير لكثير تعني أن كل سجل يمكن أن يرتبط بعدة سجلات والعكس صحيح.
مثال: طالب يمكن أن يسجل بعدة صفوف، وصف واحد يمكن أن يحتوي عدة طلاب.
لإنشاء هذه العلاقة، نستخدم (Link Table / Bridge Table):
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
| جدول الطلاب (Student) | جدول الربط (Student_Class) | جدول الصفوف (Class) |
|---|---|---|
| ID = 1 | Student ID = 1 | ID = 1 |
| Name = John | Class ID = 1 | Name = JavaScript |
| ID = 2 | Student ID = 1 | ID = 2 |
| Name = Sky | Class ID = 2 | Name = SQL |
| Student ID = 2 | ||
| Class ID = 2 |
جدول الربط يساعد في:
إنشاء جدول person:
CREATE TABLE person (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);إنشاء جدول profile مع foreign key:
CREATE TABLE profile (
id SERIAL PRIMARY KEY,
person_id INT REFERENCES person(id),
followers INT DEFAULT 0
);المشكلة: بدون إضافة UNIQUE، يمكن إنشاء عدة بروفايلات لنفس الشخص.
إدراج البيانات:
INSERT INTO person (name) VALUES ('John');
INSERT INTO profile (person_id) VALUES (1);اختبار المشكلة - إدراج بروفايل ثاني لنفس الشخص:
INSERT INTO profile (person_id) VALUES (1);
SELECT * FROM profile;النتيجة: تم إنشاء بروفايلين لنفس الشخص! ❌
لفرض علاقة one-to-one حقيقية، نضيف UNIQUE:
DROP TABLE profile;
CREATE TABLE profile (
id SERIAL PRIMARY KEY,
person_id INT UNIQUE REFERENCES person(id),
followers INT DEFAULT 0
);الآن إذا حاولنا إدراج بروفايل ثاني:
INSERT INTO profile (person_id) VALUES (1);
INSERT INTO profile (person_id) VALUES (1);سنحصل على خطأ: duplicate value in unique constraint ✓
إنشاء جدول department:
CREATE TABLE department (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);إنشاء جدول employee:
CREATE TABLE employee (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT REFERENCES department(id)
);إدراج البيانات:
INSERT INTO department (name) VALUES ('IT');
INSERT INTO employee (name, department_id) VALUES ('John', 1);
INSERT INTO employee (name, department_id) VALUES ('Sarah', 1);
INSERT INTO employee (name, department_id) VALUES ('Mike', 1);عرض النتائج:
SELECT * FROM employee;النتيجة: ثلاثة موظفين في نفس القسم ✓
إنشاء جدول student:
CREATE TABLE student (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);إنشاء جدول class:
CREATE TABLE class (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);إنشاء جدول الربط student_class:
CREATE TABLE student_class (
student_id INT REFERENCES student(id),
class_id INT REFERENCES class(id),
PRIMARY KEY (student_id, class_id)
);ملاحظة مهمة: نستخدم compound key (مفتاح مركب) كـ PRIMARY KEY بدلاً من id منفصل.
السبب: هذا يضمن أن:
إدراج البيانات:
INSERT INTO student (name) VALUES ('John');
INSERT INTO student (name) VALUES ('Sky');
INSERT INTO class (name) VALUES ('JavaScript');
INSERT INTO class (name) VALUES ('SQL');ربط الطلاب بالصفوف:
INSERT INTO student_class (student_id, class_id) VALUES (1, 1);
INSERT INTO student_class (student_id, class_id) VALUES (1, 2);
INSERT INTO student_class (student_id, class_id) VALUES (2, 2);عرض العلاقات:
SELECT * FROM student_class;النتيجة:
student_id | class_id
-----------+----------
1 | 1
1 | 2
2 | 2لاسترجاع البيانات من العلاقة many-to-many، نحتاج إلى استخدام JOIN tables.
سنتعلم كيفية عمل JOIN في الدرس القادم!
الخلاصة:
One-to-One تحتاج UNIQUEOne-to-Many افتراضيةMany-to-Many تحتاج جدول ربط