قاعدة البيانات مهندسة كـ نظام إدارة مدارس متعدد المستأجرين يدعم مدارس متعددة في قاعدة بيانات واحدة مع عزل بيانات كامل. مبنية على PostgreSQL مع Prisma ORM، توفر أساساً قوياً للمؤسسات التعليمية مع الحفاظ على حدود أمان صارمة بين المستأجرين.
تصميم قاعدة البيانات لدينا مُوجَّه بمبادئ أساسية تضمن قابلية التوسع والأمان وسهولة الصيانة:
schoolId يضمن عزل بيانات كامل بين المدارسhogwarts.hogwarts.app)تتبع قاعدة البيانات تصميماً علائقياً شاملاً يلتقط جميع جوانب إدارة المدرسة من البنية التحتية الأساسية إلى العمليات اليومية.
model School {
id String @id @default(cuid())
name String
domain String @unique // مثال: "hogwarts"
logoUrl String?
address String?
phoneNumber String?
email String?
timezone String @default("UTC")
// الاشتراك/الفوترة
planType String @default("basic")
maxStudents Int @default(100)
maxTeachers Int @default(10)
isActive Boolean @default(true)
}// صحيح - دائماً ضمّن schoolId
const students = await prisma.student.findMany({
where: { schoolId: "school_123" }
})
// خطأ - schoolId مفقود (خطر أمني)
const students = await prisma.student.findMany()كل نموذج يحتوي على بيانات عينة واقعية توضح العلاقات وهيكل البيانات.
| المعرف | اسم المدرسة | النطاق | الخطة | الحد الأقصى للطلاب |
|---|---|---|---|---|
sch_001 | Hogwarts | hogwarts | premium | 1000 |
sch_002 | Beauxbatons | beauxbatons | premium | 500 |
sch_003 | Durmstrang | durmstrang | basic | 300 |
| المعرف | معرف المدرسة | الاسم الأول | اسم العائلة | البريد الإلكتروني |
|---|---|---|---|---|
tch_001 | sch_001 | Minerva | McGonagall | m.mcg@hogwarts.edu |
tch_002 | sch_001 | Severus | Snape | s.snape@hogwarts.edu |
| المعرف | معرف المدرسة | الاسم الأول | اسم العائلة | تاريخ الميلاد |
|---|---|---|---|---|
std_001 | sch_001 | Harry | Potter | 1980-07-31 |
std_002 | sch_001 | Hermione | Granger | 1979-09-19 |
يدعم النظام 8 أدوار مستخدم مميزة مع مستويات وصول متفاوتة.
| الدور | الوصف | الوصول للمدرسة |
|---|---|---|
| DEVELOPER | مدير المنصة | جميع المدارس |
| ADMIN | مدير المدرسة | مدرسة واحدة |
| TEACHER | طاقم التدريس | مدرسة واحدة |
| STUDENT | الطلاب المسجلون | مدرسة واحدة |
| GUARDIAN | أولياء أمور الطلاب | مدرسة واحدة |
| ACCOUNTANT | طاقم المالية | مدرسة واحدة |
| STAFF | طاقم المدرسة العام | مدرسة واحدة |
| USER | الدور الافتراضي | مدرسة واحدة |
كل استعلام قاعدة بيانات يجب أن يتضمن schoolId:
// إجراء خادم مع سياق المستأجر
export async function getStudents() {
const schoolId = getSchoolId() // من سياق الوسيطة
return await prisma.student.findMany({
where: { schoolId }
})
}جميع القيود الفريدة تتضمن schoolId:
// المعلمون يمكن أن يكون لهم نفس البريد عبر مدارس مختلفة
@@unique([schoolId, emailAddress])
// الأقسام يمكن أن يكون لها نفس الأسماء عبر المدارس
@@unique([schoolId, departmentName])-- فهارس حرجة لاستعلامات متعددة المستأجرين
CREATE INDEX idx_students_school_id ON students(school_id);
CREATE INDEX idx_teachers_school_id ON teachers(school_id);
CREATE INDEX idx_classes_school_id ON classes(school_id);# إنشاء عميل Prisma
pnpm prisma generate
# إنشاء وتطبيق الترحيلات
pnpm prisma migrate dev --name init
# النشر للإنتاج
pnpm prisma migrate deploy
# بذر البيانات النموذجية
pnpm prisma db seedهذه البنية الشاملة لقاعدة البيانات توفر الأساس لبناء أنظمة إدارة تعليمية قابلة للتوسع وآمنة وغنية بالميزات.
On This Page
المبادئ الأساسيةتصميم قاعدة البياناتاستراتيجية عزل متعدد المستأجرينكيان المستأجر (نموذج المدرسة)مثال عزل البياناتجداول المخططالمدرسة (كيان المستأجر)المعلمالطالبالمصادقة وأدوار المستخدمالأمان وحماية البياناتتصفية المستأجر التلقائيةقيود فريدة مع نطاق المدرسةتحسين الأداءفهارس قاعدة البيانات الموصى بهاأوامر الترحيل