← يتطلب: مقدمة في IRIS الأساسيات مبتدئ ⏱ 6 ساعات الدورة 02

أساسيات قواعد البيانات الكائنية

Object Database Fundamentals

🎯 أهداف التعلم

1فهم مفهوم البرمجة الكائنية (OOP) وكيف تطبقها IRIS
2تعلم إنشاء الفئات (Classes) والخصائص (Properties) والطرق (Methods)
3فهم نظام التخزين الدائم (Persistence) في IRIS
4تعلم إنشاء العلاقات بين الكائنات
5فهم الفهرسة (Indexing) وكيفية تحسين الاستعلامات
6تعلم استخدام ObjectSQL للوصول للكائنات
01

مقدمة في البرمجة الكائنية في IRIS

تدعم منصة IRIS نموذج البرمجة الكائنية بشكل كامل، حيث يمكن تعريف الفئات (Classes) التي تحتوي على خصائص (Properties) وطرق (Methods) وعلاقات (Relationships).

في IRIS، كل شيء يُبنى باستخدام الفئات. حتى قاعدة البيانات نفسها عبارة عن مجموعة من الفئات المترابطة. يمكن تحويل أي فئة إلى فئة دائمة (Persistent) لتخزينها في قاعدة البيانات.

// تعريف فئة أساسية في IRIS
Class MyApp.Person Extends %Persistent [ ClassType = persistent ]
{
    /// اسم الشخص
    Property Name As %String(MAXLEN = 100);
    
    /// تاريخ الميلاد
    Property DateOfBirth As %Date;
    
    /// البريد الإلكتروني
    Property Email As %String(MAXLEN = 200);
    
    /// العمر المحسوب
    Property Age As %Integer [ Calculated, SqlComputeCode = {
        Set {Age} = ($HOROLOG - {DateOfBirth})  365.25
    }, SqlComputed ];
    
    /// طباعة معلومات الشخص
    Method PrintInfo() As %Status
    {
        Write "الاسم: ", ..Name, !
        Write "تاريخ الميلاد: ", ..DateOfBirth, !
        Write "البريد: ", ..Email, !
        Quit $$$OK
    }
}
ℹ️ معلومة

الكلمة المفتاحية %Persistent تجعل الفئة قابلة للتخزين الدائم في قاعدة البيانات. بدونها، تكون الفئة عابرة (Transient) وتُستخدم فقط في الذاكرة.

02

الخصائص وأنواع البيانات

توفر IRIS مجموعة غنية من أنواع البيانات لتعريف خصائص الكائنات. كل نوع يحدد كيفية التخزين والتحقق من صحة البيانات.

أنواع البيانات الأساسية

  • %String: نصوص بأطوال مختلفة مع دعم Unicode
  • %Integer: أعداد صحيحة
  • %Numeric: أعداد عشرية
  • %Date: تواريخ بصيغة $HOROLOG
  • %Boolean: قيم منطقية (0 أو 1)
  • %Stream: بيانات كبيرة مثل النصوص الطويلة والملفات
// مثال: فئة مع أنواع بيانات متنوعة
Class MyApp.Product Extends %Persistent
{
    Property Name As %String(MAXLEN = 150) [ Required ];
    Property Price As %Numeric(SCALE = 2);
    Property Quantity As %Integer(MINVAL = 0);
    Property Description As %Stream(GlobalCharacter);
    Property IsActive As %Boolean [ InitialExpression = 1 ];
    Property CreatedAt As %TimeStamp [ InitialExpression = {$ZDATETIME($HOROLOG, 3)} ];
    Property Category As %String(VALUELIST = ",إلكتروني,ملابس,أغذية");
    
    /// التحقق من صحة البيانات
    Method %OnBeforeSave() As %Status
    {
        If ..Price < 0 {
            Quit $$$ERROR($$$GeneralError, "السعر لا يمكن أن يكون سالباً")
        }
        Quit $$$OK
    }
}

يمكن استخدام معامل MAXLEN لتحديد الطول الأقصى للنصوص، وMINVAL/MAXVAL لتحديد نطاق الأعداد.

03

العلاقات بين الكائنات

تدعم IRIS عدة أنواع من العلاقات بين الكائنات، مما يتيح بناء نماذج بيانات معقدة ومترابطة.

أنواع العلاقات

  • Relationship One: علاقة واحد إلى واحد
  • Relationship Many: علاقة واحد إلى متعدد
  • Relationship Parent-Child: علاقة أب-ابن مع حذف تتابعي
// علاقة Parent-Child بين المريض والموعد
Class Hospital.Patient Extends %Persistent
{
    Property Name As %String(MAXLEN = 100);
    Property MRN As %String [ Required ];
    
    Relationship Appointments As Hospital.Appointment [ Cardinality = children, Inverse = Patient ];
}

Class Hospital.Appointment Extends %Persistent
{
    Property AppointmentDate As %TimeStamp;
    Property Status As %String(VALUELIST = ",مجدول,مكتمل,ملغي");
    Property Notes As %String(MAXLEN = 500);
    
    Relationship Patient As Hospital.Patient [ Cardinality = parent, Inverse = Appointments ];
}

// إنشاء مريض وموعد
Set patient = ##class(Hospital.Patient).%New()
Set patient.Name = "أحمد محمد"
Set patient.MRN = "MRN-001"
Do patient.%Save()

Set appt = ##class(Hospital.Appointment).%New()
Set appt.AppointmentDate = "2024-03-15 10:00:00"
Set appt.Status = "مجدول"
Set appt.Patient = patient
Do appt.%Save()
⚠️ تنبيه

في العلاقات Parent-Child، عند حذف الأب يتم حذف جميع الأبناء تلقائياً. تأكد من أن هذا السلوك مناسب لحالتك.

04

الفهرسة والبحث

الفهارس (Indexes) ضرورية لتحسين أداء الاستعلامات، خاصة مع مجموعات البيانات الكبيرة.

أنواع الفهارس

  • Index: فهرس عادي لعمود واحد أو أكثر
  • Unique Index: فهرس فريد يمنع التكرار
  • Bitmap Index: فهرس خاص بالبيانات منخفضة الأعداد
  • Extent Index: فهرس تلقائي لجميع الكائنات في الفئة
// فئة مع فهارس متعددة
Class MyApp.Employee Extends %Persistent
{
    Property EmployeeCode As %String;
    Property Name As %String(MAXLEN = 100);
    Property Department As %String;
    Property Salary As %Numeric;
    Property HireDate As %Date;
    
    // فهرس فريد لرمز الموظف
    Index EmpCode On EmployeeCode [ Unique ];
    
    // فهرس على القسم
    Index DeptIdx On Department;
    
    // فهرس مركب
    Index DeptSalary On (Department, Salary);
    
    // فهرس Bitmap للأقسام (مفيد عندما تكون القيم محدودة)
    Index DeptBitmap On Department [ Type = bitmap ];
}

يمكن استخدام الفهارس المركبة عندما تكون الاستعلامات تفلتر على عدة أعمدة معاً. ترتيب الأعمدة في الفهرس يجب أن يطابق ترتيب التصفية في الاستعلام.

05

ObjectSQL - الوصول للكائنات عبر SQL

توفر IRIS إمكانية الوصول للكائنات المخزنة عبر SQL، مما يتيح للمطورين استخدام استعلامات SQL التقليدية للتعامل مع البيانات الكائنية.

-- استعلام بسيط على جدول الأشخاص
SELECT Name, Email, Age
FROM MyApp.Person
WHERE Age > 25
ORDER BY Name

-- استخدام الدوال المدمجة
SELECT Name,
       DATEDIFF('year', DateOfBirth, CURRENT_DATE) AS Age,
       UPPER(Email) AS EmailUpper
FROM MyApp.Person
WHERE Name LIKE '%أحمد%'

-- استعلام مع تجميع
SELECT Department,
       COUNT(*) AS EmpCount,
       AVG(Salary) AS AvgSalary,
       MAX(Salary) AS MaxSalary
FROM MyApp.Employee
GROUP BY Department
HAVING COUNT(*) > 5
ORDER BY AvgSalary DESC

-- إجراء مخزن (Stored Procedure)
CREATE PROCEDURE GetHighEarners(IN minSalary DECIMAL)
RETURNS TABLE (Name VARCHAR(100), Salary DECIMAL)
LANGUAGE OBJECTSCRIPT
{
    SET query = "SELECT Name, Salary FROM MyApp.Employee WHERE Salary >= ?"
    SET tStatement = ##class(%SQL.Statement).%New()
    SET tStatus = tStatement.%Prepare(query)
    SET result = tStatement.%Execute(minSalary)
    QUIT result
}

📝 اختبار التحقق

1 ما هي الكلمة المفتاحية لجعل الفئة قابلة للتخزين الدائم؟
A %Saveable
B %Persistent
C %Stored
D %Permanent
💡 الشرح

الكلمة المفتاحية %Persistent تجعل الفئة قابلة للتخزين الدائم في قاعدة البيانات.

2 أي نوع علاقة يحذف الأبناء عند حذف الأب؟
A One-to-One
B Many-to-Many
C Parent-Child
D Referential
💡 الشرح

في علاقة Parent-Child، يتم حذف جميع الأبناء تلقائياً عند حذف الأب.

3 ما هو نوع الفهرس الأنسب للبيانات منخفضة الأعداد؟
A Unique Index
B Bitmap Index
C Standard Index
D Extent Index
💡 الشرح

فهرس Bitmap مناسب للبيانات التي لها عدد محدود من القيم المميزة (مثل الأقسام).

💡 النقاط الرئيسية

  • الكائنات الدائمة (%Persistent) هي أساس تخزين البيانات في IRIS
  • تدعم IRIS أنواع بيانات متنوعة تشمل النصوص والأعداد والتواريخ والتيارات
  • العلاقات بين الكائنات تشمل One-to-One وOne-to-Many وParent-Child
  • الفهارس ضرورية لتحسين أداء الاستعلامات
  • يمكن الوصول للكائنات عبر ObjectSQL