تُعَدّ القيود Constraints ميزةً مهمةً جدًا في النموذج العلائقي relational model الذي يدعم نظريةً محددةً للقيود المُطبَّقة على السِمات attributes أو الجداول tables، كما تُعَدّ هذه القيود مفيدةً بسبب سماحها لمصمم قواعد البيانات بتحديد دلالات semantics البيانات، فهذه القيود هي القواعد التي تجبر نظم إدارة قواعد البيانات Database management systems -أو DBMSs اختصارًا- على التحقق من توافق البيانات مع هذه الدلالات.
سلامة النطاق Domain Integrity
يُعَدّ النطاق قيدًا من قيود النموذج العلائقي، حيث يُقيّد قيم السمات في العلاقة، لكن هناك دلالات واقعية للبيانات التي لا يمكن تحديدها إذا اُستخدِمت مع قيود النطاق فقط، لذلك نحتاج إلى طرقٍ أكثر تحديدًا لبيان قيم البيانات المسموح بها أو غير المسموح بها والتنسيق المناسب لكل سمة، فمثلًا، يجب أن يكون معرّف الموظف Employee ID -أو EID اختصارًا- في قاعدة البيانات فريدًا، أو يجب أن يكون تاريخ ميلاد الموظف Birthdate ضمن المجال [Jan 1, 1950, Jan 1, 2000]، حيث توفَّر هذه المعلومات ضمن تعليمات منطقية تسمى قيود السلامة integrity constraints، ويوجد عدة أنواع من قيود السلامة كما هو موضَّح أدناه.
سلامة الكيان Entity integrity
يجب احتواء كل جدول على مفتاح رئيسي primary key لضمان سلامة الكيان، ولا يمكن احتواء المفتاح الرئيسي PK أو أي جزء منه على قيم فارغة null، حيث لا يمكننا تحديد بعض الصفوف rows عندما تكون قيم المفتاح الرئيسي فارغة، فمثلًا، لا يمكن أن يكون الهاتف Phone في جدول الموظف EMPLOYEE مفتاحًا رئيسيًا نظرًا لعدم امتلاك بعض الأشخاص أيّ هاتف.
السلامة المرجعية Referential integrity
تتطلب السلامة المرجعية وجود مفتاح رئيسي مقابل للمفتاح الخارجي foreign key، وإلا فيجب أن يكون فارغًا.
يُحدَّد هذا القيد بين جدولين أي الجدول الأب والجدول الابن؛ حيث يحافِظ على المطابقة بين الصفوف في هذين الجدولَين، وهذا يعني أن المرجع من صفٍ في جدول إلى جدول آخر يجب أن يكون صالحًا، وفيما يلي مثال على قيود السلامة المرجعية في قاعدة بيانات العملاء/الطلبات Customer/Order الخاصة بالشركة Company:
-
جدول العميل Customer يحوي الحقلين التاليين:
- CustID رقم العميل.
- CustName اسم العميل.
-
جدول الطلب Order يحوي الحقول التالية:
- OrderID رقم الطلب.
- CustID رقم العميل.
- Date تاريخ الطلب.
يجب فرض السلامة المرجعية لضمان عدم وجود سجلات معزولة أو يتيمة orphan records، فالسجل المعزول هو السجل الذي تكون قيمة مفتاحه الخارجي FK غير موجودة في الكيان المقابل -أي الكيان الذي يحوي المفتاح الرئيسي PK، وتذكّر أنّ عملية الضم join تكون بين المفتاحَين الرئيسي PK والخارجي FK.
ينص قيد السلامة المرجعية في المثال السابق على وجوب تطابق CustID في جدول الطلبات Order مع CustID صالح في جدول العملاء Customer.
تملك معظم قواعد البيانات العلائقية سلامة مرجعية تصريحية declarative referential integrity، أي يجري إعداد قيود السلامة المرجعية عند إنشاء الجداول. وفيما يلي مثال آخر على قاعدة بيانات صفوف دراسية/مقرَّرات Course/Class:
-
جدول الدورة التدريبية Course يحوي الحقول التالي:
- CrsCode رمز الدورة.
- DeptCode رمز القسم.
- Description وصف الدورة.
-
جدول الصف Class يحوي الحقول التالية:
- CrsCode رمز الدورة.
- Section القسم.
- ClassTime وقت الصف.
ينص قيد السلامة المرجعية هنا على وجوب تطابق المفتاح الخارجي CrsCode في جدول Class مع مفتاح رئيسي CrsCode صالح في جدول Course، حيث لا يكفي في هذه الحالة أن تشكِّل السمتان CrsCode و Section في جدول Class المفتاح الرئيسي PK، إذ يجب علينا فرض السلامة المرجعية أيضًا.
يجب امتلاك المفتاح الرئيسي PK والمفتاح الخارجي FK أنواع البيانات نفسها، كما يجب أن يأتيا من نفس النطاق عند إعداد السلامة المرجعية، وإلا فلن يسمح نظام إدارة قاعدة البيانات العلائقية RDBMS بعملية الضم join.
يُعَدّ نظام RDBMS نظام قاعدة بيانات شائع، حيث يعتمد على النموذج العلائقي الذي قدمه إدجار كود E.F. Codd من مختبر أبحاث سان خوسيه San Jose التابع لشركة IBM، كما تُعَدّ أنظمة قواعد البيانات العلائقية أسهل في الاستخدام والفهم من أنظمة قواعد البيانات الأخرى.
السلامة المرجعية في نظام مايكروسوفت أكسس Microsoft Access
يجري إعداد السلامة المرجعية في نظام مايكروسوفت أكسس MS Acces من خلال ضم المفتاح الرئيسي PK الذي هو معرّف العميل CustID في جدول العملاء إلى معرّف العميل CustID في جدول الطلبات Order، ويوضِّح الشكل التالي طريقة عمل ذلك على شاشة تحرير العلاقات Edit Relationships في نظام مايكروسوفت أكسس:
السلامة المرجعية باستخدام الإصدار Transact-SQL من لغة SQL
تُضبَط السلامة المرجعية في الإصدار Transact-SQL (اختصارها T-SQL) المستخدمة في خادم MS SQL Server عند إنشاء جدول الطلبات Order باستخدام المفتاح الخارجي FK، حيث تُظهِر التعليمات المدرجة أدناه المفتاح الخارجي FK في جدول الطلبات Order الذي يكون مرجعًا إلى المفتاح الرئيسي PK في جدول العملاء Customer:
CREATE TABLE Customer ( CustID INTEGER PRIMARY KEY, CustName CHAR(35) )
CREATE TABLE Orders ( OrderID INTEGER PRIMARY KEY, CustID INTEGER REFERENCES Customer(CustID), OrderDate DATETIME )
قواعد المفاتيح الخارجية
يمكن إضافة قواعد مفاتيح خارجية إضافية عند ضبط السلامة المرجعية مثل ما نفعله بالصفوف الأبناء -في جدول Orders- عندما يُحذَف أو يُغيَّر -أي يُحدَّث- السجل وهو جزء من الجدول الأب -Customer- والذي يملك مفتاحًا رئيسيًا PK، فمثلًا، تَعرض نافذة تحرير العلاقات في MS Access في الشكل السابق خيارين إضافيين لقواعد المفتاح الخارجي FK، هما: التحديث المتسلسل أو التعاقبي Cascade Update، والحذف المتسلسل Cascade Delete، فإذا لم يُحدَّد هذان الخياران، فسيمنع النظام حذف أو تحديث قيم المفتاح الرئيسي PK في جدول الأب -أي جدول العملاء Customer- في حالة وجود سجل ابن، فالسجل الابن هو أي سجل مع مفتاح رئيسي PK مطابق.
يوجد خيار إضافي في بعض قواعد البيانات عند تحديد خيار الحذف ويسمى Set to Null، حيث يُحذَف صف المفتاح الرئيسي PK في هذا الاختيار، ولكن يُضبَط المفتاح الخارجي FK في الجدول الابن على القيمة الفارغة NULL، فعلى الرغم من أنّ هذا يؤدي إلى إنشاء صف يتيم، إلا أنه أمر مقبول.
قيود المؤسسة Enterprise Constraints
يشار إلى قيود المؤسسة أحيانًا بالقيود الدلالية semantic constraints، وهي قواعد إضافية يحددها المستخدمون أو مسؤولو قاعدة البيانات، كما يمكنها الاستناد إلى جداول متعددة، وفيما يلي بعض الأمثلة عنها:
- يمكن للصف الدراسي class ضم ثلاثين طالبًا على أساس حد أقصى.
- يمكن للمدرّس teacher تدريس أربعة صفوف في الفصل الواحد على أساس حد أقصى.
- لا يمكن للموظف employee المشاركة في أكثر من خمسة مشاريع.
- لا يمكن لراتب الموظف تجاوز راتب مديره.
قواعد العمل Business Rules
نحصل على قواعد العمل من المستخدِمين عند جمع المتطلبات gathering requirements، كما تُعَدّ عملية جمع المتطلبات عمليةً مهمةً للغاية، ويجب على المستخدِم أن يتحقق من نتائجها قبل بناء تصميم قاعدة البيانات، فإذا كانت قواعد العمل غير صحيحة، فسيكون التصميم غير صحيح، وفي النهاية لن يعمل التطبيق على النحو الذي توقّعه المستخدِمون، وفيما يلي بعض الأمثلة عن قواعد العمل، وهي:
- يمكن للمدرّس تدريس طلاب متعددين.
- يمكن للصف الدراسي امتلاك 35 طالبًا على أساس حد أقصى.
- يمكن تدريس المُقرَّر course عدة مرات، ولكن يدرِّسه مدرِّس واحد فقط.
- لا يدرّس جميع المدرِّسين صفوفًا دراسية.
تعددية العلاقة Cardinality والارتباط connectivity
تُستخدَم قواعد العمل لتحديد عددية العلاقة والارتباط، حيث تصف نعددية العلاقة Cardinality العلاقة بين جدولي بيانات من خلال التعبير عن الحد الأدنى والحد الأقصى لعدد مرات حدوث الكيان المرتبط بحدوث كيانٍ آخر ذي صلة، ويمكّنك الشكل التالي من رؤية أن عددية العلاقة ممثَّلة من خلال العلامات الداخلية على رمز العلاقة، حيث تكون درجة العلاقة Cardinality هي 0 على اليمين و1 على اليسار.
يمثل الرمز الخارجي لرمز العلاقة الارتباط Connectivity بين الجدولين، فالارتباط هو العلاقة بين جدولين مثل علاقة واحد إلى واحد one to one، أو واحد إلى متعدد one to many؛ والمرة الوحيدة التي يكون فيها الارتباط صفرًا هي عندما يكون للمفتاح الخارجي FK قيمة فارغة null.
يوجد ثلاثة خيارات للعلاقة بين هذه الكيانات عندما يتعلق الأمر بالمشاركة، وهي: 0، أو 1، أو متعدد many، فمثلًا، قيمة الارتباط Connectivity هي 1 في الشكل السابق على الجانب الخارجي الأيسر من هذا الخط، ومتعدد على الجانب الخارجي الأيمن.
يظهر الشكل التالي الرمز الذي يمثل علاقة واحد إلى متعدد one to many:
يعرض الشكل الآتي كلًا من العلامات الداخلية -التي تمثل عددية العلاقة Cardinality -والعلامات الخارجية -التي تمثل الارتباط Connectivity-، حيث يُقرأ الجانب الأيسر من هذا الرمز على أن الحد الأدنى 1 والحد الأقصى 1، بينما يُقرأ الجانب الأيمن على النحو التالي: الحد الأدنى 1 والحد الأقصى متعدد.
أنواع العلاقات
يشير السطر الذي يربط جدولين في مخطط الكيان والعلاقة entity relationship diagram -أو ERD اختصارًا- إلى نوع العلاقة بين الجدولين؛ فهي إما وثيقة أو معرَّفة identifying أو غير وثيقة non-identifying.
العلاقة الوثيقة هي خط متصل بحيث يحتوي المفتاح الرئيسي PK على المفتاح الخارجي FK، كما يشار إلى العلاقة الغير وثيقة بخط متقطع مع عدم وجود المفتاح الخارجي FK ضمن المفتاح الرئيسي PK.
العلاقات الاختيارية
يمكن أن يكون للمفتاح الخارجي FK قيمةً فارغةً في العلاقة الاختيارية أو لا يحتاج الجدول الأب إلى وجود جدول ابن مطابق.
يوضح الرمز المبيَّن في الشكل نوعًا مكوَّنًا من صفر وثلاث بروزات -تشير إلى متعدد- والذي يُفسَّر على أنه علاقة صفر أو متعدد zero OR many، وإذا نظرت إلى جدول الطلبات Order table على الجانب الأيمن من الشكل الآتي على سبيل المثال، فستلاحظ عدم حاجة العميل customer إلى تقديم طلب ليكون عميلًا، أي أن الجانب المتعدد اختياري، ويوضِّح الشكل التالي المثال السابق عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى متعدد zero to many:
يمكن أيضًا قراءة رمز العلاقة في الشكل السابق على النحو التالي:
- الجانب الأيسر: يجب احتواء كيان الطلب order entity على كيان واحد مرتبط على أساس حد أدنى في جدول العميل Customer table، وكيان واحد مرتبط على أساس حد أقصى.
- الجانب الأيمن: يمكن للعميل عدم تقديم طلبات (أي صفر طلب) على أساس حد أدنى، أو تقديم طلبات متعددة على أساس حد أقصى.
يوضِّح الشكل نوعًا آخرًا من رموز العلاقة الاختيارية بصفر وواحد، أي علاقة صفر أو واحد zero OR one، حيث جانب الواحد اختياري، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى واحد zero to one:
العلاقات الإلزامية Mandatory relationships
يتطلب حدوث كيان واحد حدوث كيان مقابل في العلاقة الإلزامية. يُظهِر رمز هذه العلاقة علاقة واحد فقط one and only one كما هو موضح في الشكل ، أي أن الجانب واحد one side إلزامي، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد فقط one and only one:
يوضِّح الشكل رمز علاقة واحد إلى متعدد one to many حيث يكون الجانب المتعدد many side إلزاميًا. ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد إلى متعدد:
رأينا حتى الآن أن الجانب الداخلي من رمز العلاقة الموضَّح على الجانب الأيسر من الرمز في الشكل الآتي يمكن أن يكون له تعددية العلاقة cardinality قيمتها 0 وارتباط connectivity متعدد كما هو موضَّح على الجانب الأيمن من الرمز في الشكل ، أو ارتباط قيمته واحد وهو غير موضَّح في الشكل.
لا يمكن أن يكون لديه ارتباط قيمته 0، كما هو موضَّح في الشكل ، حيث يمكن أن يكون الارتباط 1 فقط.
تُظهِر رموز الارتباط الحدود القصوى، فإذا أظهر رمز الارتباط على الجانب الأيسر القيمة 0، فلن يكون هناك ارتباط بين الجداول، وفيما يلي طريقة قراءة رمز العلاقة مثل الرمز الموجود في الشكل الآتي:
- يجب العثور على معرِّف العميل CustID في جدول الطلبات Order table وفي جدول العملاء Customer table أيضًا بحد أدنى 0 وبحد أقصى 1 مرة.
- تعني القيمة 0 أن معرِّف العميل CustID في جدول الطلبات Order table قد تكون قيمته فارغة null.
- تشير القيمة 1 الموجودة أقصى اليسار -أي قبل القيمة 0 مباشرةً التي تمثل الارتباط- إلى أنه إذا كان هناك معرِّف عميل CustID في جدول الطلبات Order table، فيمكن وجود هذا المعرِّف في جدول العملاء Customer table مرةً واحدةً فقط.
-
يمكنك افتراض شيئين عندما ترى الرمز 0 لتعددية العلاقة cardinality:
- يسمح المفتاح الخارجي FK في جدول الطلبات Order table بوجود القيم الفارغة.
- ليس المفتاح الخارجي FK جزءًا من المفتاح الرئيسي PK، لأنه يجب ألا تحتوي المفاتيح الرئيسية على قيم فارغة null.
تمارين
اقرأ الوصف التالي ثم أجب عن الأسئلة:
صُمِّمت قاعدة بيانات نادي السباحة في الشكل الآتي لتحتوي على معلومات حول الطلاب students المسجَلين enrolled في صفوف السباحة، حيث خُزِّنت المعلومات التالية: الطلاب students، والتسجيل enrollment، وصفوف السباحة swim classes، والمسابح pools التي تقام فيها الصفوف، ومدربو instructors صفوف السباحة، والمستويات levels المختلفة من صفوف السباحة.
استخدم الشكل التالي للإجابة على الأسئلة:
حُدِّدت المفاتيح الرئيسية primary keys أدناه، وعُرِّفت أنواع البيانات التالية في خادم SQL Server.
**tblLevels** Level – Identity PK ClassName – text 20 – nulls are not allowed **tblPool** Pool – Identity PK PoolName – text 20 – nulls are not allowed Location – text 30 **tblStaff** StaffID – Identity PK FirstName – text 20 MiddleInitial – text 3 LastName – text 30 Suffix – text 3 Salaried – Bit PayAmount – money **tblClasses** LessonIndex – Identity PK Level – Integer FK SectionID – Integer Semester – TinyInt Days – text 20 Time – datetime (formatted for time) Pool – Integer FK Instructor – Integer FK Limit – TinyInt Enrolled – TinyInt Price – money **tblEnrollment** LessonIndex – Integer FK SID – Integer FK (LessonIndex and SID) Primary Key Status – text 30 Charged – bit AmountPaid – money DateEnrolled – datetime **tblStudents** SID – Identity PK FirstName – text 20 MiddleInitial – text 3 LastName – text 30 Suffix – text 3 Birthday – datetime LocalStreet – text 30 LocalCity – text 20 LocalPostalCode – text 6 LocalPhone – text 10
طبّق هذا المخطط في خادم SQL Server، أو باستخدام نظام access وعندها ستحتاج إلى اختيار أنواع بيانات قابلة للموازنة.
- اشرح قواعد العلاقة relationship rules لكل علاقة مثل العلاقة بين الجدولين tblEnrollment وtblStudents التي تمثِّل إمكانية تسجيل الطالب في صفوف سباحة متعددة.
- حدّد عددية cardinality كل علاقة بافتراض القواعد التالية:
- قد يكون أو لا يكون للمسبح pool صفًا class للسباحة.
- يجب ارتباط جدول المستويات levels table دائمًا بصف سباحة واحد على الأقل.
- قد لا يدرِّس جدول فريق التدريب staff table أيَّ صف سباحة.
- يجب تسجيل جميع الطلاب في صف سباحة واحد على الأقل.
- يجب احتواء صف السباحة على طلاب مسجلين فيه.
- يجب امتلاك صف السباحة على مسبح صالح.
- قد لا يُعيَّن مدرب لصف السباحة.
- يجب ارتباط صف السباحة دائمًا بمستوى موجود.
- حدّد الجداول الضعيفة، والجداول القوية التي شرحناها في مقالٍ سابق.
- حدّد الجداول المُعرَّفة identifying، والجداول غير المُعرَّفة non-identifying.
ترجمة -وبتصرف- للفصل Integrity Rules and Constraints لصاحبَيه Adrienne Watt و Nelson Eng من كتاب Database Design.
اقرأ أيضًا
- المقال التالي: نمذجة الكيان العلاقي ER عند تصميم قواعد البيانات
- المقال السابق: نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات
- النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
- خصائص قواعد البيانات والمزايا التي تقدمها
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.