Entities & Attributes
اللبنات الأساسية لتصميم قاعدة البيانات
الـ Entity هو أي شيء أو كيان موجود في الـ mini-world وعايز تخزّن بياناته في قاعدة البيانات. فكّر فيه زي الـ "اسم" في جملة — حاجة ليها وجود مستقل.
الـ Attributes هي الصفات أو الخصائص اللي بتوصف الـ Entity. زي ما الشخص ليه اسم وعنوان وعمر — كل entity ليه attributes بتوصفه.
Name = 'Ragab Ahmed' ← composite attribute SSN = '123456789' ← key attribute Address = '731 Faisal, Giza' ← simple attribute Gender = 'Male' ← simple attribute BirthDate = 'April 1, 1990' ← stored attribute Age = 34 ← derived from BirthDate
أنواع الـ Attributes
كل نوع ليه رمز معين في الـ ERD — لازم تحفظهم
مش ممكن يتقسم لأجزاء أصغر. ده الـ default.
SSN = '123456789' ← can't split further Gender = 'Male' Salary = 12000
بينقسم لأجزاء أصغر ذات معنى. كل جزء ممكن يتخزن لوحده.
Name(FName, MInit, LName) Address(Street, City, State, Zip) Registration(Number, State) ← composite key!
بياخد قيمة واحدة بس لكل entity. ده الـ default.
Age = 34 ← one value per person SSN = '123...' ← one SSN per employee
ممكن يبقى ليه أكتر من قيمة لنفس الـ entity.
{Locations} = ['Cairo', 'Alex', 'Giza'] {Hobbies} = ['Chess', 'Swimming'] {PhoneNums} = ['010...', '011...']
بيتحسب من attribute تاني — مش بنخزنه في قاعدة البيانات.
Age ← derived from BirthDate Num_Employees ← derived from counting employees TotalSalary ← derived from summing salaries
بيحدد كل entity بشكل فريد — لازم يكون Unique ومش NULL.
SSN ← key of EMPLOYEE DNumber ← key of DEPARTMENT VehicleId ← key of CAR Registration(Number,State) ← composite key of CAR
Key Attributes — التعريف والفرق
الفرق بين Key و Unique و Candidate Key
| Property | Key Attribute | Unique Constraint |
|---|---|---|
| Unique Values? | ✅ Yes | ✅ Yes |
| Allows NULL? | ❌ No (NOT NULL) | ⚠️ Yes (NULLs allowed & repeated) |
| Can be PK? | ✅ Yes | ❌ No |
-- Candidate Key 1: Vehicle_Id = 'TK629' -- Candidate Key 2 (composite!): Registration(Number='ABC 123', State='TX') -- Pick ONE as Primary Key
ERD Notation — الرموز والأشكال
اللغة البصرية للـ Entity-Relationship Diagrams
Relationships & Relationship Types
الروابط بين الـ Entities — الـ "أفعال" في الـ ERD
الـ Relationship هو الرابط الذي يربط entities اتنين أو أكتر بمعنى محدد. مثلاً: EMPLOYEE "WORKS_FOR" DEPARTMENT — ده relationship.
الـ Degree هو عدد الـ entity types المشاركة في الـ relationship.
EMPLOYEE SUPERVISION EMPLOYEE
(supervisor / supervisee)EMPLOYEE WORKS_ON PROJECT EMPLOYEE WORKS_FOR DEPARTMENT
SUPPLIER SUPPLY PROJECT
+ PART (+ Quantity)EMPLOYEE -- [ WORKS_ON ] -- PROJECT | Hours ← عدد الساعات اللي الموظف بيشتغلها في المشروع ده -- قيمة Hours بتعتمد على الاتنين: (employee, project) -- Ahmed يشتغل 20 ساعة أسبوعياً على Project-X -- Ahmed يشتغل 15 ساعة أسبوعياً على Project-Y -- بنفس المنطق: MANAGES له Start_Date كـ attribute
Cardinality Ratios — نسب العلاقة
الحد الأقصى لعدد العلاقات — مهم جداً في الامتحانات!
"Person بيحب Ice Cream Flavors كتير" → هتقول 1:M ؟ لكن تفكّر: "كتير من الناس بيحبوا نفس الطعم!" → الصواب هو M:N!
دايماً اسأل من الاتجاهين الاتنين قبل ما تحدد الـ Cardinality.
Participation Constraints — الـ Minimum
Total vs. Partial — Mandatory vs. Optional
كل entity instance لازم يكون موجود في الـ relationship. مش مسموح يكون entity بدون علاقة.
بعض entity instances ممكن ما يكونوش في الـ relationship. مسموح entity يكون بدون علاقة.
| نتيجة الـ Natural Join | المعنى |
|---|---|
| النتيجة = 0 records | الـ Relationship Optional من الجانبين (Partial/Partial) |
| النتيجة ≥ Min(|T1|, |T2|) | على الأقل جانب واحد Total (Mandatory) |
| النتيجة دايماً ≥ |T2| | T2 لديها Total Participation — كل record في T2 ليه match |
| النتيجة = |T1| × |T2| | Cross Join behavior — M:N وكل entity بترتبط بكل حاجة |
-- |T1| = 100, |T2| = 100 -- Natural Join نتيجته 10,000 = 100 × 100 -- → Cross Join behavior → الـ Relationship Optional على الجانبين (M:N) -- "never less than 100 records" -- → On at least one side the participation is Total (Mandatory)
Weak Entities — الـ Entity الضعيفة
entity مش قادرة تتعرف عن نفسها لوحدها
الـ Weak Entity هو entity مالوش Key attribute خاص بيه. بيحتاج entity تاني (الـ Owner) عشان يتعرف.
عندنا اتنين بنات اسمهم "سارة" في قاعدة البيانات:
• سارة بنت أحمد (SSN: 123)
• سارة بنت محمد (SSN: 456)
الاسم "سارة" وحده مش كافي — محتاجين SSN الأب عشان نفرقهم!
- Double Rectangle → الـ Weak Entity
- Double Diamond → الـ Identifying Relationship
- Partial Key → بيتبين بـ dashed underline
- Full ID = Owner's PK + Partial Key
- Total Participation → دايماً لازم يكون معاه Owner
الـ Weak Entity ليه Attributes خاصة بيه زي (Name, Sex, BirthDate). الفرق إنه مش عنده Key كافي لوحده — بيحتاج Owner's PK + Partial Key لتحديد الـ record.
Min/Max Notation — الطريقة البديلة
بدل 1:N نقول (min, max) على كل جانب
• min = 0 → Optional (Partial)
• min ≥ 1 → Mandatory (Total)
• max = 1 → يرتبط بـ entity واحدة كحد أقصى
• max = N → يرتبط بـ entities كتير
EMPLOYEE (0,1) ──[MANAGES]── (1,1) DEPARTMENT موظف ممكن يدير 0 أو 1 قسم القسم لازم يبقى ليه مدير واحد بالظبط EMPLOYEE (1,1) ──[WORKS_FOR]── (1,N) DEPARTMENT موظف يشتغل في قسم واحد بالظبط القسم ممكن يبقى فيه موظف واحد أو أكتر
Company ERD الكامل
المثال المرجعي للمنهج كله — ادرسه كويس!
| Entity | Attributes | Key |
|---|---|---|
| EMPLOYEE | Name(Fname, Minit, Lname), Ssn, Bdate, Address, Sex, Salary | Ssn |
| DEPARTMENT | Dname, Dnumber, {Locations}, Num_Employees(derived) | Dnumber |
| PROJECT | Pname, Pnumber, Plocation | Pnumber |
| DEPENDENT (Weak) | Dep_Name(partial), Sex, BDate, Relationship | Essn + Dep_Name |
| Relationship | بين | Cardinality | Participation | Attributes |
|---|---|---|---|---|
| WORKS_FOR | EMPLOYEE — DEPARTMENT | N:1 | Employee: Total | Dept: Partial | — |
| MANAGES | EMPLOYEE — DEPARTMENT | 1:1 | Employee: Partial | Dept: Total | Start_Date |
| CONTROLS | DEPARTMENT — PROJECT | 1:N | Project: Total | — |
| WORKS_ON | EMPLOYEE — PROJECT | M:N | Both: Total | Hours |
| SUPERVISION | EMPLOYEE — EMPLOYEE | 1:N (recursive) | Both: Partial | — |
| DEPENDENTS_OF | EMPLOYEE — DEPENDENT | 1:N (identifying) | Dependent: Total | — |
Design Tips & Common Mistakes
أكتر الأخطاء الشائعة في التصميم — من المحاضرة مباشرة
EMPLOYEE makes → SALARY (Entity). الـ Salary مش محتاج حياة مستقلة.
EMPLOYEE (Salary). لو الحاجة مش محتاجة Relationships أو Properties — خلّيها Attribute.
EMPLOYEE (deptno) works_for DEPT(deptno). الـ deptno في الـ Employee هو FK وده concept رلائشنال مش ERD.
الـ WORKS_FOR relationship بيعبر عن الارتباط — مش محتاج تضيف FK attribute في الـ ERD.
"Person يحب Ice Cream Flavors كتير" → مش 1:M. فكّر: كتير من الناس بيحبوا نفس الطعم → M:N!
اسأل "كم entity في الجانب الآخر يمكن يرتبط بـ entity واحدة هنا؟" — الاتجاهين الاتنين!
EMPLOYEE (assignments: projname, role, hrs). ده معقد جداً كـ attribute.
WORKS_ON relationship مع Hours attribute — أو ASSIGNMENT entity لو محتاجين تفاصيل أكتر.
Quiz 1 — ER Model Concepts
أسئلة حقيقية من امتحانات 2023 و2024 و2025 — اختبر نفسك!
ER→Relational Mapping — المقدمة
7 خطوات منظمة لتحويل الـ ERD لـ Tables حقيقية
1. كل Entity → جدول جديد
2. علاقات 1:1 و1:N → Foreign Key في جدول موجود
3. علاقات M:N → جدول جديد
4. الـ Multivalued Attribute → جدول جديد
5. الـ Derived Attribute → مش بيتخزن خالص
| Step | بيتعامل مع | الناتج |
|---|---|---|
| 1 | Strong Entity | جدول جديد |
| 2 | Weak Entity | جدول + FK من Owner |
| 3 | Binary 1:1 | FK في الـ total participation side |
| 4 | Binary 1:N | FK في الـ N-side |
| 5 | Binary M:N | جدول جديد + 2 FKs |
| 6 | Multivalued Attr | جدول جديد + FK |
| 7 | N-ary Relationship | جدول جديد + N FKs |
Step 1: Strong Entity Types
أبسط خطوة — كل strong entity يبقى جدول
لكل Strong Entity في الـ ERD، بنعمل جدول (Relation) يشمل:
- كل الـ Simple Attributes مباشرة
- الـ Composite Attribute → بنحط أجزاءه البسيطة بس (مش الـ composite نفسه!)
- الـ Derived Attributes → مش بنخزنهم!
- الـ {Multivalued Attributes} → هنتعامل معاهم في Step 6
- بنختار واحد من الـ Key Attributes كـ Primary Key
-- EMPLOYEE entity: Name(Fname,Minit,Lname) composite → break into parts EMPLOYEE (Ssn, Fname, Minit, Lname, Bdate, Address, Sex, Salary) ↑ PK ↑ composite Name broken into 3 parts -- NOT included: Age (derived), Name itself (composite) DEPARTMENT (Dnumber, Dname) ↑ PK -- NOT included: Locations (multivalued→Step 6), Num_Employees (derived) PROJECT (Pnumber, Pname, Plocation)
Step 2: Weak Entity Types
بياخد مفتاح صاحبه كـ FK
لكل Weak Entity W بصاحب E، بنعمل جدول يشمل:
- كل الـ Simple Attributes بتاعة W
- الـ Primary Key بتاع الـ Owner Entity كـ Foreign Key
- الـ Primary Key للجدول الجديد = Owner's PK + Partial Key
DEPENDENT (Essn, Dependent_Name, Sex, Bdate, Relationship) ↑ FK → EMPLOYEE.Ssn ↑ Partial Key ↑──── Combined PK ─────↑ -- Sara w/ Essn=123 ≠ Sara w/ Essn=456 (different employees!) -- FK with CASCADE DELETE → لو الموظف اتحذف، dependents بتتحذف معاه
Step 3: Binary 1:1 Relationships
الـ FK بيروح للـ Total Participation side
بنختار من الـ entities اللي بتشارك في الـ 1:1 — الأفضل نختار الـ entity اللي عندها Total Participation — وبنضيف:
- الـ Primary Key بتاع الـ entity التانية كـ Foreign Key
- أي Relationship Attributes بتاعة الـ 1:1 relationship
-- DEPARTMENT has TOTAL participation in MANAGES -- (كل قسم لازم يبقى ليه مدير) -- So FK goes into DEPARTMENT table DEPARTMENT (Dnumber, Dname, Mgr_Ssn, Mgr_Start_Date) ↑ FK → EMPLOYEE.Ssn ↑ Relationship attribute of MANAGES
Step 4: Binary 1:N Relationships
الـ FK بيروح للـ N-side دايماً
أسهل rule في الـ mapping: الـ FK بيروح للـ entity اللي على الـ N-side دايماً.
-- WORKS_FOR (N:1) — Employee → Department -- EMPLOYEE is on N-side → FK goes into EMPLOYEE EMPLOYEE (Ssn, ..., Super_Ssn, Dno) ↑ FK → EMPLOYEE.Ssn (SUPERVISION recursive!) ↑ FK → DEPARTMENT.Dnumber (WORKS_FOR) -- CONTROLS (1:N) — Department controls Projects -- PROJECT is on N-side → FK goes into PROJECT PROJECT (Pnumber, Pname, Plocation, Dnum) ↑ FK → DEPARTMENT.Dnumber
Step 5: Binary M:N Relationships
لازم جدول جديد — مفيش FK مباشر!
علاقات M:N مينفعش نحط FK في أي من الجدولين — لازم جدول جديد (Junction Table):
- الجدول الجديد بيشمل الـ Primary Keys لكل الجدولين كـ Foreign Keys
- الـ Primary Key بتاع الجدول الجديد = (FK1 + FK2) composite
- أي Relationship Attributes بتتضاف هنا
-- Can't put FK in EMPLOYEE (one employee → many projects) -- Can't put FK in PROJECT (one project → many employees) -- Solution: Create WORKS_ON junction table! WORKS_ON (Essn, Pno, Hours) ↑ FK → EMPLOYEE.Ssn ↑ FK → PROJECT.Pnumber ↑─────── Composite PK ─────↑ ↑ Relationship Attribute
في علاقة M:N بين Person وExam — الإجابة الغلط هي
Exam(ExamID, NID, ExamName) — لأنك حطيت الـ FK مباشرة في الـ Exam table، وده بيعمل 1:N مش M:N!الصح هو جدول جديد:
Qualification(NID, ExamID, QualifiedDate)Step 6: Multivalued Attributes
كل {Multivalued} بيبقى جدول جديد
الـ Multivalued Attributes مش ممكن تتخزن في column واحد — لازم جدول جديد:
-- {Locations} is multivalued → Create DEPT_LOCATIONS table DEPT_LOCATIONS (Dnumber, Dlocation) ↑ FK → DEPARTMENT.Dnumber ↑────── Composite PK ───↑ -- Data example: -- (5, 'Houston'), (5, 'Bellaire'), (5, 'Sugarland') — all for Dept 5 -- (4, 'Stafford') — for Dept 4
Step 7: N-ary Relationship Types
ثلاث entities أو أكتر → جدول جديد
نفس منطق M:N بس بنوسّعه لـ N entities:
SUPPLY (Sname, Proj_name, Part_no, Quantity) ↑ FK→SUPPLIER ↑ FK→PROJECT ↑ FK→PART ↑──────────── Composite PK (all 3) ─────↑
ENROLLED (StudId, CourseId, SemId, Grade) ↑─────── Composite PK (all 3 FKs) ────↑
الـ Schema الكاملة — Company Database
نتيجة تطبيق الـ 7 خطوات على الـ Company ERD
-- Step 1: Strong Entities EMPLOYEE (Ssn, Fname, Minit, Lname, Bdate, Address, Sex, Salary, Super_Ssn, Dno) DEPARTMENT (Dnumber, Dname, Mgr_Ssn, Mgr_Start_Date) PROJECT (Pnumber, Pname, Plocation, Dnum) -- Step 2: Weak Entity DEPENDENT (Essn, Dependent_Name, Sex, Bdate, Relationship) -- Step 3: 1:1 → FK in DEPARTMENT (total participation) Mgr_Ssn + Mgr_Start_Date already in DEPARTMENT above -- Step 4: 1:N → FKs on N-side Super_Ssn in EMPLOYEE (SUPERVISION recursive) Dno in EMPLOYEE (WORKS_FOR) Dnum in PROJECT (CONTROLS) -- Step 5: M:N → New junction table WORKS_ON (Essn, Pno, Hours) -- Step 6: Multivalued attribute DEPT_LOCATIONS (Dnumber, Dlocation) ──────────────────────────────────────────── -- Foreign Key References: EMPLOYEE.Super_Ssn → EMPLOYEE.Ssn EMPLOYEE.Dno → DEPARTMENT.Dnumber DEPARTMENT.Mgr_Ssn → EMPLOYEE.Ssn PROJECT.Dnum → DEPARTMENT.Dnumber WORKS_ON.Essn → EMPLOYEE.Ssn WORKS_ON.Pno → PROJECT.Pnumber DEPENDENT.Essn → EMPLOYEE.Ssn DEPT_LOCATIONS.Dnumber → DEPARTMENT.Dnumber
Summary Table — ER ↔ Relational
المقارنة الكاملة بين الـ ER Model والـ Relational Model
| ER MODEL | RELATIONAL MODEL | جدول جديد؟ | الـ PK |
|---|---|---|---|
| Strong Entity Type | Entity Relation | ✅ Yes | Key Attribute |
| Weak Entity Type | Entity Relation + FK from Owner | ✅ Yes | Owner PK + Partial Key |
| 1:1 Relationship | FK (في الـ total side) | ❌ No | — |
| 1:N Relationship | FK (في الـ N-side) | ❌ No | — |
| M:N Relationship | Junction Table + 2 FKs | ✅ Yes | (FK1, FK2) |
| {Multivalued Attr} | New Table + FK to owner | ✅ Yes | (Attr, FK) |
| N-ary Relationship | New Table + N FKs | ✅ Yes | All N FKs |
| Simple Attribute | Column | ❌ No | — |
| Composite Attribute | مكوناته البسيطة فقط | ❌ No | — |
| Derived Attribute | مش بيتخزن | ❌ No | — |
Quiz 2 — ER to Relational Mapping
أسئلة من امتحانات 2023 و2024 و2025 على الـ Mapping — الأصعب!
Doctor: DOC_NO, QUALIFICATION, PH_NO, D_NAME (4)
Regular: SALARY (1)
On Call: FS_PR_CL, PYMT_DU (2)
Type columns: is_Regular, is_OnCall (2)
Total = 4 + 1 + 2 + 2 = 9 columns
Cheat Sheet — المرجع السريع
كل حاجة مهمة في صفحة واحدة — ذاكر ده قبل الامتحان!