9
Switch language to English

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

السابقالتالي

بنية قاعدة بيانات PostgreSQL متعددة المستأجرين مع Prisma ORM، وأمان على مستوى الصف، وعزل المستأجر القائم على النطاق

قاعدة البيانات مهندسة كـ نظام إدارة مدارس متعدد المستأجرين يدعم مدارس متعددة في قاعدة بيانات واحدة مع عزل بيانات كامل. مبنية على PostgreSQL مع Prisma ORM، توفر أساساً قوياً للمؤسسات التعليمية مع الحفاظ على حدود أمان صارمة بين المستأجرين.

المبادئ الأساسية

تصميم قاعدة البيانات لدينا مُوجَّه بمبادئ أساسية تضمن قابلية التوسع والأمان وسهولة الصيانة:

  • أمان على مستوى الصف – كل نموذج يتضمن حقل schoolId يضمن عزل بيانات كامل بين المدارس
  • بنية مخطط مشتركة – جميع المدارس تستخدم نفس مخطط قاعدة البيانات، مما يحسن استخدام الموارد
  • تعريف المستأجر القائم على النطاق – المدارس تُعرَّف بشكل فريد بالنطاق الفرعي (مثل hogwarts.hogwarts.app)
  • عمليات قاعدة بيانات آمنة النوع – Prisma ORM يوفر أمان نوع من طرف إلى طرف
  • تنظيم مخطط متعدد الملفات – المخطط منظم في نطاقات منطقية لصيانة أفضل

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

تتبع قاعدة البيانات تصميماً علائقياً شاملاً يلتقط جميع جوانب إدارة المدرسة من البنية التحتية الأساسية إلى العمليات اليومية.

مخطط علاقات قاعدة البيانات

استراتيجية عزل متعدد المستأجرين

كيان المستأجر (نموذج المدرسة)

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_001Hogwartshogwartspremium1000
sch_002Beauxbatonsbeauxbatonspremium500
sch_003Durmstrangdurmstrangbasic300

المعلم

المعرفمعرف المدرسةالاسم الأولاسم العائلةالبريد الإلكتروني
tch_001sch_001MinervaMcGonagallm.mcg@hogwarts.edu
tch_002sch_001SeverusSnapes.snape@hogwarts.edu

الطالب

المعرفمعرف المدرسةالاسم الأولاسم العائلةتاريخ الميلاد
std_001sch_001HarryPotter1980-07-31
std_002sch_001HermioneGranger1979-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

هذه البنية الشاملة لقاعدة البيانات توفر الأساس لبناء أنظمة إدارة تعليمية قابلة للتوسع وآمنة وغنية بالميزات.