Skip to content

Instantly share code, notes, and snippets.

@muath-ye
Last active January 14, 2025 11:06
Show Gist options
  • Save muath-ye/9d20303e90990d1209f1ca9730bab520 to your computer and use it in GitHub Desktop.
Save muath-ye/9d20303e90990d1209f1ca9730bab520 to your computer and use it in GitHub Desktop.
الطلاب والجامعة

الجداول الرئيسية والعلاقات بينها مع مراعاة صلاحيات المستخدمين المختلفة (الطلاب، الدكاترة، والعمادة).

تصميم قاعدة البيانات

1. الجداول الرئيسية

جدول المستخدمين (users)

يحتوي على معلومات عامة عن جميع المستخدمين في النظام (طلاب، دكاترة، عمادة).

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    role ENUM('student', 'teacher', 'admin') NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

جدول الطلاب (students)

يحتوي على معلومات إضافية خاصة بالطلاب.

CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    enrollment_date DATE,
    major VARCHAR(100),
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);

جدول الدكاترة (teachers)

يحتوي على معلومات إضافية خاصة بالدكاترة.

CREATE TABLE teachers (
    teacher_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    department VARCHAR(100),
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);

جدول العمادة (admins)

يحتوي على معلومات إضافية خاصة بالعمادة.

CREATE TABLE admins (
    admin_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);

جدول المواد الدراسية (courses)

يحتوي على معلومات عن المواد الدراسية.

CREATE TABLE courses (
    course_id INT AUTO_INCREMENT PRIMARY KEY,
    course_code VARCHAR(20) NOT NULL UNIQUE,
    course_name VARCHAR(100) NOT NULL,
    description TEXT,
    credit_hours INT NOT NULL,
    teacher_id INT,
    FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id) ON DELETE SET NULL
);

جدول تسجيل الطلاب في المواد (enrollments)

يربط بين الطلاب والمواد الدراسية.

CREATE TABLE enrollments (
    enrollment_id INT AUTO_INCREMENT PRIMARY KEY,
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    enrollment_date DATE DEFAULT CURRENT_DATE,
    status ENUM('enrolled', 'dropped') DEFAULT 'enrolled',
    FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE
);

جدول الجداول الدراسية (schedules)

يحتوي على معلومات عن الجدول الدراسي لكل مادة.

CREATE TABLE schedules (
    schedule_id INT AUTO_INCREMENT PRIMARY KEY,
    course_id INT NOT NULL,
    day_of_week ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    location VARCHAR(100),
    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE
);

جدول النتائج (grades)

يحتوي على درجات الطلاب في المواد الدراسية.

CREATE TABLE grades (
    grade_id INT AUTO_INCREMENT PRIMARY KEY,
    enrollment_id INT NOT NULL,
    exam_type ENUM('midterm', 'final', 'assignment') NOT NULL,
    grade DECIMAL(5,2) NOT NULL,
    FOREIGN KEY (enrollment_id) REFERENCES enrollments(enrollment_id) ON DELETE CASCADE
);

جدول الإشعارات (notifications)

يحتوي على الإشعارات المرسلة من العمادة أو الدكاترة.

CREATE TABLE notifications (
    notification_id INT AUTO_INCREMENT PRIMARY KEY,
    sender_id INT NOT NULL,
    recipient_role ENUM('student', 'teacher', 'admin', 'all') NOT NULL,
    title VARCHAR(255) NOT NULL,
    message TEXT NOT NULL,
    sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sender_id) REFERENCES users(user_id) ON DELETE CASCADE
);

جدول الرسائل (messages)

يحتوي على الرسائل بين الطلاب والعمادة أو الدكاترة.

CREATE TABLE messages (
    message_id INT AUTO_INCREMENT PRIMARY KEY,
    sender_id INT NOT NULL,
    receiver_id INT NOT NULL,
    subject VARCHAR(255),
    body TEXT NOT NULL,
    sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sender_id) REFERENCES users(user_id) ON DELETE CASCADE,
    FOREIGN KEY (receiver_id) REFERENCES users(user_id) ON DELETE CASCADE
);

جدول الملفات الدراسية (academic_files)

يحتوي على الملفات والموارد الأكاديمية المتاحة للطلاب.

CREATE TABLE academic_files (
    file_id INT AUTO_INCREMENT PRIMARY KEY,
    uploader_id INT,
    file_name VARCHAR(255) NOT NULL,
    file_path VARCHAR(500) NOT NULL,
    uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (uploader_id) REFERENCES users(user_id) ON DELETE SET NULL
);

جدول الاستفسارات والشكاوى (inquiries)

يحتوي على استفسارات وشكاوى الطلاب.

CREATE TABLE inquiries (
    inquiry_id INT AUTO_INCREMENT PRIMARY KEY,
    student_id INT NOT NULL,
    subject VARCHAR(255) NOT NULL,
    message TEXT NOT NULL,
    status ENUM('pending', 'answered', 'closed') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL,
    FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE
);

جدول التقارير (reports)

يحتوي على التقارير الأكاديمية والإدارية التي تولدها العمادة.

CREATE TABLE reports (
    report_id INT AUTO_INCREMENT PRIMARY KEY,
    admin_id INT,
    report_type ENUM('academic', 'administrative') NOT NULL,
    content TEXT NOT NULL,
    generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (admin_id) REFERENCES admins(admin_id) ON DELETE SET NULL
);

2. العلاقات بين الجداول

  • المستخدمون (users) مرتبطون بالطلاب (students)، الدكاترة (teachers)، والعمادة (admins) بناءً على الدور (role).
  • الطلاب يمكنهم التسجيل في المواد الدراسية من خلال جدول التسجيلات (enrollments).
  • الدكاترة يمكنهم إدارة المقررات الدراسية وإدخال الدرجات.
  • العمادة تدير حسابات المستخدمين، الجداول الدراسية، النتائج، وتوليد التقارير.
  • الإشعارات يمكن أن تكون موجهة لمجموعات معينة من المستخدمين أو للجميع.
  • الرسائل تتيح التواصل المباشر بين المستخدمين المختلفين.
  • الملفات الدراسية يمكن للعمادة أو الدكاترة تحميلها ليتمكن الطلاب من الوصول إليها.
  • الاستفسارات والشكاوى تتيح للطلاب التواصل مع العمادة بشأن المسائل الأكاديمية أو الإدارية.
  • التقارير توفر للعمادة معلومات حول التفاعل الأكاديمي والإداري.

3. مثال على بعض العمليات

تسجيل مستخدم جديد (طالب)

-- إضافة المستخدم في جدول users
INSERT INTO users (username, password, email, role) 
VALUES ('student_username', 'hashed_password', '[email protected]', 'student');

-- الحصول على user_id الأخير
SET @last_user_id = LAST_INSERT_ID();

-- إضافة الطالب في جدول students
INSERT INTO students (user_id, first_name, last_name, enrollment_date, major)
VALUES (@last_user_id, 'اسم الطالب', 'اللقب', '2024-09-01', 'القسم');

إضافة مادة دراسية جديدة من قبل عمادة

INSERT INTO courses (course_code, course_name, description, credit_hours, teacher_id)
VALUES ('CS101', 'مقدمة في علوم الحاسوب', 'وصف المادة...', 3, NULL);

تسجيل طالب في مادة

INSERT INTO enrollments (student_id, course_id, enrollment_date)
VALUES (1, 1, CURDATE());

إضافة نتيجة امتحان

INSERT INTO grades (enrollment_id, exam_type, grade)
VALUES (1, 'final', 85.50);
@muath-ye
Copy link
Author

هذه مجموعة شاملة من استعلامات MySQL التي تلبي جميع المتطلبات الوظيفية للنظام الخاص بإدارة التعلم الجامعي.
رح تفيدكم في اثناء برمجة النظام
الاستعلامات مرتبة بحسب الجداول الرئيسية والوظائف المرتبطة بها، مع مراعاة صلاحيات المستخدمين المختلفة (الطلاب، الدكاترة، والعمادة).

1. جدول المستخدمين (users)

إضافة مستخدم جديد

-- إضافة مستخدم جديد
INSERT INTO users (username, password, email, role)
VALUES ('username_example', 'hashed_password', '[email protected]', 'student');

تحديث معلومات المستخدم

-- تحديث معلومات المستخدم
UPDATE users
SET email = '[email protected]', password = 'new_hashed_password'
WHERE user_id = 1;

حذف مستخدم

-- حذف مستخدم
DELETE FROM users
WHERE user_id = 1;

عرض معلومات المستخدم

-- عرض معلومات مستخدم معين
SELECT * FROM users
WHERE user_id = 1;

-- عرض جميع المستخدمين حسب الدور
SELECT * FROM users
WHERE role = 'student';

2. جدول الطلاب (students)

إضافة طالب جديد

-- إضافة طالب جديد بعد إضافة المستخدم في جدول users
INSERT INTO students (user_id, first_name, last_name, enrollment_date, major)
VALUES (LAST_INSERT_ID(), 'اسم الطالب', 'اللقب', '2024-09-01', 'القسم');

تحديث معلومات الطالب

-- تحديث معلومات الطالب
UPDATE students
SET first_name = 'اسم جديد', last_name = 'لقب جديد', major = 'قسم جديد'
WHERE student_id = 1;

حذف طالب

-- حذف طالب
DELETE FROM students
WHERE student_id = 1;

عرض معلومات الطالب

-- عرض معلومات طالب معين
SELECT s.*, u.username, u.email
FROM students s
JOIN users u ON s.user_id = u.user_id
WHERE s.student_id = 1;

-- عرض جميع الطلاب
SELECT s.*, u.username, u.email
FROM students s
JOIN users u ON s.user_id = u.user_id;

3. جدول الدكاترة (teachers)

إضافة دكتور جديد

-- إضافة دكتور جديد بعد إضافة المستخدم في جدول users
INSERT INTO teachers (user_id, first_name, last_name, department)
VALUES (LAST_INSERT_ID(), 'اسم الدكتور', 'اللقب', 'القسم');

تحديث معلومات الدكتور

-- تحديث معلومات الدكتور
UPDATE teachers
SET first_name = 'اسم جديد', last_name = 'لقب جديد', department = 'قسم جديد'
WHERE teacher_id = 1;

حذف دكتور

-- حذف دكتور
DELETE FROM teachers
WHERE teacher_id = 1;

عرض معلومات الدكتور

-- عرض معلومات دكتور معين
SELECT t.*, u.username, u.email
FROM teachers t
JOIN users u ON t.user_id = u.user_id
WHERE t.teacher_id = 1;

-- عرض جميع الدكاترة
SELECT t.*, u.username, u.email
FROM teachers t
JOIN users u ON t.user_id = u.user_id;

4. جدول العمادة (admins)

إضافة عميد جديد

-- إضافة عميد جديد بعد إضافة المستخدم في جدول users
INSERT INTO admins (user_id, first_name, last_name)
VALUES (LAST_INSERT_ID(), 'اسم العميد', 'اللقب');

تحديث معلومات العميد

-- تحديث معلومات العميد
UPDATE admins
SET first_name = 'اسم جديد', last_name = 'لقب جديد'
WHERE admin_id = 1;

حذف عميد

-- حذف عميد
DELETE FROM admins
WHERE admin_id = 1;

عرض معلومات العميد

-- عرض معلومات عميد معين
SELECT a.*, u.username, u.email
FROM admins a
JOIN users u ON a.user_id = u.user_id
WHERE a.admin_id = 1;

-- عرض جميع العمادة
SELECT a.*, u.username, u.email
FROM admins a
JOIN users u ON a.user_id = u.user_id;

5. جدول المواد الدراسية (courses)

إضافة مادة دراسية جديدة

-- إضافة مادة دراسية جديدة
INSERT INTO courses (course_code, course_name, description, credit_hours, teacher_id)
VALUES ('CS101', 'مقدمة في علوم الحاسوب', 'وصف المادة...', 3, 1);

تحديث معلومات المادة الدراسية

-- تحديث معلومات المادة الدراسية
UPDATE courses
SET course_name = 'اسم جديد للمادة', description = 'وصف جديد...', credit_hours = 4, teacher_id = 2
WHERE course_id = 1;

حذف مادة دراسية

-- حذف مادة دراسية
DELETE FROM courses
WHERE course_id = 1;

عرض معلومات المادة الدراسية

-- عرض معلومات مادة دراسية معينة
SELECT * FROM courses
WHERE course_id = 1;

-- عرض جميع المواد الدراسية
SELECT c.*, t.first_name, t.last_name
FROM courses c
LEFT JOIN teachers t ON c.teacher_id = t.teacher_id;

6. جدول تسجيل الطلاب في المواد (enrollments)

تسجيل طالب في مادة

-- تسجيل طالب في مادة
INSERT INTO enrollments (student_id, course_id, enrollment_date, status)
VALUES (1, 1, CURDATE(), 'enrolled');

تحديث حالة التسجيل

-- تحديث حالة التسجيل (مثل إسقاط مادة)
UPDATE enrollments
SET status = 'dropped'
WHERE enrollment_id = 1;

حذف تسجيل طالب من مادة

-- حذف تسجيل طالب من مادة
DELETE FROM enrollments
WHERE enrollment_id = 1;

عرض تسجيلات الطلاب

-- عرض تسجيلات طالب معين
SELECT e.*, c.course_name
FROM enrollments e
JOIN courses c ON e.course_id = c.course_id
WHERE e.student_id = 1;

-- عرض جميع التسجيلات
SELECT e.*, s.first_name, s.last_name, c.course_name
FROM enrollments e
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id;

7. جدول الجداول الدراسية (schedules)

إضافة جدول دراسي

-- إضافة جدول دراسي
INSERT INTO schedules (course_id, day_of_week, start_time, end_time, location)
VALUES (1, 'Monday', '09:00:00', '11:00:00', 'قاعة 101');

تحديث جدول دراسي

-- تحديث جدول دراسي
UPDATE schedules
SET day_of_week = 'Tuesday', start_time = '10:00:00', end_time = '12:00:00', location = 'قاعة 102'
WHERE schedule_id = 1;

حذف جدول دراسي

-- حذف جدول دراسي
DELETE FROM schedules
WHERE schedule_id = 1;

عرض الجداول الدراسية

-- عرض جدول دراسي معين
SELECT * FROM schedules
WHERE schedule_id = 1;

-- عرض جميع الجداول الدراسية لمادة معينة
SELECT * FROM schedules
WHERE course_id = 1;

-- عرض جميع الجداول الدراسية
SELECT s.*, c.course_name
FROM schedules s
JOIN courses c ON s.course_id = c.course_id;

8. جدول النتائج (grades)

إضافة نتيجة امتحان

-- إضافة نتيجة امتحان
INSERT INTO grades (enrollment_id, exam_type, grade)
VALUES (1, 'final', 85.50);

تحديث نتيجة امتحان

-- تحديث نتيجة امتحان
UPDATE grades
SET grade = 90.00
WHERE grade_id = 1;

حذف نتيجة امتحان

-- حذف نتيجة امتحان
DELETE FROM grades
WHERE grade_id = 1;

عرض نتائج الطلاب

-- عرض نتائج طالب معين
SELECT g.*, c.course_name
FROM grades g
JOIN enrollments e ON g.enrollment_id = e.enrollment_id
JOIN courses c ON e.course_id = c.course_id
WHERE e.student_id = 1;

-- عرض جميع النتائج
SELECT g.*, s.first_name, s.last_name, c.course_name
FROM grades g
JOIN enrollments e ON g.enrollment_id = e.enrollment_id
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id;

9. جدول الإشعارات (notifications)

إضافة إشعار جديد

-- إضافة إشعار جديد
INSERT INTO notifications (sender_id, recipient_role, title, message)
VALUES (3, 'all', 'إعلان هام', 'هذا هو محتوى الإعلان.');

تحديث إشعار

-- تحديث إشعار
UPDATE notifications
SET title = 'عنوان جديد للإشعار', message = 'محتوى جديد للإشعار.'
WHERE notification_id = 1;

حذف إشعار

-- حذف إشعار
DELETE FROM notifications
WHERE notification_id = 1;

عرض الإشعارات

-- عرض إشعارات لمستخدم معين بناءً على دوره
SELECT * FROM notifications
WHERE recipient_role = 'all' OR recipient_role = (SELECT role FROM users WHERE user_id = 1)
ORDER BY sent_at DESC;

-- عرض جميع الإشعارات
SELECT n.*, u.username AS sender_username
FROM notifications n
JOIN users u ON n.sender_id = u.user_id
ORDER BY n.sent_at DESC;

10. جدول الرسائل (messages)

إرسال رسالة جديدة

-- إرسال رسالة جديدة
INSERT INTO messages (sender_id, receiver_id, subject, body)
VALUES (1, 3, 'استفسار حول مادة CS101', 'مرحبا، لدي سؤال حول المادة...');

تحديث رسالة

-- تحديث رسالة (عادة لا يتم السماح بتعديل الرسائل، ولكن إذا كان ضرورياً:
UPDATE messages
SET subject = 'موضوع جديد', body = 'محتوى جديد للرسالة.'
WHERE message_id = 1;

حذف رسالة

-- حذف رسالة
DELETE FROM messages
WHERE message_id = 1;

عرض الرسائل

-- عرض الرسائل المرسلة من قبل مستخدم معين
SELECT * FROM messages
WHERE sender_id = 1;

-- عرض الرسائل المستلمة لمستخدم معين
SELECT * FROM messages
WHERE receiver_id = 1;

-- عرض جميع الرسائل مع معلومات المرسل والمستقبل
SELECT m.*, 
       sender.username AS sender_username, 
       receiver.username AS receiver_username
FROM messages m
JOIN users sender ON m.sender_id = sender.user_id
JOIN users receiver ON m.receiver_id = receiver.user_id
WHERE m.receiver_id = 1
ORDER BY m.sent_at DESC;

11. جدول الملفات الدراسية (academic_files)

تحميل ملف دراسي

-- تحميل ملف دراسي
INSERT INTO academic_files (uploader_id, file_name, file_path)
VALUES (3, 'Lecture1.pdf', '/uploads/lecture1.pdf');

تحديث معلومات الملف

-- تحديث معلومات الملف
UPDATE academic_files
SET file_name = 'Lecture1_updated.pdf', file_path = '/uploads/lecture1_updated.pdf'
WHERE file_id = 1;

حذف ملف دراسي

-- حذف ملف دراسي
DELETE FROM academic_files
WHERE file_id = 1;

عرض الملفات الدراسية

-- عرض جميع الملفات الدراسية
SELECT af.*, u.username AS uploader_username
FROM academic_files af
JOIN users u ON af.uploader_id = u.user_id
ORDER BY af.uploaded_at DESC;

-- عرض ملفات دراسية معينة لمادة معينة (إذا تم ربط الملفات بالمقررات)
-- يجب إضافة عمود course_id إلى جدول academic_files إذا كان هناك ربط

12. جدول الاستفسارات والشكاوى (inquiries)

تقديم استفسار أو شكوى جديدة

-- تقديم استفسار أو شكوى جديدة
INSERT INTO inquiries (student_id, subject, message)
VALUES (1, 'استفسار حول تسجيل المقررات', 'لدي سؤال حول كيفية تسجيل مقررات جديدة.');

تحديث حالة الاستفسار أو الشكوى

-- تحديث حالة الاستفسار أو الشكوى
UPDATE inquiries
SET status = 'answered', updated_at = NOW()
WHERE inquiry_id = 1;

حذف استفسار أو شكوى

-- حذف استفسار أو شكوى
DELETE FROM inquiries
WHERE inquiry_id = 1;

عرض الاستفسارات والشكاوى

-- عرض استفسارات وشكاوى طالب معين
SELECT * FROM inquiries
WHERE student_id = 1;

-- عرض جميع الاستفسارات والشكاوى
SELECT i.*, s.first_name, s.last_name
FROM inquiries i
JOIN students s ON i.student_id = s.student_id
ORDER BY i.created_at DESC;

13. جدول التقارير (reports)

توليد تقرير جديد

-- توليد تقرير جديد
INSERT INTO reports (admin_id, report_type, content)
VALUES (1, 'academic', 'محتوى التقرير الأكاديمي...');

تحديث تقرير

-- تحديث تقرير
UPDATE reports
SET report_type = 'administrative', content = 'محتوى تقرير إداري جديد...'
WHERE report_id = 1;

حذف تقرير

-- حذف تقرير
DELETE FROM reports
WHERE report_id = 1;

عرض التقارير

-- عرض تقارير عميد معين
SELECT * FROM reports
WHERE admin_id = 1;

-- عرض جميع التقارير
SELECT r.*, a.first_name AS admin_first_name, a.last_name AS admin_last_name
FROM reports r
JOIN admins a ON r.admin_id = a.admin_id
ORDER BY r.generated_at DESC;

14. استعلامات إضافية حسب المتطلبات الوظيفية

تسجيل الدخول والتحقق من بيانات المستخدم

-- التحقق من بيانات تسجيل الدخول
SELECT user_id, username, role FROM users
WHERE username = 'username_example' AND password = 'hashed_password';

ملاحظة: يجب أن تتم معالجة التحقق من كلمات المرور على مستوى التطبيق باستخدام تقنيات مثل bcrypt لمقارنة التجزئة بشكل آمن.

عرض الجدول الدراسي للطالب

-- عرض الجدول الدراسي للطالب
SELECT c.course_name, s.day_of_week, s.start_time, s.end_time, s.location
FROM enrollments e
JOIN courses c ON e.course_id = c.course_id
JOIN schedules s ON c.course_id = s.course_id
WHERE e.student_id = 1 AND e.status = 'enrolled'
ORDER BY s.day_of_week, s.start_time;

التواصل مع العمادة (إرسال رسالة)

-- إرسال رسالة إلى العمادة
INSERT INTO messages (sender_id, receiver_id, subject, body)
VALUES (1, (SELECT user_id FROM admins WHERE admin_id = 1), 'موضوع الرسالة', 'محتوى الرسالة...');

الاطلاع على نتائج الامتحانات

-- عرض نتائج الامتحانات للطالب
SELECT c.course_name, g.exam_type, g.grade
FROM grades g
JOIN enrollments e ON g.enrollment_id = e.enrollment_id
JOIN courses c ON e.course_id = c.course_id
WHERE e.student_id = 1;

إدارة المواد الدراسية (للدكاترة والعمادة)

الدكاترة: إضافة/تعديل/حذف المقررات التي يدرسونها

-- إضافة مقرر دراسي (الدكتور يدرسه)
INSERT INTO courses (course_code, course_name, description, credit_hours, teacher_id)
VALUES ('CS102', 'برمجة متقدمة', 'وصف المادة...', 4, 2);

-- تحديث مقرر دراسي (الدكتور يقوم بتعديله)
UPDATE courses
SET course_name = 'برمجة متقدمة محدثة', credit_hours = 5
WHERE course_id = 2 AND teacher_id = 2;

-- حذف مقرر دراسي (الدكتور يقوم بحذفه)
DELETE FROM courses
WHERE course_id = 2 AND teacher_id = 2;

العمادة: إضافة/تعديل/حذف أي مقرر دراسي

-- إضافة مقرر دراسي (العمادة)
INSERT INTO courses (course_code, course_name, description, credit_hours, teacher_id)
VALUES ('CS103', 'هندسة البرمجيات', 'وصف المادة...', 3, NULL);

-- تحديث مقرر دراسي (العمادة)
UPDATE courses
SET course_name = 'هندسة البرمجيات محدثة', credit_hours = 4
WHERE course_id = 3;

-- حذف مقرر دراسي (العمادة)
DELETE FROM courses
WHERE course_id = 3;

الدكاترة: إضافة درجات الطلاب

-- إضافة درجة لامتحان نهائي لطالب معين في مقرر معين
INSERT INTO grades (enrollment_id, exam_type, grade)
VALUES (
    (SELECT enrollment_id FROM enrollments WHERE student_id = 1 AND course_id = 1),
    'final', 
    88.75
);

الدكاترة: التفاعل مع الطلاب (إرسال إشعارات خاصة بالمقرر)

-- إرسال إشعار خاص بمقرر دراسي إلى طلاب معينين
INSERT INTO notifications (sender_id, recipient_role, title, message)
VALUES (2, 'student', 'تحديث موعد الامتحان', 'تم تأجيل موعد الامتحان النهائي إلى 10 يناير.');

العمادة: إدارة حسابات المستخدمين

-- إضافة مستخدم جديد (طالب، دكتور، عميد)
-- (تم توضيح كيفية إضافة مستخدم في الجداول السابقة)

-- تحديث دور المستخدم
UPDATE users
SET role = 'teacher'
WHERE user_id = 4;

-- حذف مستخدم (سيتم حذف البيانات المرتبطة تلقائيًا بفضل ON DELETE CASCADE)
DELETE FROM users
WHERE user_id = 4;

العمادة: إرسال إشعارات عامة أو لطلاب معينين

-- إرسال إشعار عام لجميع الطلاب
INSERT INTO notifications (sender_id, recipient_role, title, message)
VALUES (1, 'student', 'إعلان عام', 'يرجى ملاحظة التغييرات في الجدول الدراسي.');

-- إرسال إشعار لطلاب قسم معين (قد يتطلب تعديل هيكل قاعدة البيانات لتحديد الأقسام المستهدفة)
-- بدلاً من ذلك، يمكن استخدام دور 'all' إذا كان مناسبًا
INSERT INTO notifications (sender_id, recipient_role, title, message)
VALUES (1, 'all', 'إعلان عام', 'يرجى ملاحظة التغييرات في الجدول الدراسي.');

العمادة: مراجعة والرد على استفسارات الطلاب

-- الرد على استفسار
UPDATE inquiries
SET status = 'answered', message = 'هذا هو الرد على استفسارك.', updated_at = NOW()
WHERE inquiry_id = 1;

العمادة: إدارة الجداول الدراسية

-- إضافة جدول دراسي (تم توضيح سابقًا)
-- تحديث جدول دراسي (تم توضيح سابقًا)
-- حذف جدول دراسي (تم توضيح سابقًا)

العمادة: إدارة نتائج الطلاب

-- إضافة أو تعديل نتائج الامتحانات
-- تم توضيح كيفية إضافة وتحديث النتائج في جدول grades

العمادة: توليد التقارير

-- توليد تقرير أكاديمي أو إداري
INSERT INTO reports (admin_id, report_type, content)
VALUES (1, 'academic', 'تفاصيل التقرير الأكاديمي...');

-- عرض التقارير
SELECT * FROM reports
WHERE report_type = 'academic' AND admin_id = 1;

15. ملاحظات إضافية

الأمان

  • تجزئة كلمات المرور: يجب تجزئة كلمات المرور باستخدام دوال مثل bcrypt قبل تخزينها في قاعدة البيانات. لا تخزن كلمات المرور كنصوص واضحة.

  • التحقق من الصلاحيات: تأكد من أن التطبيق يتحقق من صلاحيات المستخدم قبل تنفيذ أي استعلامات حساسة. على سبيل المثال، يجب أن لا يتمكن الطلاب من تنفيذ استعلامات خاصة بالدكاترة أو العمادة.

الفهارس (Indexes)

لتحسين أداء الاستعلامات، يمكنك إضافة فهارس على الأعمدة التي تستخدم بشكل متكرر في عمليات البحث والربط.

-- إضافة فهرس على عمود username في جدول users
CREATE INDEX idx_users_username ON users(username);

-- إضافة فهرس على عمود email في جدول users
CREATE INDEX idx_users_email ON users(email);

-- إضافة فهرس على عمود course_id في جدول enrollments
CREATE INDEX idx_enrollments_course_id ON enrollments(course_id);

-- إضافة فهرس على عمود student_id في جدول enrollments
CREATE INDEX idx_enrollments_student_id ON enrollments(student_id);

-- إضافة فهرس على عمود sender_id في جدول messages
CREATE INDEX idx_messages_sender_id ON messages(sender_id);

-- إضافة فهرس على عمود receiver_id في جدول messages
CREATE INDEX idx_messages_receiver_id ON messages(receiver_id);

القيود والتحقق من البيانات

استخدم القيود لضمان صحة البيانات المدخلة.

-- التأكد من أن درجة الامتحان بين 0 و 100
ALTER TABLE grades
ADD CONSTRAINT chk_grade CHECK (grade >= 0 AND grade <= 100);

-- التأكد من أن البريد الإلكتروني فريد
ALTER TABLE users
ADD UNIQUE (email);

التعامل مع الأدوار والصلاحيات

يمكن إدارة صلاحيات المستخدمين بناءً على دورهم (role) في التطبيق من خلال واجهة المستخدم والتحقق من الصلاحيات على مستوى التطبيق. في قاعدة البيانات، يمكن استخدام الصلاحيات المستندة إلى المستخدمين إذا كان هناك حاجة لذلك، ولكن عادةً ما يتم إدارة ذلك في طبقة التطبيق.

16. خلاصة

تغطي الاستعلامات المقدمة جميع المتطلبات الوظيفية للنظام الخاص بإدارة التعلم الجامعي، مع مراعاة عمليات الإضافة، التعديل، الحذف، والعرض لكل من الجداول الرئيسية. تأكد من أن التطبيق الذي سيستخدم قاعدة البيانات يتعامل بشكل صحيح مع التحقق من الصلاحيات، الأمان، والتعامل مع الأخطاء لضمان نظام آمن وفعال.

@muath-ye
Copy link
Author

muath-ye commented Jan 12, 2025

lm

@muath-ye
Copy link
Author

db

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment