طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 301 · من الفكرة إلى المنتج (١): تطبيق ويب متكامل
الدرس 2 · الوحدة 1: الفكرة والتخطيط والتصميم

المحطّة ٢: تصميم البيانات — المخطّط العلائقي والفئات

حوّل المتطلّبات إلى جدولين وعلاقةٍ ومخطّطٍ جاهزٍ للتنفيذ. ⏱ نحو 22 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تستخرج الكيانات والخصائص من المتطلّبات.
  • تصمّم علاقة واحد ← متعدّد بمفتاحٍ أجنبيّ.
  • تترجم المخطّط إلى أوامر CREATE TABLE بأنواعٍ وقيودٍ سليمة.
  • توثّق تصميمك في قاموس بيانات.

١من المتطلّبات إلى الكيانات

كل اسمٍ مهمٍّ في متطلّباتك مرشّحٌ ليكون كيانًا (جدولًا). اقرأ قصص المحطّة السابقة واستخرج الأسماء: مستخدم، مهمّة. هذان كياننا، وكلٌّ يصير جدولًا.

ثم اسأل عن خصائص كل كيان (أعمدته): ما الذي نحفظه عن المستخدم؟ اسمه وكلمة مروره. وعن المهمّة؟ عنوانها وحالتها وصاحبها.

هذا التصميم يأتي قبل كتابة أيّ SQL. المخطّط الخاطئ يكلّفك إعادة بناءٍ مؤلمةً لاحقًا؛ أمّا المخطّط الجيّد فيجعل كل استعلامٍ لاحقٍ سهلًا.

٢العلاقة: المستخدم الواحد يملك عدّة مهامّ

هذا جوهر التصميم: العلاقة واحد ← متعدّد (One-to-Many). المستخدم الواحد له عدّة مهامّ، والمهمّة الواحدة لمستخدمٍ واحد. نمثّلها بوضع مفتاحٍ أجنبيّ user_id في جدول المهامّ يشير إلى users.id:

users🔑 idusernamepass_hashcreated_attasks🔑 id🔗 user_idtitledonecreated_at1∞يملك

٣المخطّط بصيغة SQL

نترجم المخطّط إلى أوامر إنشاءٍ فعليّة. لاحظ كيف يعمل الكود نفسه على SQLite (المختبر) و MySQL (XAMPP) بفروقٍ طفيفةٍ في الأنواع:

-- SQLite (المختبر) / MySQL (XAMPP): الفروق في التعليقاتCREATE TABLE users (  id         INTEGER PRIMARY KEY,            -- MySQL: INT AUTO_INCREMENT PRIMARY KEY  username   TEXT NOT NULL UNIQUE,           -- MySQL: VARCHAR(50) ... UNIQUE  pass_hash  TEXT NOT NULL,                  -- MySQL: VARCHAR(255)  (bcrypt ~60 حرفًا)  created_at TEXT                            -- MySQL: DATETIME);CREATE TABLE tasks (  id         INTEGER PRIMARY KEY,  user_id    INTEGER NOT NULL REFERENCES users(id),   -- المفتاح الأجنبيّ: يربط المهمّة بصاحبها  title      TEXT NOT NULL,  done       INTEGER NOT NULL DEFAULT 0,               -- 0 = غير منجَزة، 1 = منجَزة  created_at TEXT);

نقاط التصميم المهمّة:

٤قاموس البيانات: توثيقٌ موجز

أكمل تصميمك بجدولٍ صغيرٍ يشرح كل عمودٍ ونوعه وقيده — يسمّى قاموس البيانات، ويفيد كل من يقرأ مشروعك (أو أنت بعد شهر):

الجدولالعمودالنوعالقيد/المعنى
usersusernameVARCHAR(50)فريد، لا يفرغ
userspass_hashVARCHAR(255)تعمية bcrypt، لا يفرغ
tasksuser_idINTمفتاح أجنبيّ ← users.id
tasksdoneTINYINT0 أو 1، افتراضيًّا 0

توقّع وتحقّق

العلاقة بين المستخدم والمهمّة في مشروعنا هي:

المستخدم الواحد له عدّة مهامّ.

أين نضع المفتاح الأجنبيّ user_id؟

في طرف «المتعدّد».

لماذا نفصل users عن tasks بدل جدولٍ واحد؟

ما النوع المناسب لعمود pass_hash في MySQL؟

تعمية bcrypt نحو 60 حرفًا؛ نترك سعةً للمستقبل.

الخلاصة

تحدٍّ تصميمي: مخطّط بيانات «مفكّرة مهامّي»

تصميمي

صمّم قاعدة بيانات مشروعك: ارسم المخطّط العلائقي (ERD)، واكتب أوامر الإنشاء، ووثّق الأعمدة في قاموس بيانات. سنُنفّذ هذا التصميم فعليًّا في المحطّة القادمة.

المطلوب:
  • مخطّط ERD يبيّن الجدولين والعلاقة واحد ← متعدّد.
  • أوامر CREATE TABLE للجدولين مع الأنواع والقيود.
  • قاموس بياناتٍ موجزٌ لكل عمود.
☑ راجع عملك قبل التسليم:
💡 تلميح 1
ابدأ من الكيانين في الدرس، ثم تحقّق أن كل قصّة مستخدمٍ يمكن تنفيذها بهذا المخطّط.
💡 تلميح 2
اسأل لكل عمود: هل يفرغ؟ هل يتكرّر؟ ما نوعه؟ — إجاباتك هي القيود.

🐞 لاحظت خطأً في هذا الدرس؟ أبلغني بالبريد

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس