<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/page/2/?d=4</link><description>DevOps: &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</description><language>ar</language><item><title>&#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x633;&#x644;&#x627;&#x645;&#x629; &#x648;&#x642;&#x64A;&#x648;&#x62F;&#x647;&#x627; &#x644;&#x636;&#x645;&#x627;&#x646; &#x633;&#x644;&#x627;&#x645;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x641;&#x64A; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D9%85%D8%A9-%D9%88%D9%82%D9%8A%D9%88%D8%AF%D9%87%D8%A7-%D9%84%D8%B6%D9%85%D8%A7%D9%86-%D8%B3%D9%84%D8%A7%D9%85%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r544/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/6165207808b29_-------.png.0d97a30e0a461cfd58cc9c0548afad8f.png" /></p>

<p>
	تُعَدّ القيود Constraints ميزةً مهمةً جدًا في <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A-er-%D8%B9%D9%86%D8%AF-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r545/" rel="">النموذج العلائقي</a> relational model الذي يدعم نظريةً محددةً للقيود المُطبَّقة على السِمات attributes أو الجداول tables، كما تُعَدّ هذه القيود مفيدةً بسبب سماحها لمصمم قواعد البيانات بتحديد دلالات semantics البيانات، فهذه القيود هي القواعد التي تجبر نظم إدارة قواعد البيانات Database management systems -أو DBMSs اختصارًا- على التحقق من توافق البيانات مع هذه الدلالات.
</p>

<h2>
	سلامة النطاق Domain Integrity
</h2>

<p>
	يُعَدّ النطاق قيدًا من قيود النموذج العلائقي، حيث يُقيّد قيم السمات في العلاقة، لكن هناك دلالات واقعية للبيانات التي لا يمكن تحديدها إذا اُستخدِمت مع قيود النطاق فقط، لذلك نحتاج إلى طرقٍ أكثر تحديدًا لبيان قيم البيانات المسموح بها أو غير المسموح بها والتنسيق المناسب لكل سمة، فمثلًا، يجب أن يكون معرّف الموظف Employee ID -أو EID اختصارًا- في قاعدة البيانات فريدًا، أو يجب أن يكون تاريخ ميلاد الموظف Birthdate ضمن المجال [Jan 1, 1950, Jan 1, 2000]، حيث توفَّر هذه المعلومات ضمن تعليمات منطقية تسمى قيود السلامة integrity constraints، ويوجد عدة أنواع من قيود السلامة كما هو موضَّح أدناه.
</p>

<h3>
	سلامة الكيان Entity integrity
</h3>

<p>
	يجب احتواء كل جدول على مفتاح رئيسي primary key لضمان سلامة الكيان، ولا يمكن احتواء المفتاح الرئيسي PK أو أي جزء منه على قيم فارغة null، حيث لا يمكننا تحديد بعض الصفوف rows عندما تكون قيم المفتاح الرئيسي فارغة، فمثلًا، لا يمكن أن يكون الهاتف Phone في جدول الموظف EMPLOYEE مفتاحًا رئيسيًا نظرًا لعدم امتلاك بعض الأشخاص أيّ هاتف.
</p>

<h3>
	السلامة المرجعية Referential integrity
</h3>

<p>
	تتطلب السلامة المرجعية وجود مفتاح رئيسي مقابل للمفتاح الخارجي foreign key، وإلا فيجب أن يكون فارغًا.
</p>

<p>
	يُحدَّد هذا القيد بين جدولين أي الجدول الأب والجدول الابن؛ حيث يحافِظ على المطابقة بين الصفوف في هذين الجدولَين، وهذا يعني أن المرجع من صفٍ في جدول إلى جدول آخر يجب أن يكون صالحًا، وفيما يلي مثال على قيود السلامة المرجعية في قاعدة بيانات العملاء/الطلبات Customer/Order الخاصة بالشركة Company:
</p>

<ul>
<li>
		جدول العميل Customer يحوي الحقلين التاليين:
		<ul>
<li>
				CustID رقم العميل.
			</li>
			<li>
				CustName اسم العميل.
			</li>
		</ul>
</li>
	<li>
		جدول الطلب Order يحوي الحقول التالية:
		<ul>
<li>
				OrderID رقم الطلب.
			</li>
			<li>
				CustID رقم العميل.
			</li>
			<li>
				Date تاريخ الطلب.
			</li>
		</ul>
</li>
</ul>
<p>
	يجب فرض السلامة المرجعية لضمان عدم وجود سجلات معزولة أو يتيمة orphan records، فالسجل المعزول هو السجل الذي تكون قيمة مفتاحه الخارجي FK غير موجودة في الكيان المقابل -أي الكيان الذي يحوي المفتاح الرئيسي PK، وتذكّر أنّ عملية الضم join تكون بين المفتاحَين الرئيسي PK والخارجي FK.
</p>

<p>
	ينص قيد السلامة المرجعية في المثال السابق على وجوب تطابق CustID في جدول الطلبات Order مع CustID صالح في جدول العملاء Customer.
</p>

<p>
	تملك معظم <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D9%88%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A9-er-%D9%84%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r543/" rel="">قواعد البيانات العلائقية</a> سلامة مرجعية تصريحية declarative referential integrity، أي يجري إعداد قيود السلامة المرجعية عند إنشاء الجداول. وفيما يلي مثال آخر على قاعدة بيانات صفوف دراسية/مقرَّرات Course/Class:
</p>

<ul>
<li>
		جدول الدورة التدريبية Course يحوي الحقول التالي:
		<ul>
<li>
				CrsCode رمز الدورة.
			</li>
			<li>
				DeptCode رمز القسم.
			</li>
			<li>
				Description وصف الدورة.
			</li>
		</ul>
</li>
	<li>
		جدول الصف Class يحوي الحقول التالية:
		<ul>
<li>
				CrsCode رمز الدورة.
			</li>
			<li>
				Section القسم.
			</li>
			<li>
				ClassTime وقت الصف.
			</li>
		</ul>
</li>
</ul>
<p>
	ينص قيد السلامة المرجعية هنا على وجوب تطابق المفتاح الخارجي CrsCode في جدول Class مع مفتاح رئيسي CrsCode صالح في جدول Course، حيث لا يكفي في هذه الحالة أن تشكِّل السمتان CrsCode و Section في جدول Class المفتاح الرئيسي PK، إذ يجب علينا فرض السلامة المرجعية أيضًا.
</p>

<p>
	يجب امتلاك المفتاح الرئيسي PK والمفتاح الخارجي FK أنواع البيانات نفسها، كما يجب أن يأتيا من نفس النطاق عند إعداد السلامة المرجعية، وإلا فلن يسمح نظام إدارة قاعدة البيانات العلائقية RDBMS بعملية الضم join.
</p>

<p>
	يُعَدّ نظام RDBMS نظام قاعدة بيانات شائع، حيث يعتمد على النموذج العلائقي الذي قدمه إدجار كود E.F. Codd من مختبر أبحاث سان خوسيه San Jose التابع لشركة IBM، كما تُعَدّ أنظمة قواعد البيانات العلائقية أسهل في الاستخدام والفهم من أنظمة قواعد البيانات الأخرى.
</p>

<h3>
	السلامة المرجعية في نظام مايكروسوفت أكسس Microsoft Access
</h3>

<p>
	يجري إعداد السلامة المرجعية في نظام مايكروسوفت أكسس MS Acces من خلال ضم المفتاح الرئيسي PK الذي هو معرّف العميل CustID في جدول العملاء إلى معرّف العميل CustID في جدول الطلبات Order، ويوضِّح الشكل التالي طريقة عمل ذلك على شاشة تحرير العلاقات Edit Relationships في نظام مايكروسوفت أكسس:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78933" href="https://academy.hsoub.com/uploads/monthly_2021_10/ReferentialAccessInMSAccess.png.ef9e851a0f4f092f38b6bd72ad5cf890.png" rel=""><img alt="ReferentialAccessInMSAccess.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78933" data-unique="1zsegq0a0" src="https://academy.hsoub.com/uploads/monthly_2021_10/ReferentialAccessInMSAccess.png.ef9e851a0f4f092f38b6bd72ad5cf890.png"></a>
</p>

<h3>
	السلامة المرجعية باستخدام الإصدار Transact-SQL من لغة SQL
</h3>

<p>
	تُضبَط السلامة المرجعية في الإصدار Transact-SQL (اختصارها T-SQL) المستخدمة في خادم MS SQL Server عند إنشاء جدول الطلبات Order باستخدام المفتاح الخارجي FK، حيث تُظهِر التعليمات المدرجة أدناه المفتاح الخارجي FK في جدول الطلبات Order الذي يكون مرجعًا إلى المفتاح الرئيسي PK في جدول العملاء Customer:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5711_7" style="">
<span class="pln">CREATE TABLE </span><span class="typ">Customer</span><span class="pln">
</span><span class="pun">(</span><span class="pln"> </span><span class="typ">CustID</span><span class="pln"> INTEGER PRIMARY KEY</span><span class="pun">,</span><span class="pln">
</span><span class="typ">CustName</span><span class="pln"> CHAR</span><span class="pun">(</span><span class="lit">35</span><span class="pun">)</span><span class="pln"> </span><span class="pun">)</span></pre>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5711_9" style="">
<span class="pln">CREATE TABLE </span><span class="typ">Orders</span><span class="pln">
</span><span class="pun">(</span><span class="pln"> </span><span class="typ">OrderID</span><span class="pln"> INTEGER PRIMARY KEY</span><span class="pun">,</span><span class="pln">
</span><span class="typ">CustID</span><span class="pln"> INTEGER REFERENCES </span><span class="typ">Customer</span><span class="pun">(</span><span class="typ">CustID</span><span class="pun">),</span><span class="pln">
</span><span class="typ">OrderDate</span><span class="pln"> DATETIME </span><span class="pun">)</span></pre>

<h3>
	قواعد المفاتيح الخارجية
</h3>

<p>
	يمكن إضافة قواعد مفاتيح خارجية إضافية عند ضبط السلامة المرجعية مثل ما نفعله بالصفوف الأبناء -في جدول Orders- عندما يُحذَف أو يُغيَّر -أي يُحدَّث- السجل وهو جزء من الجدول الأب -Customer- والذي يملك مفتاحًا رئيسيًا PK، فمثلًا، تَعرض نافذة تحرير العلاقات في MS Access في الشكل السابق خيارين إضافيين لقواعد المفتاح الخارجي FK، هما: التحديث المتسلسل أو التعاقبي Cascade Update، والحذف المتسلسل Cascade Delete، فإذا لم يُحدَّد هذان الخياران، فسيمنع النظام حذف أو تحديث قيم المفتاح الرئيسي PK في جدول الأب -أي جدول العملاء Customer- في حالة وجود سجل ابن، فالسجل الابن هو أي سجل مع مفتاح رئيسي PK مطابق.
</p>

<p>
	يوجد خيار إضافي في بعض قواعد البيانات عند تحديد خيار الحذف ويسمى Set to Null، حيث يُحذَف صف المفتاح الرئيسي PK في هذا الاختيار، ولكن يُضبَط المفتاح الخارجي FK في الجدول الابن على القيمة الفارغة NULL، فعلى الرغم من أنّ هذا يؤدي إلى إنشاء صف يتيم، إلا أنه أمر مقبول.
</p>

<h2>
	قيود المؤسسة Enterprise Constraints
</h2>

<p>
	يشار إلى قيود المؤسسة أحيانًا بالقيود الدلالية semantic constraints، وهي قواعد إضافية يحددها المستخدمون أو مسؤولو قاعدة البيانات، كما يمكنها الاستناد إلى جداول متعددة، وفيما يلي بعض الأمثلة عنها:
</p>

<ul>
<li>
		يمكن للصف الدراسي class ضم ثلاثين طالبًا على أساس حد أقصى.
	</li>
	<li>
		يمكن للمدرّس teacher تدريس أربعة صفوف في الفصل الواحد على أساس حد أقصى.
	</li>
	<li>
		لا يمكن للموظف employee المشاركة في أكثر من خمسة مشاريع.
	</li>
	<li>
		لا يمكن لراتب الموظف تجاوز راتب مديره.
	</li>
</ul>
<h2>
	قواعد العمل Business Rules
</h2>

<p>
	نحصل على قواعد العمل من المستخدِمين عند جمع المتطلبات gathering requirements، كما تُعَدّ عملية جمع المتطلبات عمليةً مهمةً للغاية، ويجب على المستخدِم أن يتحقق من نتائجها قبل بناء <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r519/" rel="">تصميم قاعدة البيانات</a>، فإذا كانت قواعد العمل غير صحيحة، فسيكون التصميم غير صحيح، وفي النهاية لن يعمل التطبيق على النحو الذي توقّعه المستخدِمون، وفيما يلي بعض الأمثلة عن قواعد العمل، وهي:
</p>

<ul>
<li>
		يمكن للمدرّس تدريس طلاب متعددين.
	</li>
	<li>
		يمكن للصف الدراسي امتلاك 35 طالبًا على أساس حد أقصى.
	</li>
	<li>
		يمكن تدريس المُقرَّر course عدة مرات، ولكن يدرِّسه مدرِّس واحد فقط.
	</li>
	<li>
		لا يدرّس جميع المدرِّسين صفوفًا دراسية.
	</li>
</ul>
<h3>
	تعددية العلاقة Cardinality والارتباط connectivity
</h3>

<p>
	تُستخدَم قواعد العمل لتحديد عددية العلاقة والارتباط، حيث تصف نعددية العلاقة Cardinality العلاقة بين جدولي بيانات من خلال التعبير عن الحد الأدنى والحد الأقصى لعدد مرات حدوث الكيان المرتبط بحدوث كيانٍ آخر ذي صلة، ويمكّنك الشكل التالي من رؤية أن عددية العلاقة ممثَّلة من خلال العلامات الداخلية على رمز العلاقة، حيث تكون درجة العلاقة Cardinality هي 0 على اليمين و1 على اليسار.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93926" href="https://academy.hsoub.com/uploads/monthly_2022_03/PositionOfConnectivityAndCardinalityOnARelationshipSymbol.thumb.png.58199a5e9cc96026999bb95688c4c36a.png" rel=""><img alt="PositionOfConnectivityAndCardinalityOnARelationshipSymbol.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93926" data-unique="q46aozlcx" src="https://academy.hsoub.com/uploads/monthly_2022_03/PositionOfConnectivityAndCardinalityOnARelationshipSymbol.thumb.thumb.png.e7c50364e542acf30ab1d215819a1618.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	يمثل الرمز الخارجي لرمز العلاقة الارتباط Connectivity بين الجدولين، فالارتباط هو العلاقة بين جدولين مثل علاقة واحد إلى واحد one to one، أو واحد إلى متعدد one to many؛ والمرة الوحيدة التي يكون فيها الارتباط صفرًا هي عندما يكون للمفتاح الخارجي FK قيمة فارغة null.
</p>

<p>
	يوجد ثلاثة خيارات للعلاقة بين هذه الكيانات عندما يتعلق الأمر بالمشاركة، وهي: 0، أو 1، أو متعدد many، فمثلًا، قيمة الارتباط Connectivity هي 1 في الشكل السابق على الجانب الخارجي الأيسر من هذا الخط، ومتعدد على الجانب الخارجي الأيمن.
</p>

<p>
	يظهر الشكل التالي الرمز الذي يمثل علاقة واحد إلى متعدد one to many:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78937" href="https://academy.hsoub.com/uploads/monthly_2021_10/OneToManyRelationship.png.f3d5e633c254559f960767f0823741db.png" rel=""><img alt="OneToManyRelationship.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78937" data-unique="tgquvxzui" src="https://academy.hsoub.com/uploads/monthly_2021_10/OneToManyRelationship.png.f3d5e633c254559f960767f0823741db.png" style="width: 100px; height: auto;"></a>
</p>

<p>
	يعرض الشكل الآتي كلًا من العلامات الداخلية -التي تمثل عددية العلاقة Cardinality -والعلامات الخارجية -التي تمثل الارتباط Connectivity-، حيث يُقرأ الجانب الأيسر من هذا الرمز على أن الحد الأدنى 1 والحد الأقصى 1، بينما يُقرأ الجانب الأيمن على النحو التالي: الحد الأدنى 1 والحد الأقصى متعدد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78934" href="https://academy.hsoub.com/uploads/monthly_2021_10/BothInnerAndOuterMarkers.png.ef51d64003ed4f27d0bf919a5accf111.png" rel=""><img alt="BothInnerAndOuterMarkers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78934" data-unique="4lwfato8o" src="https://academy.hsoub.com/uploads/monthly_2021_10/BothInnerAndOuterMarkers.png.ef51d64003ed4f27d0bf919a5accf111.png" style="width: 100px; height: auto;"></a>
</p>

<h2>
	أنواع العلاقات
</h2>

<p>
	يشير السطر الذي يربط جدولين في مخطط الكيان والعلاقة entity relationship diagram -أو ERD اختصارًا- إلى نوع العلاقة بين الجدولين؛ فهي إما وثيقة أو معرَّفة identifying أو غير وثيقة non-identifying.
</p>

<p>
	العلاقة الوثيقة هي خط متصل بحيث يحتوي المفتاح الرئيسي PK على المفتاح الخارجي FK، كما يشار إلى العلاقة الغير وثيقة بخط متقطع مع عدم وجود المفتاح الخارجي FK ضمن المفتاح الرئيسي PK.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93927" href="https://academy.hsoub.com/uploads/monthly_2022_03/IdentifyingAndNon-identifyingRelationship-(1).thumb.png.eede02cc5a70a6336eb4447c2fa3f7c2.png" rel=""><img alt="IdentifyingAndNon-identifyingRelationship-(1).thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93927" data-unique="rsfe9zp7a" src="https://academy.hsoub.com/uploads/monthly_2022_03/IdentifyingAndNon-identifyingRelationship-(1).thumb.thumb.png.ba3ed7bb4b4d881516cf2d1791fc5ca8.png" style="width: 500px; height: auto;"></a>
</p>

<h3>
	العلاقات الاختيارية
</h3>

<p>
	يمكن أن يكون للمفتاح الخارجي FK قيمةً فارغةً في العلاقة الاختيارية أو لا يحتاج الجدول الأب إلى وجود جدول ابن مطابق.
</p>

<p>
	يوضح الرمز المبيَّن في الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78940" href="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroORManyRelationship.png.a6b8bd24418d8e37689cad55e41ee248.png" rel=""><img alt="ZeroORManyRelationship.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78940" data-unique="bi2kqaqmi" src="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroORManyRelationship.png.a6b8bd24418d8e37689cad55e41ee248.png" style="width: 45px; height: auto;"></a> نوعًا مكوَّنًا من صفر وثلاث بروزات -تشير إلى متعدد- والذي يُفسَّر على أنه علاقة صفر أو متعدد zero OR many، وإذا نظرت إلى جدول الطلبات Order table على الجانب الأيمن من الشكل الآتي على سبيل المثال، فستلاحظ عدم حاجة العميل customer إلى تقديم طلب ليكون عميلًا، أي أن الجانب المتعدد اختياري، ويوضِّح الشكل التالي المثال السابق عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى متعدد zero to many:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93928" href="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleUsageOfAZeroToManyOptionalRelationshipSymbol.thumb.png.3924eaa896806b8c3914f9693b0853c2.png" rel=""><img alt="ExampleUsageOfAZeroToManyOptionalRelationshipSymbol.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93928" data-unique="q27l5m1yz" src="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleUsageOfAZeroToManyOptionalRelationshipSymbol.thumb.thumb.png.ee84c18f453227464b90653852528f3d.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يمكن أيضًا قراءة رمز العلاقة في الشكل السابق على النحو التالي:
</p>

<ul>
<li>
		الجانب الأيسر: يجب احتواء كيان الطلب order entity على كيان واحد مرتبط على أساس حد أدنى في جدول العميل Customer table، وكيان واحد مرتبط على أساس حد أقصى.
	</li>
	<li>
		الجانب الأيمن: يمكن للعميل عدم تقديم طلبات (أي صفر طلب) على أساس حد أدنى، أو تقديم طلبات متعددة على أساس حد أقصى.
	</li>
</ul>
<p>
	يوضِّح الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78941" href="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOROneRelationship.png.494552ac3820e94cb6f54e932a08609f.png" rel=""><img alt="ZeroOROneRelationship.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78941" data-unique="qdwjqg5lo" src="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOROneRelationship.png.494552ac3820e94cb6f54e932a08609f.png"></a> نوعًا آخرًا من رموز العلاقة الاختيارية بصفر وواحد، أي علاقة صفر أو واحد zero OR one، حيث جانب الواحد اختياري، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى واحد zero to one:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93929" href="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleUsageOfAZeroToOneOptionalRelationshipSymbol.thumb.png.6f3c45a59231f52c2b3078e6435c1e8f.png" rel=""><img alt="ExampleUsageOfAZeroToOneOptionalRelationshipSymbol.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93929" data-unique="mp6fxen0s" src="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleUsageOfAZeroToOneOptionalRelationshipSymbol.thumb.thumb.png.553d9817497232e61dddbbdee79963fa.png" style="width: 600px; height: auto;"></a>
</p>

<h3>
	العلاقات الإلزامية Mandatory relationships
</h3>

<p>
	يتطلب حدوث كيان واحد حدوث كيان مقابل في العلاقة الإلزامية. يُظهِر رمز هذه العلاقة علاقة واحد فقط one and only one كما هو موضح في الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78935" href="https://academy.hsoub.com/uploads/monthly_2021_10/OneAndOnlyOneRelationship.png.a8df8e27606e80c633fffe84a7082a01.png" rel=""><img alt="OneAndOnlyOneRelationship.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78935" data-unique="88sjg2e7n" src="https://academy.hsoub.com/uploads/monthly_2021_10/OneAndOnlyOneRelationship.png.a8df8e27606e80c633fffe84a7082a01.png"></a>، أي أن الجانب واحد one side إلزامي، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد فقط one and only one:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93930" href="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleOfAOneAndOnlyOneMandatoryRelationshipSymbol.thumb.png.c6c8511811efca6c5d6e65e0f73cba05.png" rel=""><img alt="ExampleOfAOneAndOnlyOneMandatoryRelationshipSymbol.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93930" data-unique="daqx45sn8" src="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleOfAOneAndOnlyOneMandatoryRelationshipSymbol.thumb.thumb.png.205bf1ba3f767d44c424b5aef0de5f40.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يوضِّح الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78936" href="https://academy.hsoub.com/uploads/monthly_2021_10/OneToManyMandatoryRelationship.png.8d46cde3fca10ddb18d8387dfef2f7a2.png" rel=""><img alt="OneToManyMandatoryRelationship.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78936" data-unique="85d6g6crc" src="https://academy.hsoub.com/uploads/monthly_2021_10/OneToManyMandatoryRelationship.png.8d46cde3fca10ddb18d8387dfef2f7a2.png"></a> رمز علاقة واحد إلى متعدد one to many حيث يكون الجانب المتعدد many side إلزاميًا. ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد إلى متعدد:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93931" href="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleOfAOneToManyMandatoryRelationshipSymbol.thumb.png.eb76cb1adfcfffd95239d23adbfc844a.png" rel=""><img alt="ExampleOfAOneToManyMandatoryRelationshipSymbol.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93931" data-unique="idwp2pjb9" src="https://academy.hsoub.com/uploads/monthly_2022_03/ExampleOfAOneToManyMandatoryRelationshipSymbol.thumb.thumb.png.c7732483c9d15c453cde064401c72e33.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	رأينا حتى الآن أن الجانب الداخلي من رمز العلاقة الموضَّح على الجانب الأيسر من الرمز في الشكل الآتي يمكن أن يكون له تعددية العلاقة cardinality قيمتها 0 وارتباط connectivity متعدد كما هو موضَّح على الجانب الأيمن من الرمز في الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78938" href="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOrMany1.png.51c035294b4358f610c3fa0301e5372d.png" rel=""><img alt="ZeroOrMany1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78938" data-unique="smvti0adq" src="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOrMany1.png.51c035294b4358f610c3fa0301e5372d.png"></a>، أو ارتباط قيمته واحد وهو غير موضَّح في الشكل.
</p>

<p>
	لا يمكن أن يكون لديه ارتباط قيمته 0، كما هو موضَّح في الشكل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="78939" href="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOrMany2.png.0c441cdaeea287cafb822d1e7290c4c0.png" rel=""><img alt="ZeroOrMany2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78939" data-unique="r2f13r8j5" src="https://academy.hsoub.com/uploads/monthly_2021_10/ZeroOrMany2.png.0c441cdaeea287cafb822d1e7290c4c0.png"></a>، حيث يمكن أن يكون الارتباط 1 فقط.
</p>

<p>
	تُظهِر رموز الارتباط الحدود القصوى، فإذا أظهر رمز الارتباط على الجانب الأيسر القيمة 0، فلن يكون هناك ارتباط بين الجداول، وفيما يلي طريقة قراءة رمز العلاقة مثل الرمز الموجود في الشكل الآتي:
</p>

<ul>
<li>
		يجب العثور على معرِّف العميل CustID في جدول الطلبات Order table وفي جدول العملاء Customer table أيضًا بحد أدنى 0 وبحد أقصى 1 مرة.
	</li>
	<li>
		تعني القيمة 0 أن معرِّف العميل CustID في جدول الطلبات Order table قد تكون قيمته فارغة null.
	</li>
	<li>
		تشير القيمة 1 الموجودة أقصى اليسار -أي قبل القيمة 0 مباشرةً التي تمثل الارتباط- إلى أنه إذا كان هناك معرِّف عميل CustID في جدول الطلبات Order table، فيمكن وجود هذا المعرِّف في جدول العملاء Customer table مرةً واحدةً فقط.
	</li>
	<li>
		يمكنك افتراض شيئين عندما ترى الرمز 0 لتعددية العلاقة cardinality:
		<ul>
<li>
				يسمح المفتاح الخارجي FK في جدول الطلبات Order table بوجود القيم الفارغة.
			</li>
			<li>
				ليس المفتاح الخارجي FK جزءًا من المفتاح الرئيسي PK، لأنه يجب ألا تحتوي المفاتيح الرئيسية على قيم فارغة null.
			</li>
		</ul>
</li>
</ul>
<p style="text-align: center;">
	<img alt="TheRelationshipBetweenACustomerTableAndAnOrderTable.png.18110401f1dd6c4781b8fd0426266bfa.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93932" data-unique="r94welgo6" src="https://academy.hsoub.com/uploads/monthly_2022_03/TheRelationshipBetweenACustomerTableAndAnOrderTable.png.18110401f1dd6c4781b8fd0426266bfa.png.fa08ad5e421d9c1ade98088512d4ece9.png" style="width: 450px; height: auto;"></p>

<h2>
	تمارين
</h2>

<p>
	اقرأ الوصف التالي ثم أجب عن الأسئلة:
</p>

<p>
	صُمِّمت قاعدة بيانات نادي السباحة في الشكل الآتي لتحتوي على معلومات حول الطلاب students المسجَلين enrolled في صفوف السباحة، حيث خُزِّنت المعلومات التالية: الطلاب students، والتسجيل enrollment، وصفوف السباحة swim classes، والمسابح pools التي تقام فيها الصفوف، ومدربو instructors صفوف السباحة، والمستويات levels المختلفة من صفوف السباحة.
</p>

<p>
	استخدم الشكل التالي للإجابة على الأسئلة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="78932" href="https://academy.hsoub.com/uploads/monthly_2021_10/SwimClubDatabase.png.b1905b8adb93b106bbce37cb387dccf3.png" rel=""><img alt="SwimClubDatabase.png" class="ipsImage ipsImage_thumbnailed" data-fileid="78932" data-unique="tbc9ouvtl" src="https://academy.hsoub.com/uploads/monthly_2021_10/SwimClubDatabase.thumb.png.76b66d9fab8a07655546c25672191be6.png"></a>
</p>

<p>
	حُدِّدت المفاتيح الرئيسية primary keys أدناه، وعُرِّفت أنواع البيانات التالية في خادم SQL Server.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5711_17" style="">
<span class="pun">**</span><span class="pln">tblLevels</span><span class="pun">**</span><span class="pln">
</span><span class="typ">Level</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Identity</span><span class="pln"> PK
</span><span class="typ">ClassName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> nulls are </span><span class="kwd">not</span><span class="pln"> allowed

</span><span class="pun">**</span><span class="pln">tblPool</span><span class="pun">**</span><span class="pln">
</span><span class="typ">Pool</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Identity</span><span class="pln"> PK
</span><span class="typ">PoolName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> nulls are </span><span class="kwd">not</span><span class="pln"> allowed
</span><span class="typ">Location</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">30</span><span class="pln">

</span><span class="pun">**</span><span class="pln">tblStaff</span><span class="pun">**</span><span class="pln">
</span><span class="typ">StaffID</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Identity</span><span class="pln"> PK
</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln">
</span><span class="typ">MiddleInitial</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">3</span><span class="pln">
</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">30</span><span class="pln">
</span><span class="typ">Suffix</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">3</span><span class="pln">
</span><span class="typ">Salaried</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Bit</span><span class="pln">
</span><span class="typ">PayAmount</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> money

</span><span class="pun">**</span><span class="pln">tblClasses</span><span class="pun">**</span><span class="pln">
</span><span class="typ">LessonIndex</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Identity</span><span class="pln"> PK
</span><span class="typ">Level</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> FK
</span><span class="typ">SectionID</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln">
</span><span class="typ">Semester</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">TinyInt</span><span class="pln">
</span><span class="typ">Days</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln">
</span><span class="typ">Time</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> datetime </span><span class="pun">(</span><span class="pln">formatted </span><span class="kwd">for</span><span class="pln"> time</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Pool</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> FK
</span><span class="typ">Instructor</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> FK
</span><span class="typ">Limit</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">TinyInt</span><span class="pln">
</span><span class="typ">Enrolled</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">TinyInt</span><span class="pln">
</span><span class="typ">Price</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> money

</span><span class="pun">**</span><span class="pln">tblEnrollment</span><span class="pun">**</span><span class="pln">
</span><span class="typ">LessonIndex</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> FK
SID </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> FK </span><span class="pun">(</span><span class="typ">LessonIndex</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> SID</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Primary</span><span class="pln"> </span><span class="typ">Key</span><span class="pln">
</span><span class="typ">Status</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">30</span><span class="pln">
</span><span class="typ">Charged</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> bit
</span><span class="typ">AmountPaid</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> money
</span><span class="typ">DateEnrolled</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> datetime

</span><span class="pun">**</span><span class="pln">tblStudents</span><span class="pun">**</span><span class="pln">
SID </span><span class="pun">–</span><span class="pln"> </span><span class="typ">Identity</span><span class="pln"> PK
</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln">
</span><span class="typ">MiddleInitial</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">3</span><span class="pln">
</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">30</span><span class="pln">
</span><span class="typ">Suffix</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">3</span><span class="pln">
</span><span class="typ">Birthday</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> datetime
</span><span class="typ">LocalStreet</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">30</span><span class="pln">
</span><span class="typ">LocalCity</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">20</span><span class="pln">
</span><span class="typ">LocalPostalCode</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">6</span><span class="pln">
</span><span class="typ">LocalPhone</span><span class="pln"> </span><span class="pun">–</span><span class="pln"> text </span><span class="lit">10</span></pre>

<p>
	طبّق هذا المخطط في خادم SQL Server، أو باستخدام نظام access وعندها ستحتاج إلى اختيار أنواع بيانات قابلة للموازنة.
</p>

<ol>
<li>
		اشرح قواعد العلاقة relationship rules لكل علاقة مثل العلاقة بين الجدولين tblEnrollment وtblStudents التي تمثِّل إمكانية تسجيل الطالب في صفوف سباحة متعددة.
	</li>
	<li>
		حدّد عددية cardinality كل علاقة بافتراض القواعد التالية:
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		قد يكون أو لا يكون للمسبح pool صفًا class للسباحة.
	</li>
	<li>
		يجب ارتباط جدول المستويات levels table دائمًا بصف سباحة واحد على الأقل.
	</li>
	<li>
		قد لا يدرِّس جدول فريق التدريب staff table أيَّ صف سباحة.
	</li>
	<li>
		يجب تسجيل جميع الطلاب في صف سباحة واحد على الأقل.
	</li>
	<li>
		يجب احتواء صف السباحة على طلاب مسجلين فيه.
	</li>
	<li>
		يجب امتلاك صف السباحة على مسبح صالح.
	</li>
	<li>
		قد لا يُعيَّن مدرب لصف السباحة.
	</li>
	<li>
		يجب ارتباط صف السباحة دائمًا بمستوى موجود.
	</li>
</ul>
<ol start="3">
<li>
		حدّد الجداول الضعيفة، والجداول القوية التي شرحناها في مقالٍ سابق.
	</li>
	<li>
		حدّد الجداول المُعرَّفة identifying، والجداول غير المُعرَّفة non-identifying.
	</li>
</ol>
<p>
	ترجمة -وبتصرف- للفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-9-integrity-rules-and-constraints/" rel="external nofollow">Integrity Rules and Constraints</a> لصاحبَيه Adrienne Watt و Nelson Eng من كتاب <a href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A-er-%D8%B9%D9%86%D8%AF-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r545/" rel="">نمذجة الكيان العلاقي ER عند تصميم قواعد البيانات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D9%88%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A9-er-%D9%84%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r543/" rel="">نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب ت<a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">صميم قواعد البيانات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/databases/%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%A7%D9%8A%D8%A7-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7-r520/" rel="">خصائص قواعد البيانات والمزايا التي تقدمها</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">544</guid><pubDate>Mon, 11 Oct 2021 14:08:00 +0000</pubDate></item><item><title>&#x646;&#x645;&#x648;&#x630;&#x62C; &#x627;&#x644;&#x643;&#x64A;&#x627;&#x646; &#x648;&#x627;&#x644;&#x639;&#x644;&#x627;&#x642;&#x629; ER &#x644;&#x62A;&#x645;&#x62B;&#x64A;&#x644; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x648;&#x62A;&#x62E;&#x632;&#x64A;&#x646;&#x647;&#x627; &#x641;&#x64A; &#x642;&#x627;&#x639;&#x62F;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D9%88%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A9-er-%D9%84%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r543/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/615c02259d5fd_---(1).png.4ed2d84a1b275bda8d0f4cef140064eb.png" /></p>
<p>
	ظهر نموذج الكيان والعلاقة entity relationship - أو ER اختصارًا- لتمثيل البيانات منذ أكثر من 35 عام، وهو مناسب تمامًا لنمذجة البيانات للاستخدام مع <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قواعد البيانات</a>، وذلك لأنه ذو طبيعة مجردة إلى حد ما، وسهل المناقشة والشرح.
</p>

<p>
	تترجم نماذج الكيان والعلاقة للبيانات إلى علاقات بسهولة، كما تسمى تخطيط الكيان والعلاقة ER schema، حيث تُمثَّل بواسطة مخططات الكيان والعلاقة ER diagrams.
</p>

<p>
	تعتمد عملية إنشاء نماذج الكيان والعلاقة للبيانات ER modelling على مفهومين هما:
</p>

<ul>
	<li>
		<strong>الكيانات Entities</strong>: وتُعرَّف على أنها الجداول التي تحتوي على معلومات خاصّة -أي بيانات-.
	</li>
	<li>
		<strong>العلاقات Relationships</strong>: وتُعرَّف على أنها الارتباطات أو التفاعلات بين الكيانات.
	</li>
</ul>

<p>
	فيما يلي مثال على كيفية دمج هذين المفهومين في نموذج الكيان والعلاقة: يكون في قولنا "يدرِّس البروفيسور دورة أنظمة قواعد البيانات" الكيان هو كل من البروفيسور، ودورة أنظمة قواعد البيانات؛ أما العلاقة فهي كلمة يدرِّس.
</p>

<p>
	سنستخدم في هذا المقال قاعدة بيانات تسمى الشركة COMPANY لتوضيح مفاهيم نموذج الكيان والعلاقة، حيث تحتوي على معلومات حول الموظفين employees، والأقسام departments، والمشاريع projects، كما يجب ملاحظة النقاط التالية:
</p>

<ul>
	<li>
		هناك عدة أقسام في الشركة، ولكل منها قسم مُعرِّف فريد، واسم، وموقع المكتب، وموظف معين يدير القسم.
	</li>
	<li>
		يتحكم القسم في عدد من المشاريع، ولكل منها اسم فريد، ورقم فريد، وميزانية.
	</li>
	<li>
		كل موظف له اسم، ورقم تعريف، وعنوان، وراتب، وتاريخ ميلاد، كما يُعيَّن الموظف في قسم واحد، ويمكنه الانضمام لعدة مشاريع، كما نحتاج إلى تسجيل تاريخ بدء الموظف في كل مشروع، ومعرفة المشرف المباشر لكل موظف.
	</li>
	<li>
		نريد تتبّع المُعالِين لكل موظف، حيث يملك كل مُعال اسم، وتاريخ ميلاد، وعلاقته بالموظف.
	</li>
</ul>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<h2>
	الكيان ومجموعة الكيان ونوع الكيان
</h2>

<p>
	الكيان entity هو كائن في العالم الحقيقي له وجود مستقل، كما يمكن تمييزه عن الكائنات الأخرى، وقد يكون هذا الكيان:
</p>

<ul>
	<li>
		كائن له وجود مادي physical existence، مثل: محاضر، وطالب، وسيارة.
	</li>
	<li>
		كائن له وجود مفاهيمي conceptual existence، مثل دورة، ووظيفة، ومنصب.
	</li>
</ul>

<p>
	يمكن تصنيف الكيانات بناءً على قوتها، حيث يُعَدّ الكيان ضعيفًا في الحالات التالية:
</p>

<ul>
	<li>
		وجوده غير ممكن بدون علاقة مع كيان آخر.
	</li>
	<li>
		مفتاحه الرئيسي مشتق من المفتاح الرئيسي للكيان الأب.
	</li>
	<li>
		يُعَدّ جدول الزوج Spouse في قاعدة بيانات الشركة كيانًا ضعيفًا لأن مفتاحه الرئيسي يعتمد على جدول الموظف، أي لن يكون سجل الزوج موجودًا إذا لم يتواجد سجل الموظف المقابل.
	</li>
</ul>

<p>
	يُعَدّ الكيان قويًا إذا كان يمكن أن يوجد مستقلًا عن جميع الكيانات المرتبطة به.
</p>

<ul>
	<li>
		الأنوية Kernels هي كيانات قوية.
	</li>
	<li>
		يُعَدّ الجدول كيانًا قويًا إذا لم يحتوي على مفتاح خارجي foreign key، أو إذا احتوى على مفتاح خارجي يقبل القيم الفارغة null.
	</li>
</ul>

<p>
	يجب معرفة مصطلح آخر، وهو نوع الكيان entity type الذي يحدِّد تجميعةً من الكيانات المتشابهة، كما تُعَدّ مجموعة الكيان entity set تجميعةً من نوع الكيان entity type في وقت معيَّن.
</p>

<p>
	يُمثَّل نوع الكيان في مخطط الكيان والعلاقة entity relationship diagram -أي ERD اختصارًا- في صندوق، فمثلًا، نوع الكيان في الشكل التالي هو موظف EMPLOYEE.
</p>

<p style="text-align: center;">
	<img alt="EntitySet.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93916" data-unique="20cjfp9i6" style="width: 550px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/EntitySet.png.b1c3417547de3f2215ef77b73f1b4123.png">
</p>

<p style="text-align: center;">
	الشكل 1: نوع الكيان هو الموظف
</p>

<h2>
	ارتباط الوجود
</h2>

<p>
	يعتمد وجود الكيان على وجود الكيانات ذات الصلة به، ويُعَدّ الكيان ارتباطي الوجود Existence dependency إذا كان يحتوي على مفتاح خارجي إلزامي -أي سمة مفتاح خارجي لا يمكن أن تكون فارغة null-، فمثلًا، يكون في قاعدة بيانات الشركة COMPANY كيان الزوج Spouse معتمدًا على وجود كيان الموظف.
</p>

<h2>
	أنواع الكيانات
</h2>

<p>
	يجب أيضًا أن تكون على دراية بأنواع الكيانات المختلفة بما في ذلك الكيانات المستقلة independent entities، والكيانات المعتمِدة dependent entities، والكيانات المميَّزة characteristic entities.
</p>

<h3>
	الكيانات المستقلة
</h3>

<p>
	تُعَدّ الكيانات المستقلة Independent entities -والتي يشار إليها أيضًا باسم الأنوية kernels- العمود الفقري لقاعدة البيانات، إذ تستند عليه الجداول الأخرى، ولها الخصائص التالية:
</p>

<ul>
	<li>
		هم اللبنات الأساسية لقاعدة البيانات.
	</li>
	<li>
		قد يكون المفتاح الرئيسي primary key بسيطًا، أو مركبًا.
	</li>
	<li>
		لا يمكن أن يكون المفتاح الرئيسي مفتاحًا خارجيًا.
	</li>
	<li>
		لا تعتمد على أي كيان آخر في وجودها.
	</li>
</ul>

<p>
	إذا عدنا إلى قاعدة بيانات الشركة COMPANY الخاصة بنا، فتتضمن أمثلة الكيانات المستقلة جدول العميل Customer table، أو جدول الموظف Employee table، أو جدول المنتَج Product table.
</p>

<h3>
	الكيانات المعتمِدة
</h3>

<p>
	تستند الكيانات المعتمِدة Dependent entities - والتي يشار إليها باسم الكيانات المشتقة derived entities أيضًا- على جداول أخرى حتى يكون لها معنى، ولها الخصائص التالية:
</p>

<ul>
	<li>
		تُستخدَم الكيانات المعتمِدة لربط نواتين معًا.
	</li>
	<li>
		يَعتمد وجودها على وجود جدولين أو أكثر في قاعدة البيانات، حيث لا يمكن وجود كيانات معتمِدة في قاعدة بيانات تحتوي على جدول واحد فقط.
	</li>
	<li>
		تُنشِئ علاقات (متعدد إلى متعدد) جداول ترابطية associative tables بمفتاحين خارجيين على الأقل.
	</li>
	<li>
		قد تحتوي على سمات أخرى.
	</li>
	<li>
		يحدِّد كل مفتاح خارجي جدولًا مرتبطًا بالكيان نفسه.
	</li>
	<li>
		هناك ثلاثة خيارات للمفتاح الرئيسي:
	</li>
</ul>

<ol>
	<li>
		استخدِم مزيجًا من المفاتيح الخارجية للجداول المرتبطة إذا كانت فريدة.
	</li>
	<li>
		استخدِم مزيجًا من المفاتيح الخارجية وعمودًا مؤهِلًا.
	</li>
	<li>
		أنشِئ مفتاح رئيسي بسيط جديد.
	</li>
</ol>

<h3>
	الكيانات المتميزة
</h3>

<p>
	توفر الكيانات المميَّزة Characteristic entities مزيدًا من المعلومات حول جدول آخر، ولهذه الكيانات الخصائص التالية:
</p>

<ul>
	<li>
		تمثِّل سمات متعددة القيم.
	</li>
	<li>
		تصِف كيانات أخرى.
	</li>
	<li>
		عادة ما يكون لديها علاقة علاقة واحد إلى متعدِّد one to many relationship.
	</li>
	<li>
		يُستخدَم المفتاح الخارجي foreign key لتحديد الجدول المميز characterized table.
	</li>
	<li>
		خيارات المفتاح الرئيسي هي:
	</li>
</ul>

<ol>
	<li>
		استخدِم مزيجًا من المفاتيح الخارجية وعمودًا مؤهِلًا.
	</li>
	<li>
		أنشِئ مفتاحًا رئيسيًا بسيطًا جديدًا في قاعدة بيانات الشركة COMPANY، والتي قد تشمل:
		<ul>
			<li>
				جدول الموظف Employee (المعرف <strong>EID</strong>، الاسم، العنوان، العمر، الراتب) - EID هو المفتاح الرئيسي البسيط.
			</li>
			<li>
				جدول هاتف الموظف EmployeePhone (معرف الموظف <strong>EID</strong>، رقم الهاتف)، EID هنا هو جزء من مفتاح رئيسي مركب، وهو مفتاح خارجي مرتبط بجدول الموظف السابق.
			</li>
		</ul>
	</li>
</ol>

<h2>
	السمات
</h2>

<p>
	يوصَف كل كيان بمجموعة من السمات attributes، فمثلًا، يمكن وصف كيان الموظف بالسمات التالية: الاسم، أو العنوان، أو تاريخ الميلاد، أو الراتب. تملك كل سمة اسمًا محدَّدًا، وترتبط بكيان معيَّن، وبمجال من القيم المسموحة التي يمكن أخذها، ولكن لا تُعرَض المعلومات حول مجال السمة في مخطط الكيان والعلاقة ERD.
</p>

<p>
	تمثَّل كل سمة في مخطط الكيان والعلاقة الموضح في الشكل التالي تمثيلًا بيضويًا مع اسم بداخله.
</p>

<p style="text-align: center;">
	<img alt="Attributes.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93917" data-unique="v61ufbclr" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Attributes.thumb.png.eb989a75759ab4ad71d61ad6d70e57ca.png">
</p>

<p style="text-align: center;">
	الشكل 2: تمثيل السِمات في نموذج العلاقات الكائني للبيانات
</p>

<h3>
	أنواع السمات
</h3>

<p>
	هناك أنواع قليلة من السمات التي يجب أن تكون على دراية بها، ويجب ترك بعضها كما هي، لكن يحتاج بعضها الآخر إلى تعديل ليسهل تمثيلها في النموذج العلائقي relational model، وسيناقش هذا القسم أنواع السمات؛ أما لاحقًا فسنناقش تعديل السمات لتلائم النموذج العلائقي بصورة صحيحة.
</p>

<h3>
	السمات البسيطة
</h3>

<p>
	السمات البسيطة Simple attributes هي السمات المستمدة من مجالات القيمة الذَرية، ويطلق عليها أيضًا اسم السمات وحيدة القيمة single-valued، فمثلًا، تجد في قاعدة بيانات الشركة COMPANY أن الاسم والعمر هما نموذجان للسمات البسيطة.
</p>

<h3>
	السمات المركبة
</h3>

<p>
	السمات المركَّبة Composite attributes هي التي تتكون من مجموعة متسلسلة هرميًا من السمات، فمثلًا، قد يتكون العنوان باستخدام مثال قاعدة البيانات الشركة COMPANY والموضَّح في الشكل التالي، من رقم الشارع، واسم الشارع، واسم الحي، حيث يُمثَّل بالطريقة التالية: العنوان = {59 + "شارع خالد بن الوليد" + "حي القنوات"}.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93918" href="https://academy.hsoub.com/uploads/monthly_2022_03/Simple-and-Composite-Attributes.thumb.png.519562374077c20f9406e58cd22c5078.png" rel=""><img alt="Simple-and-Composite-Attributes.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93918" data-unique="9sh92qoy4" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Simple-and-Composite-Attributes.thumb.thumb.png.3135f32ae96963d14973ad80667c9926.png"></a>
</p>

<p style="text-align: center;">
	الشكل 3: مثال للسمات المركبة
</p>

<h3>
	السمات متعددة القيم
</h3>

<p>
	السمات متعددة القيم Multivalued attributes هي التي تحمل مجموعةً من القيم لكل كيان، فمثلًا، يمكن أن تحمل سمة الدرجات العلمية degrees لموظف معيَّن في قاعدة بيانات الشركة COMPANY العديد من القيم، مثل: دكتوراه PhD، الجامعة العربية للعلوم، إجازة في العلوم BSc كما هو موضَّح في الشكل التالي:
</p>

<p style="text-align: center;">
	<img alt="Multivalued-Attribute.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93919" data-unique="bslw5kyjs" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Multivalued-Attribute.thumb.png.718cdfb44b5a98ba58d2484de8e9b574.png">
</p>

<p style="text-align: center;">
	الشكل 4: مثال على السمات متعددة القيم
</p>

<h3>
	السمات المشتقة
</h3>

<p>
	السمات المشتقة Derived attributes هي سمات تحتوي على قيم محسوبة من سمات أخرى، فمثلًا، يمكن اشتقاق العمر في الشكل التالي من تاريخ الميلاد، يسمى تاريخ الميلاد في هذه الحالة سمة مخزنة stored attribute، وهي التي تُحفظ ماديًا لقاعدة البيانات.
</p>

<p style="text-align: center;">
	<img alt="Derived-Attribute.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93921" data-unique="rnm4lnjrh" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Derived-Attribute.thumb.png.fe30496dc3417ea7807a0b018f8ab509.png">
</p>

<p style="text-align: center;">
	الشكل 5: مثال على السِمات المشتقة
</p>

<h2>
	المفاتيح
</h2>

<p>
	يُعَدّ المفتاح key أحد القيود المهمة التي يجب وجودها في جميع الكيانات، وهو عبارة عن سمة أو مجموعة من السمات التي تُستخدم قيمها لتعريف كيان منفصل individual entity تعريفًا فريدًا في مجموعة الكيانات.
</p>

<h3>
	أنواع المفاتيح
</h3>

<p>
	هناك عدة أنواع من المفاتيح، نذكر منها:
</p>

<h4>
	المفتاح المرشح
</h4>

<p>
	يُعَدّ المفتاح المرشَّح candidate key مفتاحًا بسيطًا أو مركَّبًا، كما يكون فريدًا وبسيطًا، وهو فريد لأنه لا يمكن أن يكون لصفين المفتاح المرشَّح نفسه في الجدول في أيّ وقت، فمثلًا، تكون المفاتيح المرشَّحة الممكنة في كيان الموظف الموجود في قاعدة البيانات COMPANY، والذي يتكون من السمات التالية: معرِّف الموظف، الاسم الأول، اسم العائلة، رقم التأمين الاجتماعي SIN، العنوان، الهاتف، تاريخ الميلاد، الراتب، معرِّف القسم، هي ما يلي:
</p>

<ul>
	<li>
		رقم التأمين الاجتماعي SIN، أو معرف الموظف EID.
	</li>
	<li>
		الاسم الأول واسم العائلة، بافتراض عدم وجود شخصين في الشركة لهما الاسم نفسه.
	</li>
	<li>
		اسم العائلة ومعرِّف القسم، بافتراض عدم عمل شخصين لهما اسم العائلة نفسه في القسم نفسه.
	</li>
</ul>

<h4>
	المفتاح المركب
</h4>

<p>
	يتكون المفتاح المركَّب composite key من سمتين أو أكثر، ويستحسن الإبقاء على الحد الأدنى من السِمات فيه. باستخدام المثال السابق نفسه، تكون المفاتيح المركَّبة الممكنة هي:
</p>

<ul>
	<li>
		الاسم الأول واسم العائلة، بافتراض عدم وجود شخصين في الشركة لهما الاسم نفسه.
	</li>
	<li>
		اسم العائلة ومعرِّف القسم، بافتراض عدم عمل شخصين لهما اسم العائلة نفسه في القسم نفسه.
	</li>
</ul>

<h4>
	المفتاح الرئيسي
</h4>

<p>
	المفتاح الرئيسي primary key هو مفتاح مرشَّح candidate key يُحدَّد بواسطة مصمم قاعدة البيانات لاستخدامه على أساس آلية تعريف لمجموعة الكيانات بأكملها، كما يجب أن يُحدِّد أسطر الجدول تحديدًا فريدًا، ولا يمكن تركه فارغًا.
</p>

<p>
	يُشار إلى المفتاح الرئيسي في نموذج الكيان والعلاقة ER model عن طريق وضع خط تحت السمة التي تُمثِّله.
</p>

<ul>
	<li>
		يُحدَّد مفتاح مرشِّح بواسطة مصمم قاعدة البيانات لتحديد أسطر الجدول تحديدًا فريدًا، ولا يمكن تركه فارغًا.
	</li>
	<li>
		يُختار مفتاح معيِّن من قِبَل مصمم قاعدة البيانات لاستخدامه على أساس آلية تعريف لمجموعة الكيانات بأكملها، ويُشار إلى هذا المفتاح بالمفتاح الرئيسي primary key، كما يُشار إليه عن طريق وضع خط تحت السمة الممثِّلة له في نموذج الكيان والعلاقة ER model.
	</li>
</ul>

<p>
	إذا أخذنا المثال التالي، يتكون كل صف في جدول الموظف من (<code>EID</code>، الاسم الأول، اسم العائلة، SIN، العنوان، الهاتف، تاريخ الميلاد، الراتب، معرف القسم)، فإن المفتاح الرئيسي هو EID.
</p>

<h4>
	المفتاح الثانوي
</h4>

<p>
	المفتاح الثانوي secondary key هو سمة تُستخدَم استخدامًا صارمًا لأغراض الاسترجاع، ويمكن أن يكون هذا المفتاح مركبًا من عدة سمات مثل أن يتكون من الهاتف واسم العائلة معًا.
</p>

<h4>
	المفتاح البديل
</h4>

<p>
	المفاتيح البديلة Alternate keys هي جميع المفاتيح المرشَّحة التي لم تُستخدَم على أساس مفتاح رئيسي.
</p>

<h4>
	المفتاح الخارجي
</h4>

<p>
	يُعَدّ المفتاح الخارجي foreign key -أو FK اختصارًا- سمةً موجودةً في جدول معيَّن بحيث تشير إلى المفتاح الرئيسي في جدول آخر، أو يمكن تركه فارغًا، ويجب أن تكون كل من المفاتيح الخارجية والرئيسية من نوع البيانات نفسه، فمثلًا يُمثِّل مُعرِّف القسم DepartmentID المفتاح الخارجي ضمن قاعدة بيانات الشركة COMPANY، أي كما يلي:
</p>

<ul>
	<li>
		جدول الموظف Employee (معرف الموظف EID ، الاسم الأول، اسم العائلة، رقم التأمين الاجتماعي SIN، العنوان، الهاتف، تاريخ الميلاد، الراتب، معرف القسم)
	</li>
</ul>

<h3>
	القيم الفارغة Nulls
</h3>

<p>
	تُعَدّ القيمة الفارغة Null رمزًا خاصًا ليس له علاقة بنوع بيانات محدَّد، مما يعني أنه إما غير معروف unknown أو غير قابل للتطبيق inapplicable، ولا يعني صفرًا أو فراغًا، ومن صفات هذه القيمة:
</p>

<ul>
	<li>
		لا توجد بيانات محددة لإدخالها.
	</li>
	<li>
		لا يمكن تواجدها في المفتاح الرئيسي.
	</li>
	<li>
		يجب تجنبها في جميع السمات الأخرى.
	</li>
	<li>
		يمكنها تمثيل ما يلي:
	</li>
	<li>
		قيمة سمة غير معروفة.
	</li>
	<li>
		قيمة سمة معروفة، ولكنها مفقودة.
	</li>
	<li>
		شرط "غير قابل للتطبيق".
	</li>
	<li>
		يمكنها تسبيب العديد من المشاكل عند استخدام بعض الدوال، مثل: <code>COUNT</code>، و<code>AVERAGE</code>، و<code>SUM</code>.
	</li>
	<li>
		يمكنها تسبيب مشاكل منطقية عند ربط الجداول العلائقية ببعضها البعض.
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			<strong>ملاحظة</strong>: تكون نتيجة عملية الموازنة القيمة الفارغة null عندما يكون أحد الحدود قيمةً فارغةً null، كما تكون النتيجة قيمةً فارغةً null في العمليات الحسابية إذا كان أحد الحدود قيمةً فارغةً null باستثناء الدوال التي تتجاهل هذه القيمة.
		</p>
	</div>
</blockquote>

<h3>
	مثال لكيفية استخدام القيمة الفارغة null
</h3>

<p>
	استخدم جدول الرواتب Salary_tbl الموجود في الشكل التالي لمعرفة كيفية استخدام القيمة الفارغة null.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				emp#
			</th>
			<th>
				JopName
			</th>
			<th>
				Salary
			</th>
			<th>
				Commission
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				E10
			</td>
			<td>
				Sales
			</td>
			<td>
				12500
			</td>
			<td>
				32090
			</td>
		</tr>
		<tr>
			<td>
				E11
			</td>
			<td>
				Null
			</td>
			<td>
				25000
			</td>
			<td>
				8000
			</td>
		</tr>
		<tr>
			<td>
				E12
			</td>
			<td>
				Sales
			</td>
			<td>
				44000
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				E13
			</td>
			<td>
				Sales
			</td>
			<td>
				44000
			</td>
			<td>
				Null
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	جدول الرواتب فيه أحد أعمدته قيمة فارغة null
</p>

<p>
	على أساس خطة أولى، إبدأ بإيجاد جميع الموظفين في عمود الموظف emp#‎ في قسم المبيعات Sales تحت عمود اسم الوظيفة jobName، والذين تزيد رواتبهم salary بالإضافة إلى عمولتهم commission عن 30000.
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted" id="ips_uid_4581_7" style=""><span class="pln">SELECT emp</span><span class="com"># FROM Salary_tbl</span><span class="pln">
WHERE jobName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Sales</span><span class="pln"> AND
</span><span class="pun">(</span><span class="pln">commission </span><span class="pun">+</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">30</span><span class="pun">,</span><span class="lit">000</span></pre>

<p>
	يكون ناتج العملية أعلاه الموظفَين E10، وE12، إذ لا تتضمن هذه النتيجة الموظف E13 بسبب القيمة الفارغة null في عمود العمولة commission، حيث ستكون النتيجة القيمة الفارغة null عند جمع الراتب مع العمولة، لذا سنحتاج إلى إلقاء نظرة على الحقول بصورة منفصلة للتأكد من تضمين الصف الذي يحتوي على القيمة الفارغة null، كما هو مبين في الحل أدناه.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4581_9" style=""><span class="pln">SELECT emp</span><span class="com"># FROM Salary_tbl</span><span class="pln">
WHERE jobName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Sales</span><span class="pln"> AND
  </span><span class="pun">(</span><span class="pln">commission </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">30000</span><span class="pln"> OR
  salary </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">30000</span><span class="pln"> OR
  </span><span class="pun">(</span><span class="pln">commission </span><span class="pun">+</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">30</span><span class="pun">,</span><span class="lit">000</span><span class="pln"> </span></pre>

<p>
	سيكون ناتج العملية أعلاه هو الموظفِين E10، وE12، وE13.
</p>

<h3>
	العلاقات
</h3>

<p>
	العلاقات Relationships هي الرابط الذي يربط الجداول ببعضها البعض في قاعدة البيانات، وتُستخدَم لربط المعلومات ذات الصلة بين الجداول.
</p>

<p>
	تعتمد قوة العلاقة Relationship strength على كيفية تعريف المفتاح الرئيسي للكيانات المترابطة، إذ تُعَدّ العلاقة ضعيفة weak، أو غير محددة non-identifying إذا كان المفتاح الرئيسي للكيان المرتبط لا يحتوي على المفتاح الرئيسي للكيان الأب parent entity. وتتضمن قاعدة بيانات الشركة Company بعض الأمثلة التالية:
</p>

<ul>
	<li>
		جدول العميل Customer يحوي الحقلين التاليين:
		<ul>
			<li>
				CustID رقم العميل.
			</li>
			<li>
				CustName اسم العميل.
			</li>
		</ul>
	</li>
	<li>
		جدول الطلب Order يحوي الحقول التالية:
		<ul>
			<li>
				OrderID رقم الطلب.
			</li>
			<li>
				CustID رقم العميل.
			</li>
			<li>
				Date تاريخ الطلب.
			</li>
		</ul>
	</li>
</ul>

<p>
	يحتوي المفتاح الرئيسي للكيان المرتبط في العلاقة القوية أو المحددة على المفتاح الرئيسي للكيان الأب، مثل:
</p>

<ul>
	<li>
		جدول الدورة التدريبية Course يحوي الحقول التالي:
		<ul>
			<li>
				CrsCode رمز الدورة.
			</li>
			<li>
				DeptCode رمز القسم.
			</li>
			<li>
				Description وصف الدورة.
			</li>
		</ul>
	</li>
	<li>
		جدول الصف Class يحوي الحقول التالية:
		<ul>
			<li>
				CrsCode رمز الدورة.
			</li>
			<li>
				Section القسم.
			</li>
			<li>
				ClassTime وقت الصف.
			</li>
		</ul>
	</li>
</ul>

<h3>
	أنواع العلاقات
</h3>

<p>
	هناك عدة أنواع من العلاقات منها:
</p>

<h4>
	علاقة واحد إلى متعدد
</h4>

<p>
	تُعَدّ علاقة واحد إلى متعدِّد one to many -أو ‎1:M اختصارًا- الأساس في أي تصميم لقاعدة البيانات العلائقية، وتوجد في جميع بيئات قواعد البيانات العلائقية، فمثلًا، يحتوي القسم الواحد على العديد من الموظفين، ويوضِّح الشكل التالي علاقة أحد هؤلاء الموظفين بالقسم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93922" href="https://academy.hsoub.com/uploads/monthly_2022_03/One-to-Many-Relationships.thumb.png.01d708da9bb1dc352a107cc8713c964f.png" rel=""><img alt="One-to-Many-Relationships.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93922" data-unique="dit876l5z" style="" src="https://academy.hsoub.com/uploads/monthly_2022_03/One-to-Many-Relationships.thumb.thumb.png.3fc78c9f883e9bd1747b367f7e40f1f8.png"></a>
</p>

<p style="text-align: center;">
	الشكل 6: علاقة واحد إلى متعدد
</p>

<h4>
	علاقة واحد إلى واحد
</h4>

<p>
	تُعَدّ علاقة واحد لواحد one to one -أو 1:1 اختصارًا- علاقة كيان واحد بكيان واحد آخر فقط، والعكس صحيح.
</p>

<p>
	يُعَدّ هذا النوع من العلاقات نوعًا نادرًا جدًا في تصميم قواعد البيانات العلائقية، ومن الممكن أن يشير وجود هذه العلاقة إلى انتماء كيانَين بالفعل إلى الجدول نفسه، فمثلًا، يكون الموظف في قاعدة بيانات الشركة COMPANY مرتبطًا بزوجة واحدة، وتكون الزوجة الواحدة مرتبطةً بموظف واحد.
</p>

<h4>
	علاقة متعدد إلى متعدد
</h4>

<p>
	ضع في بالك النقاط التالية عند التعامل مع علاقة متعدَِد إلى متعدَِد many to many -أو M:N اختصارًا-:
</p>

<ul>
	<li>
		لا يمكن تمثيلها بهذه الصورة -أي متعدَِد إلى متعدَِد- في النموذج العلائقي relational model.
	</li>
	<li>
		يمكن تحويلها إلى علاقتين من النوع واحد إلى متعدِّد.
	</li>
	<li>
		يمكن تنفيذها عن طريق كسرها لمجموعة علاقات من نوع واحد إلى متعدِّد.
	</li>
	<li>
		تنطوي على تنفيذ كيانات مركَّبة.
	</li>
	<li>
		تُنشِئ علاقتين أو أكثر من النوع واحد إلى متعدِّد.
	</li>
	<li>
		يجب أن يحتوي جدول الكيان المركَّب على المفاتيح الرئيسية للجداول الأصلية على الأقل.
	</li>
	<li>
		يحتوي جدول الربط على تكرارات متعددة لقيم المفتاح الخارجي.
	</li>
	<li>
		قد تُسنَد سمات إضافية حسب الحاجة.
	</li>
</ul>

<p>
	يمكنك تجنب المشاكل الموجودة في علاقة متعدِّد إلى متعدِّد عن طريق إنشاء كيان مركَّب composite entity، أو كيان جسري bridge entity، فمثلًا، يمكن للموظف العمل في العديد من المشاريع، أو يمكن أن يعمل في المشروع الواحد العديد من الموظفين، اعتمادًا على قواعد العمل؛ أو يمكن للطالب أخذ العديد من الدروس، كما يمكن للدرس الواحد أن يؤخذ بواسطة العديد من الطلاب.
</p>

<p>
	يوضِّح الشكل التالي جانبًا آخرًا من علاقة M:N، حيث يكون للموظف العديد من تواريخ البداية المتعلِّقة بمشاريع مختلفة، لذلك نحتاج إلى جدول ربط JOIN بحيث يحتوي على معرِّف الموظف EID، والرمز Code، وتاريخ البداية StartDate.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93923" href="https://academy.hsoub.com/uploads/monthly_2022_03/Many-to-Many-Relationships.thumb.png.ede92883363b0b4c71eb5945565e4718.png" rel=""><img alt="Many-to-Many-Relationships.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93923" data-unique="8l22epilf" style="" src="https://academy.hsoub.com/uploads/monthly_2022_03/Many-to-Many-Relationships.thumb.thumb.png.d06ebc90b8dce5c1ab591ba95acedb5c.png"></a>
</p>

<p style="text-align: center;">
	الشكل 7: للموظف العديد من تواريخ البدء المتعلقة بمشاريع مختلفة
</p>

<p>
	إليك مثال على تعيين علاقة ثنائية من نوع متعدِّد إلى متعدِّد M:N:
</p>

<ul>
	<li>
		حدِّد علاقتين لكل علاقة ثنائية من نوع متعدِّد إلى متعدِّد، حدِّد علاقتين.
	</li>
	<li>
		تمثل A، وB نوعَين من الكيانات المشاركة في R.
	</li>
	<li>
		أنشئ علاقة جديدة S لتمثيل R.
	</li>
	<li>
		تحتاج S أن تتضمن المفاتيح الرئيسية الخاصة بـ A، وB، حيث يمكن أن تكون هذه معًا المفتاح الرئيسي في الجدول S، أو يمكن أن تضاف لها سمة بسيطة أخرى في الجدول الجديد R لتكوين المفتاح الرئيسي.
	</li>
	<li>
		تكون مجموعة المفاتيح الرئيسية لـ A، وB المفتاح الرئيسي لـ S.
	</li>
</ul>

<h4>
	العلاقة الأحادية -أو التكرارية-
</h4>

<p>
	العلاقة الأحادية Unary relationship -والتي تسمى العلاقة التكرارية recursive أيضًا- هي العلاقة التي توجد فيها علاقة بين تكرارات مجموعة الكيانات نفسها، ويكون في هذه العلاقة المفتاحان الرئيسي والخارجي متماثلَين لكنهما يمثلان كيانين لهما أدوار مختلفة. تُعَدّ مجموعة الكيان مجموعةً من نوع مماثل من الكيانات.
</p>

<p style="text-align: center;">
	 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93924" href="https://academy.hsoub.com/uploads/monthly_2022_03/Unary-Relationships.png.a7494dc9f78dab77adeb650f3a0f7bf7.png" rel=""><img alt="Unary-Relationships.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93924" data-unique="tjvouqgnd" style="" src="https://academy.hsoub.com/uploads/monthly_2022_03/Unary-Relationships.thumb.png.0c9ebc870a3bd3901356baeac14ad490.png"></a>
</p>

<p style="text-align: center;">
	الشكل 8: العلاقات الأحادية (التكرارية)
</p>

<p>
	يمكن إنشاء عمود منفصل بحيث يشير إلى المفتاح الرئيسي لمجموعة الكيان نفسها في بعض كيانات العلاقة الأحادية.
</p>

<h4>
	العلاقة الثلاثية n-ary
</h4>

<p>
	العلاقة الثلاثية ternary relationship هي نوع من العلاقات يضمن إنشاء علاقة متعدِّد إلى متعدِّد بين ثلاثة جداول، والشكل التالي هو مثال عن هذه العلاقة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			<strong>ملاحظة</strong>: يشير مصطلح n-ary إلى جداول متعدِّدة في العلاقة، وتذكَّر أنّ N تكافئ many أي N = many.
		</p>
	</div>
</blockquote>

<ul>
	<li>
		لكل علاقة (n-ary) حيث n &gt; 2، أنشئ جدولًا جديدًا لتمثيل تلك العلاقة.
	</li>
	<li>
		المفتاح الرئيسي للجدول الجديد هو مزيج من المفاتيح الرئيسية للكيانات المشاركة التي تمثل الجانب المتعدِّد N.
	</li>
	<li>
		تملك جميع الكيانات المشاركة في معظم حالات علاقة n-ary الطرف المتعدِّد من جانبها.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93925" href="https://academy.hsoub.com/uploads/monthly_2022_03/Ternary-Mapping-Relationships.thumb.png.a8f851708b37bfe37f408c570bfa55b5.png" rel=""><img alt="Ternary-Mapping-Relationships.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93925" data-unique="lyx2n05yj" style="" src="https://academy.hsoub.com/uploads/monthly_2022_03/Ternary-Mapping-Relationships.thumb.thumb.png.59f71be676b1d67b0f59c74885af394d.png"></a>
</p>

<p style="text-align: center;">
	الشكل 9: العلاقة الثلاثية
</p>

<h2>
	تمارين
</h2>

<ol>
	<li>
		ما المفهومان اللذان يعتمد عليهما نموذج الكيان والعلاقة ER؟
	</li>
	<li>
		تتكون قاعدة البيانات في الشكل التالي من جدولين، لذلك أجب على الأسئلة التالية مستخدمًا هذا الشكل.
	</li>
</ol>

<p>
	جدول DIRECTOR:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				DIRNUM
			</th>
			<th>
				DIRNAME
			</th>
			<th>
				DIRDOB
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				100
			</td>
			<td>
				J_.Broadway
			</td>
			<td>
				01/08/39
			</td>
		</tr>
		<tr>
			<td>
				101
			</td>
			<td>
				J.Namath
			</td>
			<td>
				11/12/48
			</td>
		</tr>
		<tr>
			<td>
				102
			</td>
			<td>
				W.Blake
			</td>
			<td>
				06/15/44
			</td>
		</tr>
	</tbody>
</table>

<p>
	جدول PLAY:
</p>

<table>
	<thead>
		<tr>
			<th>
				PLAYNO
			</th>
			<th>
				PLAYNAME
			</th>
			<th>
				DIRNUM
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1001
			</td>
			<td>
				Cat on a cold bare roof
			</td>
			<td>
				102
			</td>
		</tr>
		<tr>
			<td>
				1002
			</td>
			<td>
				Hold the mayo, pass the bread
			</td>
			<td>
				101
			</td>
		</tr>
		<tr>
			<td>
				1003
			</td>
			<td>
				I never promised you coffee
			</td>
			<td>
				102
			</td>
		</tr>
		<tr>
			<td>
				1004
			</td>
			<td>
				Silly putty goes to Texas
			</td>
			<td>
				100
			</td>
		</tr>
		<tr>
			<td>
				1005
			</td>
			<td>
				See no sound, hear no sight
			</td>
			<td>
				101
			</td>
		</tr>
		<tr>
			<td>
				1006
			</td>
			<td>
				Starstruck in Biloxi
			</td>
			<td>
				102
			</td>
		</tr>
		<tr>
			<td>
				1007
			</td>
			<td>
				Stranger in parrot ice
			</td>
			<td>
				101
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	جداول التمرين
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4581_11" style=""><span class="lit">1.</span><span class="pln"> </span><span class="pun">حدِّد</span><span class="pln"> </span><span class="pun">المفتاح</span><span class="pln"> </span><span class="pun">الرئيسي</span><span class="pln"> </span><span class="pun">لكل</span><span class="pln"> </span><span class="pun">جدول.</span><span class="pln">
</span><span class="lit">2.</span><span class="pln"> </span><span class="pun">حدِّد</span><span class="pln"> </span><span class="pun">المفتاح</span><span class="pln"> </span><span class="pun">الخارجي</span><span class="pln"> </span><span class="pun">في</span><span class="pln"> </span><span class="pun">الجدول</span><span class="pln"> PLAY</span><span class="pun">.</span><span class="pln">
</span><span class="lit">3.</span><span class="pln"> </span><span class="pun">حدِّد</span><span class="pln"> </span><span class="pun">المفاتيح</span><span class="pln"> </span><span class="pun">المرشَّحة</span><span class="pln"> </span><span class="pun">في</span><span class="pln"> </span><span class="pun">كلا</span><span class="pln"> </span><span class="pun">الجدولين.</span><span class="pln">
</span><span class="lit">4.</span><span class="pln"> </span><span class="pun">ارسم</span><span class="pln"> </span><span class="pun">نموذج</span><span class="pln"> </span><span class="pun">الكيان</span><span class="pln"> </span><span class="pun">والعلاقة</span><span class="pln"> ER</span><span class="pun">.</span><span class="pln">
</span><span class="lit">5.</span><span class="pln"> </span><span class="pun">هل</span><span class="pln"> </span><span class="pun">يحقق</span><span class="pln"> </span><span class="pun">الجدول</span><span class="pln"> PLAY </span><span class="pun">سلامةً</span><span class="pln"> </span><span class="pun">مرجعيةً؟</span><span class="pln"> </span><span class="pun">ولمَ؟</span><span class="pln"> </span><span class="pun">أو</span><span class="pln"> </span><span class="pun">لمَ</span><span class="pln"> </span><span class="pun">لا؟</span></pre>

<ol start="3">
	<li>
		<p>
			عرف المصطلحات التالية، حيث قد تحتاج إلى البحث في الانترنت
		</p>
	</li>
</ol>

<ul style="margin-right: 40px;">
	<li>
		المخطط schema.
	</li>
	<li>
		لغة المضيف host language.
	</li>
	<li>
		اللغات الفرعية للبيانات data sublanguage.
	</li>
	<li>
		لغة تعريف البيانات data definition language.
	</li>
	<li>
		العلاقة الأُحادية unary relation.
	</li>
	<li>
		المفتاح الخارجي foreign key.
	</li>
	<li>
		العلاقة الافتراضية virtual relation.
	</li>
	<li>
		الربط connectivity.
	</li>
	<li>
		المفتاح المركَّب composite key.
	</li>
	<li>
		جداول الربط linking table.
	</li>
</ul>

<ol start="4">
	<li>
		<p>
			تضمن قاعدة بيانات شركة PRE الجداول الثلاثة الموضحة في الشكل أدناه، لذلك أجب عن الأسئلة التالية مستخدمًا هذه الجداول:
		</p>
	</li>
</ol>

<table>
	<thead>
		<tr>
			<th>
				TNUM
			</th>
			<th>
				BASENUM
			</th>
			<th>
				TYPENUM
			</th>
			<th>
				TMILES
			</th>
			<th>
				TBOUGHT
			</th>
			<th>
				TSERIAL
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1001
			</td>
			<td>
				501
			</td>
			<td>
				1
			</td>
			<td>
				5900.2
			</td>
			<td>
				11/08/90
			</td>
			<td>
				as-125
			</td>
		</tr>
		<tr>
			<td>
				1002
			</td>
			<td>
				502
			</td>
			<td>
				2
			</td>
			<td>
				64523.9
			</td>
			<td>
				11/08/90
			</td>
			<td>
				ac-213
			</td>
		</tr>
		<tr>
			<td>
				1003
			</td>
			<td>
				501
			</td>
			<td>
				2
			</td>
			<td>
				32116.0
			</td>
			<td>
				09/29/91
			</td>
			<td>
				ac-215
			</td>
		</tr>
		<tr>
			<td>
				1004
			</td>
			<td>
				 
			</td>
			<td>
				2
			</td>
			<td>
				3256.9
			</td>
			<td>
				01/14/92
			</td>
			<td>
				ac-315
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	الجدول TRUCK
</p>

<table>
	<thead>
		<tr>
			<th>
				BASENUM
			</th>
			<th>
				BASECITY
			</th>
			<th>
				BASESTATE
			</th>
			<th>
				BASEPHON
			</th>
			<th>
				BASE MGR
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				501
			</td>
			<td>
				Dallas
			</td>
			<td>
				TX
			</td>
			<td>
				893-9870
			</td>
			<td>
				J. Jones
			</td>
		</tr>
		<tr>
			<td>
				502
			</td>
			<td>
				New York
			</td>
			<td>
				NY
			</td>
			<td>
				234-7689
			</td>
			<td>
				K. Lee
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	الجدول BASE
</p>

<table>
	<thead>
		<tr>
			<th>
				TYPENUM
			</th>
			<th>
				TYPEDESC
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1
			</td>
			<td>
				single box, double axle
			</td>
		</tr>
		<tr>
			<td>
				2
			</td>
			<td>
				tandem trailer, single axle
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	الجدول TYPE
</p>

<ul style="margin-right: 40px;">
	<li>
		حدِّد المفتاح الرئيسي والمفتاح الخارجي في كل جدول.
	</li>
	<li>
		هل يحقق الجدول TRUCK سلامةً مرجعيةً؟ اشرح إجابتك.
	</li>
	<li>
		ما نوع العلاقة بين الجدولين TRUCK، و BASE.
	</li>
	<li>
		كم عدد الكيانات في الجدول TRUCK.
	</li>
	<li>
		حدِّد المفاتيح المرشَّحة في الجدول TRUCK.
	</li>
</ul>

<ol start="5">
	<li>
		لنفترض أنك تستخدم قاعدة البيانات الموضحة في الشكل أدناه والمكونة من جدولين، أجب عن الأسئلة التالية.
	</li>
</ol>

<table>
	<thead>
		<tr>
			<th>
				CustID
			</th>
			<th>
				CustName
			</th>
			<th>
				AccntNo.
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				100
			</td>
			<td>
				Joe Smith
			</td>
			<td>
				010839
			</td>
		</tr>
		<tr>
			<td>
				101
			</td>
			<td>
				Andy Blake
			</td>
			<td>
				111248
			</td>
		</tr>
		<tr>
			<td>
				102
			</td>
			<td>
				Sue Brown
			</td>
			<td>
				061544
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	الجدول Customer
</p>

<table>
	<thead>
		<tr>
			<th>
				OrderlD
			</th>
			<th>
				Title
			</th>
			<th>
				CustID
			</th>
			<th>
				Price
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1001
			</td>
			<td>
				The Dark Tower
			</td>
			<td>
				102
			</td>
			<td>
				12.00
			</td>
		</tr>
		<tr>
			<td>
				1002
			</td>
			<td>
				Incubus Dreams
			</td>
			<td>
				101
			</td>
			<td>
				19.99
			</td>
		</tr>
		<tr>
			<td>
				1003
			</td>
			<td>
				Song of Susannah
			</td>
			<td>
				102
			</td>
			<td>
				23.00
			</td>
		</tr>
		<tr>
			<td>
				1004
			</td>
			<td>
				The Time Traveler's Wife
			</td>
			<td>
				100
			</td>
			<td>
				21.00
			</td>
		</tr>
		<tr>
			<td>
				1005
			</td>
			<td>
				The Dark Tower
			</td>
			<td>
				101
			</td>
			<td>
				12.00
			</td>
		</tr>
		<tr>
			<td>
				1006
			</td>
			<td>
				Tanequil
			</td>
			<td>
				102
			</td>
			<td>
				15.00
			</td>
		</tr>
		<tr>
			<td>
				1007
			</td>
			<td>
				Song of Susannah
			</td>
			<td>
				101
			</td>
			<td>
				23.00
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	جدول BookOrders
</p>

<ul style="margin-right: 40px;">
	<li>
		حدِّد المفتاح الرئيسي في كل جدول.
	</li>
	<li>
		حدِّد المفتاح الخارجي في الجدول BookOrders.
	</li>
	<li>
		هل هناك أي مفاتيح مرشَّحة في أي من الجدولين؟
	</li>
	<li>
		ارسم نموذج الكيان والعلاقة ER.
	</li>
	<li>
		هل يحقق الجدول BookOrders السلامة المرجعية؟
	</li>
	<li>
		هل تحتوي الجداول على بيانات مكررة؟ ما هي؟
	</li>
</ul>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<ol start="6">
	<li>
		بالنظر إلى جدول الطالب الموضح في الشكل أدناه، اكتب قائمة بجميع المفاتيح المرشَّحة الممكنة، واذكر سبب اختيارك لكل واحد من المفاتيح.
	</li>
</ol>

<p style="text-align: center;">
	<img alt="Ch8-Exercises-No6-Student.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="78920" data-unique="scejhwakx" style="width: 250px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/Ch8-Exercises-No6-Student.jpg.67701c3dc9f2bffb731e0d26203dc39d.jpg">
</p>

<p style="text-align: center;">
	الشكل 14: السؤال السادس
</p>

<p>
	أجب عن الأسئلة التالية مستخدمًا مخطط الكيان والعلاقة ERD لقاعدة بيانات المدرسة الموضحة في الشكل أدناه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="78907" data-ss1633771353="1" href="https://academy.hsoub.com/uploads/monthly_2021_10/Ch8-Exercises-No7-School-Database.jpg.ee84906c02d77f0c100aa598f4fa45ae.jpg" rel=""><img alt="Ch8-Exercises-No7-School-Database.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="78907" data-unique="9tq3a8vo7" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2021_10/Ch8-Exercises-No7-School-Database.thumb.jpg.d448edaf02cd69e19e365050dd009f4c.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 15: السؤال السابع
</p>

<ol start="7">
	<li>
		حدِّد جميع الأنوية والكيانات المعتمِدة والمميزة في مخطط الكيان والعلاقة ERD.
	</li>
	<li>
		أي من الجداول لها علاقات ضعيفة، وأيها لديها علاقات قوية؟
	</li>
	<li>
		بالنظر إلى كل جدول من جداول قاعدة بيانات المدرسة، ما هي السمات التي يمكنها أن تأخذ القيمة الفارغة Null، ولماذا؟
	</li>
	<li>
		ما هي الجداول التي أُنشِئت على أساس نتيجة لعلاقات متعدِّد إلى متعدِّد؟
	</li>
</ol>

<p>
	ترجمة وبتصرف للفصل <a data-ss1633771353="1" href="https://opentextbc.ca/dbdesign01/chapter/chapter-8-entity-relationship-model/" rel="external nofollow">Chapter 8 The Entity Relationship Data Model</a> من كتاب <a data-ss1633771353="1" href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبته Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D9%85%D8%A9-%D9%88%D9%82%D9%8A%D9%88%D8%AF%D9%87%D8%A7-%D9%84%D8%B6%D9%85%D8%A7%D9%86-%D8%B3%D9%84%D8%A7%D9%85%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r544/" rel="">قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات</a>
	</li>
	<li>
		المقال السابق: <a data-ss1633771353="1" href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D8%A6%D9%82%D9%8A%D8%A9-rdm-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r522/" rel="">مفاهيم نموذج البيانات العلائقية RDM الأساسية المهمة في تصميم قواعد البيانات</a>
	</li>
	<li>
		<a data-ss1633771353="1" href="https://academy.hsoub.com/devops/servers/databases/%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%A7%D9%8A%D8%A7-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7-r520/" rel="">خصائص قواعد البيانات والمزايا التي تقدمها</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">543</guid><pubDate>Tue, 05 Oct 2021 14:02:00 +0000</pubDate></item><item><title>&#x645;&#x641;&#x627;&#x647;&#x64A;&#x645; &#x646;&#x645;&#x648;&#x630;&#x62C; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x639;&#x644;&#x627;&#x626;&#x642;&#x64A;&#x629; RDM &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x627;&#x644;&#x645;&#x647;&#x645;&#x629; &#x641;&#x64A; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D8%A6%D9%82%D9%8A%D8%A9-rdm-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r522/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ef36049c15e_--------.png.80f9881c5a2a7434f3bc99e1b66959a4.png" /></p>
<p>
	لقد صُمم نموذج البيانات العلائقية Relational Data Model في العام 1970 بواسطة C.F. Codd، وهو النموذج الأكثر استخدامًا في يومنا هذا، كما يُعَدّ الأساس لكل من:
</p>

<ul>
	<li>
		البحث العلمي في نظرية البيانات، والعلاقات، والقيود.
	</li>
	<li>
		العديد من منهجيات تصميم قواعد البيانات.
	</li>
	<li>
		لغة الوصول القياسية إلى قاعدة البيانات، حيث تسمى <a href="https://academy.hsoub.com/programming/sql/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-sql-r961/" rel="">لغة الاستعلام المهيكلة</a> structured query language - أي <a href="https://academy.hsoub.com/files/16-%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA-%D9%84%D9%84%D8%B9%D8%A7%D9%85%D9%84%D9%8A%D9%86-%D8%A8%D9%84%D8%BA%D8%A9-sql/" rel="">SQL</a> اختصارًا-.
	</li>
	<li>
		جميع أنظمة إدارة قواعد البيانات التجارية الحديثة.
	</li>
</ul>

<p>
	يصف نموذج البيانات العلائقية العالم على أنه تجميعة من العلاقات والجداول المترابطة.
</p>

<h2>
	المفاهيم الأساسية في نماذج البيانات العلائقية
</h2>

<p>
	سنتعرف على المفاهيم الأساسية في نموذج البيانات العلائقية التي ترتكز ارتكازًا كبيرًا على العلاقة والجدول وكل الخصائص المتعلقة بهما.
</p>

<h3>
	العلاقة
</h3>

<p>
	العلاقة relation- أو ما تعرف أيضًا باسم الجدول table أو الملف file -، وهي مجموعة فرعية من الناتج الديكارتي لقائمة من المجالات التي تتميز بالاسم، حيث يمثِّل كل صف row ضمن الجدول الواحد مجموعةً من قيم البيانات ذات الصلة، ويُعرَف الصف أو السجل record باسم صف tuple أيضًا، كما يُعَدّ العمود في الجدول حقلًا، ويشار إليه باسم السِمة attribute أيضًا، كما يمكنك النظر إلى الأمر بالطريقة التالية: تُستخدَم السمات لتعريف السجلات، ويحتوي السجل على مجموعة من السمات.
</p>

<p>
	توضِّح الخطوات التالية المنطق بين العلاقة ومجالاتها:
</p>

<ul>
	<li>
		يُشار إلى عدد <strong>n</strong> من المجالات بالصورة: D1, D2, … Dn
	</li>
	<li>
		تُعَدّ <strong>r</strong> علاقةً محدَّدة على هذه المجالات.
	</li>
	<li>
		ثم r ⊆ D1 × D2 ×… × Dn
	</li>
</ul>

<h3>
	الجدول Table
</h3>

<p>
	تتكون قاعدة البيانات من عدة جداول، كما يحتوي كل جدول على بيانات، ويوضِّح الشكل التالي قاعدة بيانات تحتوي على ثلاثة جداول.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="72010" href="https://academy.hsoub.com/uploads/monthly_2021_07/SwimClubDatabase.png.41a0351692ddc31e110e9ec0c54560d2.png" rel=""><img alt="SwimClubDatabase.png" class="ipsImage ipsImage_thumbnailed" data-fileid="72010" data-unique="n14x8aijk" src="https://academy.hsoub.com/uploads/monthly_2021_07/SwimClubDatabase.thumb.png.49ee14235875b8b9fe037a33b8f0e779.png"></a>
</p>

<p style="text-align: center;">
	الشكل 1: قاعدة بيانات بثلاثة جداول
</p>

<h3>
	العمود Column
</h3>

<p>
	تُخزِّن قاعدة البيانات أجزاء المعلومات أوالحقائق بطريقة منظَّمة، حيث يتطلب الفهم الجيد لكيفية استخدام <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قواعد البيانات</a> والاستفادة منها إلى أقصى حد فهم طريقة التنظيم هذه.
</p>

<p>
	تسمى وحدات التخزين الرئيسية أعمدة columns، أو حقول fields، أو سمات attributes، وتضم هذه الوحدات المكونات الأساسية للبيانات التي يمكن تقسيم محتواها.
</p>

<p>
	تحتاج عند تحديد الحقول المراد إنشاؤها إلى التفكير في البيانات التي لديك عمومًا، فمثلًا، استخلاص المكونات المشتركة للمعلومات التي ستخزِّنها في قاعدة البيانات، وتجنُّب التفاصيل التي تميز عنصرًا عن الآخر.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				Field Name
			</th>
			<th>
				Data
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				First Name
			</td>
			<td>
				Isabelle
			</td>
		</tr>
		<tr>
			<td>
				Family Name
			</td>
			<td>
				Whelan
			</td>
		</tr>
		<tr>
			<td>
				Nationality
			</td>
			<td>
				British
			</td>
		</tr>
		<tr>
			<td>
				Salary
			</td>
			<td>
				109,900
			</td>
		</tr>
		<tr>
			<td>
				Date of Birth
			</td>
			<td>
				15 September 1983
			</td>
		</tr>
		<tr>
			<td>
				Marital Status
			</td>
			<td>
				Single
			</td>
		</tr>
		<tr>
			<td>
				Shift
			</td>
			<td>
				Mon, Wed
			</td>
		</tr>
		<tr>
			<td>
				Place of issue
			</td>
			<td>
				Addis Ababa
			</td>
		</tr>
		<tr>
			<td>
				Valid until
			</td>
			<td>
				17 December 2003
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	مثال على معلومات حول بطاقة هوية
</p>

<h3>
	المجال Domain
</h3>

<p>
	يُمثِّل المجال المجموعات الأصلية للقيم الذَرية المستخدَمة لنمذجة البيانات، وتعني القيمة الذَرية atomic value أنّ كل قيمة في المجال غير قابلة للتجزئة بقدر ما يتعلق الأمر بالنموذج العلائقي، فمثلًا:
</p>

<ul>
	<li>
		يملك مجال الحالة الاجتماعية مجموعةً من الاحتمالات، وهي: متزوج، وأعزب، ومطلِّق.
	</li>
	<li>
		يملك مجال أيام العمل مجموعةً من جميع الأيام الممكنة، وهي: الأحد، الاثنين، …إلخ.
	</li>
	<li>
		مجال الراتب الشهري هو مجموعة جميع الأعداد الأكبر من 0 وأقل من 200000.
	</li>
	<li>
		مجال الاسم الأول هو مجموعة سلاسل الأحرف التي تمثل أسماء الأشخاص.
	</li>
</ul>

<p>
	باختصار، المجال هو مجموعة من القيم المقبولة التي يُسمح للعمود باحتوائها، كما يعتمد على الخصائص المختلفة ونوع بيانات العمود، وسنناقش أنواع البيانات في مقال آخر.
</p>

<h3>
	السجلات Records
</h3>

<p>
	مثلما يحتاج محتوى أي مستند أو عنصر إلى تقسيمه إلى أجزاء صغيرة من البيانات للتخزين في الحقول، فيجب أيضًا أن تكون مترابطةً بحيث يمكن إعادتها إلى شكلها الكامل، ويتم ذلك عن طريق استخدام السجلات، إذ تحتوي السجلات على حقول مرتبطة، مثل: حقل العميل customer، أو الموظف employee، كما يُستخدَم المصطلح صف أو سطر tuple أحيانًا على أساس مرادف للسجل.
</p>

<p>
	تشكل السجلات والحقول أساس جميع قواعد البيانات،و يمنحنا الجدول البسيط أوضح صورة عن كيفية عمل السجلات والحقول معًا في مشروع تخزين قاعدة بيانات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93915" href="https://academy.hsoub.com/uploads/monthly_2022_03/Table-Description.png.6eaf983a295edf77258324a351ad3dd2.png" rel=""><img alt="Table-Description.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93915" data-unique="rpvcvrwg7" style="width: 680px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Table-Description.thumb.png.50db779badb2b570e54166bc77a60094.png"></a>
</p>

<p style="text-align: center;">
	الشكل 2: مثال على جدول بسيط
</p>

<p>
	يوضِّح الجدول البسيط في الشكل السابق كيف يمكن للحقول الاحتفاظ بمجال واسع من مختلف أنواع البيانات، حيث يحتوي على:
</p>

<ul>
	<li>
		حقل ID (مُعرِّف السجل): هو عدد صحيح، ويُستخدَم لترتيب البيانات في الجدول.
	</li>
	<li>
		حقل PubDate (تاريخ النشر): ويحتوي على تاريخ النشر ويكون في الصورة (يوم/شهر/سنة).
	</li>
	<li>
		حقل Author (المؤلِّف): يحتوي على اسم المؤلِّف، وهو حقل يحتوي على بيانات نصية.
	</li>
	<li>
		نص Title (حقل العنوان): يحتوي على أيّ نص يُمثِّل عنوان المؤلِّف.
	</li>
</ul>

<p>
	من الممكن توجيه قاعدة البيانات للبحث في البيانات وتنظيمها بطريقة معينة، فمثلًا، يمكنك طلب مجموعة مختارة من السجلات محدودة حسب التاريخ بطرق عديدة، وهي: كل البيانات المسجَّلة قبل تاريخ معين، أو كل البيانات المسجَّلة بعد تاريخ معين، أو كل البيانات المسجَّلة بين تاريخين، ويمكنك بالمثل أيضًا ترتيب السجلات حسب التاريخ.
</p>

<p>
	نظرًا لإعداد الحقل أو السجل الذي يحتوي على البيانات على أساس حقل تاريخ، فلن تقرأ قاعدة البيانات المعلومات الموجودة في حقل التاريخ على أساس أعداد مفصولة بشرطة مائلة، وإنما على أساس تواريخ، بحيث يجب ترتيبها وفقًا لنظام التقويم.
</p>

<h3>
	الدرجة Degree
</h3>

<p>
	الدرجة هي عدد السمات في الجدول، فدرجة الجدول في المثال السابق الموضح في الشكل هي 4.
</p>

<h2>
	خصائص الجدول
</h2>

<ul>
	<li>
		لكل جدول في قاعدة البيانات اسم خاص به، ولا يتكرر الاسم الواحد في عدة جداول.
	</li>
	<li>
		يحتوي كل صف في الجدول على بيانات فريدة، ولا يتكرر الصف نفسه أكثر من مرة في الجدول.
	</li>
	<li>
		تكون المدخلات في الأعمدة ذَريةً بحيث لا يحتوي الجدول على مجموعات مكررة أو سمات متعددة القيم.
	</li>
	<li>
		تكون المدخلات في الأعمدة من المجال نفسه بناءً على نوع بياناتها، فإمّا أن تكون أعداد - أي عدد صحيح، كسري، …إلخ-، أو سلسلة محارف، أو تاريخ، أو قيم منطقية -أي صح أو خطأ-.
	</li>
	<li>
		غير مسموح بالعمليات التي تجمع بين أنواع البيانات المختلفة.
	</li>
	<li>
		كل سِمة لها اسم فريد.
	</li>
	<li>
		ترتيب الأعمدة غير مهم.
	</li>
	<li>
		ترتيب الصفوف غير مهم.
	</li>
</ul>

<h2>
	المفاهيم الأساسية
</h2>

<ul>
	<li>
		<strong>القيمة الذَرية atomic value</strong>: تعني أنّ كل قيمة في المجال غير قابلة للتجزئة بقدر ما يتعلق الأمر بالنموذج العلائقي.
	</li>
	<li>
		<strong>السِمة attribute</strong>: وحدة التخزين الأساسية في قواعد البيانات.
	</li>
	<li>
		<strong>العمود column</strong>: هو نفسه السمة attribute التي ذكرتها للتو.
	</li>
	<li>
		<strong>الدرجة degree</strong>: عدد السِمات في الجدول.
	</li>
	<li>
		<strong>المجال domain</strong>: هو المجموعات الأصلية للقيم الذَرية المستخدَمة لنمذجة البيانات، وهو مجموعة من القيم المقبولة التي يُسمح للعمود باحتوائها.
	</li>
	<li>
		الحقل field: يكافئ السمة attribute.
	</li>
	<li>
		<strong>الملف file</strong>: يكافئ العلاقة relation.
	</li>
	<li>
		<strong>السجل record</strong>: يحتوي على عدة حقول ذات صلة ببعضها البعض، ويكافئ السطر tuple.
	</li>
	<li>
		<strong>العلاقة relation</strong>: مجموعة فرعية من الناتج الديكارتي لقائمة من المجالات التي تتميز بالاسم، وهي المصطلح التقني لكل من الجدول table ، أو الملف file.
	</li>
	<li>
		<strong>الصف row</strong>: يكافئ السطر tuple.
	</li>
	<li>
		<strong>لغة الاستعلام المهيكلة structured query language -أي SQL اختصارًا-</strong>: هي لغة الوصول القياسية إلى قاعدة البيانات.
	</li>
	<li>
		<strong>الجدول table</strong>: يكافئ العلاقة relation.
	</li>
	<li>
		السطر tuple: مصطلح تقني مرادف للصف أو السجل.
	</li>
</ul>

<h2>
	المصطلحات الأساسية
</h2>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				المصطلح الرسمي -أي حسب العالِم Codd-
			</th>
			<th>
				البديل الأول
			</th>
			<th>
				البديل الثاني
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				العلاقة Relation
			</td>
			<td>
				الجدول Table
			</td>
			<td>
				الملف File
			</td>
		</tr>
		<tr>
			<td>
				السطر Tuple
			</td>
			<td>
				الصف Row
			</td>
			<td>
				السجل Record
			</td>
		</tr>
		<tr>
			<td>
				السمة Attribute
			</td>
			<td>
				العمود Column
			</td>
			<td>
				الحقل Field
			</td>
		</tr>
	</tbody>
</table>

<h2>
	تمارين
</h2>

<p>
	استخدم الجدول الموجود في الشكل الموضَّح أدناه للإجابة على الأسئلة الأربعة الأولى:
</p>

<ol>
	<li>
		حدِّد وصِف جميع المكونات في الجدول باستخدام المصطلحات الصحيحة.
	</li>
	<li>
		ما هو المجال المحتمل للحقل EmpJobCode؟
	</li>
	<li>
		كم عدد السجلات المعروضة؟
	</li>
	<li>
		كم عدد السمات المعروضة؟
	</li>
	<li>
		اذكر خصائص الجدول.
	</li>
</ol>

<table>
	<thead>
		<tr>
			<th>
				معرف سجل الموظف
			</th>
			<th>
				اسم الموظف
			</th>
			<th>
				تهيئة الموظف
			</th>
			<th>
				كنية الموظف
			</th>
			<th>
				رمز مهنة الموظف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				123455
			</td>
			<td>
				فريد
			</td>
			<td>
				.A
			</td>
			<td>
				عبد الله
			</td>
			<td>
				12
			</td>
		</tr>
		<tr>
			<td>
				123456
			</td>
			<td>
				علا
			</td>
			<td>
				.D
			</td>
			<td>
				عادل
			</td>
			<td>
				18
			</td>
		</tr>
		<tr>
			<td>
				123457
			</td>
			<td>
				فاتن
			</td>
			<td>
				.G
			</td>
			<td>
				علي
			</td>
			<td>
				15
			</td>
		</tr>
		<tr>
			<td>
				123458
			</td>
			<td>
				كريم
			</td>
			<td>
				.X
			</td>
			<td>
				اسماعيل
			</td>
			<td>
				18
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	جدول أسئلة التمرين
</p>

<p>
	ترجمة وبتصرف للفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-7-the-relational-data-model/" rel="external nofollow">Chapter 7 The Relational Data Model</a> من كتاب <a href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبته Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>
	</li>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D9%88%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A9-er-%D9%84%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r543/" rel="">نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r521/" rel="">نمذجة البيانات وأنواعها في عملية تصميم قواعد البيانات</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">522</guid><pubDate>Tue, 13 Jul 2021 14:00:00 +0000</pubDate></item><item><title>&#x646;&#x645;&#x630;&#x62C;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x648;&#x623;&#x646;&#x648;&#x627;&#x639;&#x647;&#x627; &#x641;&#x64A; &#x639;&#x645;&#x644;&#x64A;&#x629; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r521/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ef3375cbafe_----.png.60267f3b03f9c914fd09c9fa21f6fb9a.png" /></p>
<p>
	تُعَدّ نمذجة البيانات Data Modelling الخطوة الأولى والأساسية عند تصميم أي <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قاعدة بيانات</a>، كما تُعَدّ هذه الخطوة مرحلة تصميم مجردة وعالية المستوى، ويشار إليها باسم التصميم المفاهيمي conceptual design أيضًا.
</p>

<p>
	الهدف من هذه المرحلة هو إعطاء وصف واضح لكل من:
</p>

<ul>
	<li>
		البيانات الواردة في قاعدة البيانات، مثل الكيانات: طلاب، ومحاضرون، ودورات، ومواد.
	</li>
	<li>
		العلاقات بين عناصر البيانات data items، مثل: يشرف محاضرون على طلاب، ويدرِّس محاضرون دورات.
	</li>
	<li>
		القيود المفروضة على البيانات، مثل: يتكون رقم الطالب من ثمانية خانات بالضبط، وتحتوي المادة الدراسية على أربع أو ست درجات فقط.
	</li>
</ul>

<p>
	يُعبَّر في الخطوة الثانية عن عناصر البيانات، والعلاقات، والقيود، باستخدام المفاهيم التي يوفرها نموذج البيانات عالي المستوى، ونظرًا لعدم وجود تفاصيل التنفيذ implementation details في هذه المفاهيم، فتكون نتيجة عملية نمذجة البيانات تمثيلُا شبه رسمي لهيكل قاعدة البيانات، وهذه النتيجة سهلة الفهم، لذلك تُستخدَم على أساس مرجع للتأكد من تلبية جميع متطلبات المستخدم.
</p>

<p>
	الخطوة الثالثة هي تصميم قاعدة البيانات، حيث يكون لدينا خلال هذه الخطوة خطوتَين فرعيتَين، وهما: التصميم المنطقي لقاعدة البيانات database logical design، والتي تحدِّد قاعدة البيانات في نموذج بيانات لنظام إدارة قواعد بيانات DBMS معيَّن، والأخرى هي التصميم المادي لقاعدة البيانات database physical design، والتي تحدِّد بنية تخزين قاعدة البيانات الداخلية، أو طريقة تنظيم الملفات، أو تقنيات الفهرسة، وتتمثّّل هاتان الخطوتان الفرعيتان في التنفيذ الفعلي لقاعدة البيانات database implementation، وخطوات أساسية لبناء العمليات وواجهات المستخدم.
</p>

<p>
	تُمثَّل البيانات في مراحل تصميم قاعدة البيانات باستخدام نموذج بيانات معيَّن، حيث يكون <strong>نموذج البيانات data model</strong> تجميعةً من المفاهيم، أو الصيغ التي تصف البيانات، والعلاقات بينها، ودلالاتها semantics، والقيود المفروضة عليها، كما تتضمن معظم نماذج البيانات أيضًا مجموعةً من العمليات الأساسية لمعالجة البيانات في قاعدة البيانات database.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<h2>
	أنواع نماذج البيانات
</h2>

<p>
	تُعَدّ نماذج البيانات وسيلةً لتوصيف كيفية عرض البيانات وتخزينها، وسنناقش أنواعها بالتفصيل في هذا القسم.
</p>

<h3>
	نماذج البيانات المفاهيمية عالية المستوى
</h3>

<p>
	توفر نماذج البيانات المفاهيمية عالية المستوى High-level Conceptual Data Models مفهومًا لعرض البيانات بأساليب قريبة من الأسلوب الذي يدرك به الإنسان البيانات، والمثال النموذجي هو نموذج الكيان والعلاقة Entity Relationship الذي يستخدِم المفاهيم الرئيسية، مثل: الكيانات، والسمات، والعلاقات، حيث يمثل الكيان كائنًا واقعيًا، مثل: موظف، أو مشروع، كما يحتوي على سمات تمثل خصائص، مثل: اسم الموظف، وعنوانه، وتاريخ ميلاده، وتُمثِّل العلاقات كيفية ارتباط الكيانات مع بعضها البعض، فمثلًا، توجد علاقة بين الموظف وكل مشروع عندما يعمل الموظف في العديد من المشاريع.
</p>

<h3>
	نماذج البيانات المنطقية القائمة على السجلات
</h3>

<p>
	توفر نماذج البيانات المنطقية القائمة على السجلات Record-based Logical Data Models مفاهيمًا يمكن للمستخدِمين فهمها واستيعابها كما أنها ليست بعيدةً جدًا عن الطريقة التي تُخزَّن بها البيانات في الحاسوب.
</p>

<p>
	هناك ثلاثة نماذج معروفة من هذا النوع، وهي: نماذج البيانات العلائقية relational data models، ونماذج البيانات الشبكية network data models، ونماذج البيانات الهرمية hierarchical data models.
</p>

<ul>
	<li>
		<p>
			يُمثِّل <strong>النموذج العلائقي relational model</strong> البيانات على أساس علاقات أو جداول، فمثلًا، تضم العضوية في منظَمة عالم العلوم Science World العديد من الأعضاء كما في الشكل 2 في مقال <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r1256/" rel="">المفاهيم الأساسية في قواعد البيانات وقواعد تصميمها</a>، ويُعَدّ كل من مُعرِّف العضوية، وتاريخ انتهاء الصلاحية، ومعلومات العنوان، حقولًا في العضوية، ويكون الأعضاء أفرادًا، مثل: Mickey، وMinnie، وMighty، وDoor، وTom، وKing، وMan، وMoose، كما يكون كل سجل بمثابة نسخة عن جدول العضوية.
		</p>
	</li>
	<li>
		<p>
			يُمثِّل <strong>النموذج الشبكي network model</strong> البيانات على أساس أنواع سجلات، كما يُمثِّل أيضًا هذا النموذج نوعًا محددًا من علاقة واحد إلى متعدد one to many يسمى نوع المجموعة set type، كما هو موضح في الشكل التالي.
		</p>
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93912" href="https://academy.hsoub.com/uploads/monthly_2022_03/Network-data-model-300x244.png.beb0cfab58e3229bedae28f16cf93e26.png" rel=""><img alt="Network-data-model-300x244.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93912" data-unique="6h8pwbbon" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Network-data-model-300x244.thumb.png.ade4591a379f86841664d384f0f60217.png"></a>
</p>

<p style="text-align: center;">
	مخطط النموذج الشبكي
</p>

<ul>
	<li>
		يُمثِّل <strong>النموذج الهرمي hierarchical model</strong> البيانات على أساس هيكل شجرة هرمية، حيث يُمثِّل كل فرع من فروع التسلسل الهرمي عددًا من السجلات ذات الصلة، ويوضح الشكل التالي هذا المخطط في صيغة النموذج الهرمي.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93913" href="https://academy.hsoub.com/uploads/monthly_2022_03/Hierarchical-Data-Model-300x116.png.b2729ecac2aa0c046ee30efef015f8cf.png" rel=""><img alt="Hierarchical-Data-Model-300x116.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93913" data-unique="gl3fa3ai6" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Hierarchical-Data-Model-300x116.thumb.png.0466cade6c9762bead7750ec7a27c493.png"></a>
</p>

<p style="text-align: center;">
	مخطط النموذج الهرمي
</p>

<h2>
	مدى تجريد البيانات
</h2>

<p>
	سنلقي في هذا القسم نظرةً على عملية تصميم قاعدة البيانات من حيث تخصيصها لأداء وظائف معينة، فكما يبدأ أيّ تصميم بمستوى عالٍ من التجريد ثم يتنقل تدريجيًا إلى التفاصيل الصغيرة، كذلك هو الحال عند تصميم قاعدة البيانات، فمثلًا، تبدأ عند بناء منزل بعدد غرف النوم والحمامات فيه، سواءً كان على مستوى واحد أو مستويات عدة، وتكون الخطوة التالية بتعيين مهندس معماري لتصميم المنزل تصميمًا أكثر تنظيمًا ودقةً، حيث يصبح هذا المستوى أكثر تفصيلًا فيما يتعلق بأحجام الغرف، وكيف سيتم توصيل المنزل بالأسلاك، وأين ستُوضع تركيبات السباكة، وما إلى ذلك، والخطوة الأخيرة هي تعيين مقاول لبناء المنزل.
</p>

<p>
	يتبع تصميم قاعدة البيانات يتبع طريقةً شبيهةً بهذه، حيث يبدأ بتحديد المستخدِمين لقواعد العمل، ثم ينشئ مصممو ومحللو قاعدة البيانات تصميم قاعدة البيانات، وبعدها ينفّذ مسؤول قاعدة البيانات التصميم باستخدام نظام إدارة <a href="https://academy.hsoub.com/programming/sql/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%B9%D9%86-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r584/" rel="">قواعد البيانات</a> DBMS.
</p>

<p>
	تلخِّص الأقسام الفرعية التالية النماذج بترتيب تنازلي لمستوى التجريد.
</p>

<h3>
	النماذج الخارجية
</h3>

<ul>
	<li>
		تمثل واجهة عرض قاعدة البيانات للمستخدم.
	</li>
	<li>
		تحتوي على عدد من واجهات عرض خارجية مختلفة.
	</li>
	<li>
		ترتبط ارتباطًا وثيقًا بالعالم الحقيقي الذي يراه المستخدم.
	</li>
</ul>

<h3>
	النماذج المفاهيمية Conceptual models
</h3>

<ul>
	<li>
		توفِّر إمكانيات مرنة لهيكلة البيانات data-structuring.
	</li>
	<li>
		تقدِّم واجهة عرض مشتركة community view، وهي الهيكل المنطقي لقاعدة البيانات بأكملها.
	</li>
	<li>
		تحتوي على البيانات المخزنة في قاعدة البيانات.
	</li>
	<li>
		تظهر العلاقات بين البيانات بما في ذلك:
		<ul>
			<li>
				القيود.
			</li>
			<li>
				المعلومات الدلالية مثل قواعد العمل.
			</li>
			<li>
				معلومات الأمان والسلامة.
			</li>
		</ul>
	</li>
	<li>
		تُعَدّ قاعدة البيانات مجموعةً من الكيانات -أي الكائنات objects- من أنواع مختلفة.
	</li>
	<li>
		تمثِّل الأساس لتحديد وإعطاء وصف عالي المستوى لكائنات البيانات الرئيسية، كما أنها تتجاهل التفاصيل.
	</li>
	<li>
		تحدِّد هل قاعدة البيانات مستقلة بغض النظر عن قاعدة البيانات التي تستخدمها.
	</li>
</ul>

<h3>
	النماذج الداخلية Internal models
</h3>

<p>
	النماذج الثلاثة الأكثر شهرة من هذا النوع، هي: نموذج البيانات العلائقية relational data model، ونموذج البيانات الشبكية network data model، ونموذج البيانات الهرمي hierarchical data model، ومن السمات الرئيسية لنماذج البيانات الداخلية:
</p>

<ul>
	<li>
		تُعَدّ قاعدة البيانات مثل تجميعة من السجلات ذات الحجم الثابت.
	</li>
	<li>
		تُعَدّ أقرب إلى المستوى المادي أو بنية الملف.
	</li>
	<li>
		تُمثِّل قاعدة البيانات كما يراها نظام إدارة قواعد البيانات DBMS.
	</li>
	<li>
		تطالب المصمم بمطابقة خصائص وقيود النموذج المفاهيمي مع تلك الخاصة بنموذج التنفيذ المختار.
	</li>
	<li>
		يتضمن مقابلة الكيانات في النموذج المفاهيمي مع الجداول في النموذج العلائقي.
	</li>
</ul>

<h3>
	النماذج المادية Physical models
</h3>

<ul>
	<li>
		هي التمثيل المادي أو الفيزيائي لقاعدة البيانات.
	</li>
	<li>
		تملك أدنى مستوى من التجريد.
	</li>
	<li>
		تحدِّد كيفية تخزين البيانات في قاعدة البيانات، وترتبط مباشرةً بكل من:
		<ul>
			<li>
				أداء قاعدة البيانات في وقت التشغيل Run-time performance.
			</li>
			<li>
				تحسين التخزين وضغط الملفات.
			</li>
			<li>
				تنظيم الملفات وطرق الوصول إليها.
			</li>
			<li>
				تشفير البيانات.
			</li>
		</ul>
	</li>
	<li>
		تُحدِّد ما إذا كان نظام التشغيل operating system -أو OS اختصارًا- يدير المستوى المادي.
	</li>
	<li>
		تُقدِّم مفاهيم تصف تفاصيل كيفية تخزين البيانات في ذاكرة الحاسوب.
	</li>
</ul>

<h2>
	طبقات تجريد البيانات
</h2>

<p>
	يمكنك أن ترى في العرض التصويري كيف تعمل النماذج المختلفة معًا، لذلك دعنا نلقي نظرةً على هذا من أعلى مستوى، وهو النموذج الخارجي.
</p>

<p>
	<strong>النموذج الخارجي external model</strong> هو كيفية عرض المستخدِم النهائي للبيانات، فعادةً ما تكون قاعدة البيانات نظام مؤسسي يخدم احتياجات أقسام متعددة، كما لا يهتم أي قسم برؤية بيانات الأقسام الأخرى، فمثلًا، لا يهتم قسم الموارد البشرية human resources - أو HR اختصارًا- بعرض بيانات قسم المبيعات sales. وعليه تختلف طريقة عرض البيانات من مستخدم لآخر.
</p>

<p>
	يتطلب النموذج الخارجي أن يقسِّم المصمم مجموعة المتطلبات والقيود إلى وحدات وظيفية يمكن فحصها في إطار نماذجها الخارجية مثل تقسيم المؤسسة إلى قسم الموارد البشرية وقسم المبيعات.
</p>

<p>
	تحتاج بوصفك مصمم بيانات إلى فهم جميع البيانات حتى تتمكن من إنشاء قاعدة بيانات على مستوى المؤسسة بناءً على احتياجات الأقسام المختلفة، لذلك يكون إنشاء <strong>النموذج المفاهيمي conceptual model</strong> هو الخطوة الأولى.
</p>

<p>
	يكون النموذج المفاهيمي في هذه المرحلة مستقلًا عن كل من البرامج software والعتاد hardware، ولا يعتمد على برنامج نظام إدارة قواعد البيانات المُستخدم في تنفيذ النموذج، ولا على العتاد المستخدَم في ذلك، كما لا تؤثر التغييرات في العتاد أو برنامج نظام إدارة قواعد البيانات على تصميم قاعدة البيانات على المستوى المفاهيمي.
</p>

<p>
	بمجرد تحديد برنامج نظام إدارة البيانات المُراد استخدامه، يمكنك بعد ذلك تنفيذه، وهو ما يُسمى <strong>بالنموذج الداخلي internal model</strong>، حيث تقوم هنا بإنشاء جميع الجداول، والقيود، والمفاتيح، والقواعد، وما إلى ذلك، وغالبًا ما يشار إلى هذا باسم التصميم المنطقي logical design.
</p>

<p>
	<strong>النموذج المادي</strong> ببساطة هو الطريقة التي تُخزَّن فيها البيانات على القرص، وتختلف طريقة تخزين البيانات باختلاف نوع قاعدة البيانات المستخدَمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="93914" href="https://academy.hsoub.com/uploads/monthly_2022_03/Data-Abstraction-300x226.png.92e94a78eef8bf256eceec36f07faba3.png" rel=""><img alt="Data-Abstraction-300x226.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93914" data-unique="6zqtpjsgp" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Data-Abstraction-300x226.thumb.png.c98c957eeb8d863fe7cd642a817c0eb5.png"></a>
</p>

<p style="text-align: center;">
	مستويات تجريد البيانات
</p>

<h2>
	تخطيطات قاعدة البيانات Schemas
</h2>

<p>
	التخطيط schema هو وصف عام وشامل لقاعدة البيانات، وعادةً ما يتم تمثيله بواسطة مخطط الكيان والعلاقة entity relationship diagram، وتختصر إلى ERD.
</p>

<p>
	غالبًا ما تكون هناك العديد من التخطيطات الفرعية subschemas التي تمثل النماذج الخارجية المختلفة وبالتالي تعرض الواجهات الخارجية للبيانات.
</p>

<p>
	فيما يلي قائمة بالعناصر التي يجب مراعاتها أثناء عملية تصميم قواعد البيانات:
</p>

<ul>
	<li>
		تخطيطات خارجية External schemas: من الممكن أن توجد عدة تخطيطات خارجية في قاعدة البيانات الواحدة.
	</li>
	<li>
		تخطيطات فرعية متعددة Multiple subschemas: تعرض واجهات خارجية متعددة للبيانات.
	</li>
	<li>
		تخطيط مفاهيمي Conceptual schema: يوجد تخطيط مفاهيمي واحد فقط لقاعدة البيانات الواحدة، يتضمن هذا التخطيط عناصر البيانات، والعلاقات، والقيود، وتمثَّل بواسطة مخطط علاقة الكيان والعلاقة ERD.
	</li>
	<li>
		تخطيط مادي Physical schema: يوجد تخطيط مادي واحد فقط لقاعدة بيانات واحدة.
	</li>
</ul>

<h2>
	استقلالية البيانات المنطقية والمادية
</h2>

<p>
	يشير مفهوم استقلالية البيانات Data independence إلى حصانة تطبيقات المستخدِم من التغييرات التي تطرأ على تعريفات البيانات وتنظيمها.
</p>

<p>
	تكشف عمليات تجريد البيانات عن العناصر المهمة أو العناصر ذات الصلة بالمستخدِم، وتكون التعقيد مخفيًا عن مستخدم قاعدة البيانات.
</p>

<p>
	تشكل استقلالية البيانات واستقلالية التشغيل معًا ميزة تجريد البيانات، وهناك نوعان من استقلالية البيانات، هما: استقلالية البيانات منطقيًا، واستقلالية البيانات ماديًا.
</p>

<h3>
	استقلالية البيانات منطقيًا
</h3>

<p>
	يُعَدّ <strong>التخطيط المنطقي logical schema</strong> تصميمًا مفاهيميًا conceptual design لقاعدة البيانات، والذي يتم على الورق أو على لوح أبيض مثل الرسومات المعمارية للبيوت. تسمى القدرة على تغيير التخطيط المنطقي دون تغيير التخطيط الخارجي external schema، أو واجهة المستخدم باستقلالية البيانات منطقيًا logical data independence، فمثلًا، يجب أن تكون إضافة أو إزالة كيانات جديدة، أو سمات، أو علاقات، إلى التخطيط المفاهيمي conceptual schema ممكنةً دون الحاجة إلى تغيير التخطيطات الخارجية الحالية، أو إعادة كتابة برامج التطبيق؛ بمعنى آخر يجب ألَّا تؤثر التغييرات على التخطيط المنطقي على وظيفة التطبيق -أي طرق العرض الخارجية- مثل التعديلات على بنية قاعدة البيانات مثل إضافة عمود أو جداول جديد.
</p>

<h3>
	استقلالية البيانات ماديا
</h3>

<p>
	تشير استقلالية البيانات ماديًا Physical data independence إلى حصانة النموذج الداخلي ضد التغييرات في النموذج المادي، إذ يبقى التخطيط المنطقي دون تغيير على الرغم من إجراء تغييرات على تنظيم الملفات، أو هياكل التخزين، أو أجهزة التخزين، أو استراتيجية الفهرسة. تعمل مرحلة استقلالية البيانات ماديًا على إخفاء تفاصيل بنية التخزين من تطبيقات المستخدم، حيث لا ينبغي أن تتعامل التطبيقات مع هذه القضايا لعدم وجود فرق في العمليات الجارية على البيانات.
</p>

<h2>
	مصطلحات أساسية
</h2>

<ul>
	<li>
		<strong>النموذج الهرمي hierarchical model</strong>: يُمثِّل البيانات في هيكل الشجرة الهرمية.
	</li>
	<li>
		<strong>النسخة instance</strong>: سجل داخل جدول معين في قاعدة البيانات.
	</li>
	<li>
		<strong>النموذج الشبكي network model</strong>: يمثل البيانات على أساس أنواع سجلات.
	</li>
	<li>
		<strong>العلاقة relation</strong>: مصطلح آخر لوصف الجداول.
	</li>
	<li>
		<strong>النموذج العلائقي relational model</strong>: يُمثِّل البيانات على أساس علاقات أو جداول.
	</li>
	<li>
		<strong>نوع المجموعة set type</strong>: نوع محدَّد من علاقة واحد إلى متعدد one to many.
	</li>
	<li>
		<strong>النموذج المفاهيمي conceptual model</strong>: هو الهيكل المنطقي لقاعدة البيانات.
	</li>
	<li>
		<strong>التخطيط المفاهيمي conceptual schema</strong>: مصطلح مرادف للتخطيط المنطقي logical schema.
	</li>
	<li>
		<strong>استقلالية البيانات data independence</strong>: هي حصانة تطبيقات المستخدِم من التغييرات التي تطرأ على تعريفات البيانات وتنظيمها.
	</li>
	<li>
		<strong>نموذج البيانات data model</strong>: تجميعة من المفاهيم أو الصيغ المستخدمة لوصف البيانات، والعلاقات بينها، ودلالاتها، والقيود المفروضة عليها.
	</li>
	<li>
		<strong>نمذجة البيانات data modelling</strong>: هي الخطوة الأولى في عملية تصميم قاعدة البيانات.
	</li>
	<li>
		<strong>التصميم المنطقي لقاعدة البيانات database logical design</strong>: يُحدِّد قاعدة بيانات في نموذج البيانات الخاص بنظام إدارة قاعدة بيانات محدَّد.
	</li>
	<li>
		<strong>التصميم المادي لقاعدة البيانات database physical design</strong>: يُحدِّد بنية تخزين قاعدة البيانات الداخلية، أو تنظيم الملفات، أو تقنيات الفهرسة.
	</li>
	<li>
		<strong>مخطط الكيان والعلاقة entity relationship diagram -أو ERD اختصارًا-</strong>: يُعَدّ نموذج بيانات، حيث يصف قاعدة البيانات، ويعرض الجداول، والسمات، والعلاقات.
	</li>
	<li>
		<strong>النموذج الخارجي external model</strong>: يمثِّل واجهة عرض المستخدِم لقاعدة البيانات.
	</li>
	<li>
		<strong>التخطيط الخارجي external schema</strong>: يمثِّل واجهة المستخدِم.
	</li>
	<li>
		<strong>النموذج الداخلي internal model</strong>: هو تمثيل قاعدة البيانات في الصورة التي يراها أو يتعامل معها نظام إدارة قواعد البيانات.
	</li>
	<li>
		<strong>استقلالية البيانات منطقيًا logical data independence</strong>: هو القدرة على تغيير التخطيط المنطقي للبيانات دون تغيير التخطيط الخارجي.
	</li>
	<li>
		<strong>التصميم المنطقي logical design</strong>: هو الخطوة التي تُنشأ فيها الجداول، والقيود، والمفاتيح، والقواعد، …إلخ.
	</li>
	<li>
		<strong>التخطيط المنطقي logical schema</strong>: هو تصميم مفاهيمي لقاعدة البيانات، حيث يتم على الورق، أو الألواح البيضاء مثل الرسومات المعمارية لمنزل.
	</li>
	<li>
		<strong>نظام التشغيل operating system - أو OS اختصارًا-</strong>: هو المسؤول عن إدارة المستوى المادي للنموذج المادي.
	</li>
	<li>
		<strong>استقلالية البيانات ماديًا physical data independence</strong>: هو حصانة النموذج الداخلي ضد التغييرات في النموذج المادي.
	</li>
	<li>
		<strong>النموذج المادي physical model</strong>: هو التمثيل المادي لقاعدة البيانات.
	</li>
	<li>
		<strong>التخطيط schema</strong>: هو وصف عام وشامل لقاعدة البيانات.
	</li>
</ul>

<h2>
	التمارين
</h2>

<ol>
	<li>
		ما هو نموذج البيانات؟
	</li>
	<li>
		ما هو نموذج البيانات المفاهيمي عالي المستوى؟
	</li>
	<li>
		عرف المصطلحات التالية:
	</li>
</ol>

<ul style="margin-right: 40px;">
	<li>
		الكيان.
	</li>
	<li>
		السمة.
	</li>
	<li>
		العلاقة.
	</li>
</ul>

<ol start="4">
	<li>
		اذكر وصِف بإيجاز النماذج الشائعة لنماذج البيانات المنطقية القائمة على السجلات.
	</li>
	<li>
		صِف الغرض من التصميم المفاهيمي.
	</li>
	<li>
		ما هو الاختلاف بين التصميم المفاهيمي والتصميم المنطقي؟
	</li>
	<li>
		عرف النماذج التالية:
	</li>
</ol>

<ul style="margin-right: 40px;">
	<li>
		ما هو النموذج الخارجي؟
	</li>
	<li>
		ما هو النموذج المفاهيمي؟
	</li>
	<li>
		ما هو النموذج الداخلي؟
	</li>
	<li>
		ما هو النموذج المادي؟
	</li>
</ul>

<ol start="8">
	<li>
		ما هو النموذج الذي يتعامل معه مسؤول قاعدة البيانات؟
	</li>
	<li>
		ما هو النموذج الذي يتعامل معه المستخدِم النهائي لقاعدة البيانات؟
	</li>
	<li>
		ما هو الاستقلال البيانات ماديًا؟
	</li>
	<li>
		ما هو استقلال البيانات منطقيًا؟
	</li>
</ol>

<p>
	ترجمة وبتصرف للفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-4-types-of-database-models/" rel="external nofollow">Chapter 4 Types of Data Models</a> والفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-5-data-modelling/" rel="external nofollow">Chapter 5 Data Modelling</a> من كتاب <a href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبه Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D8%A6%D9%82%D9%8A%D8%A9-rdm-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r522/" rel="">مفاهيم نموذج البيانات العلائقية RDM الأساسية المهمة في تصميم قواعد البيانات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/servers/databases/%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%A7%D9%8A%D8%A7-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7-r520/" rel="">خصائص قواعد البيانات والمزايا التي تقدمها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%88%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D9%87-%D8%B9%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r509/" rel="">تحليل نظام الملفات لإدارة البيانات وتخزينها واختلافه عن نظام قاعدة البيانات</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">521</guid><pubDate>Thu, 08 Jul 2021 13:00:00 +0000</pubDate></item><item><title>&#x62E;&#x635;&#x627;&#x626;&#x635; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x645;&#x632;&#x627;&#x64A;&#x627; &#x627;&#x644;&#x62A;&#x64A; &#x62A;&#x642;&#x62F;&#x645;&#x647;&#x627;</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%A7%D9%8A%D8%A7-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7-r520/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_10/615c02c56915c_-----.png.101c0c4aad1122d1fb615d2b22f4b99a.png" /></p>

<p>
	تعني إدارة المعلومات معالجة المعلومات وتنظيمها لتوظيفها بما يخدمنا بطريقة نستفيد منها في تنفيذ مهامنا، كما منع نظام إدارة قواعد البيانات DBMS وجود الفوضى العرضية التي كانت تحدث للبيانات التي نجمعها ونضيفها إلى قواعد البيانات، حيث أصبح الوصول إليها أكثر سهولةً وتكاملًا مع بقية عملنا، كما تسمح لنا إدارة المعلومات باستخدام قاعدة بيانات أن نصبح مستخدِمين استراتيجيين للبيانات التي نملكها.
</p>

<p>
	غالبًا ما نحتاج إلى الوصول إلى البيانات وإعادة فرزها لأغراض مختلفة تشمل ما يلي:
</p>

<ul>
<li>
		إنشاء القوائم البريدية.
	</li>
	<li>
		كتابة التقارير الإدارية.
	</li>
	<li>
		توليد قوائم بالقصص الإخبارية المختارة.
	</li>
	<li>
		تحديد احتياجات العملاء المختلفة.
	</li>
</ul>
<p>
	تملك <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قواعد البيانات</a> قدرةً كبيرةً على معالجة البيانات، مما يسمح لها بإجراء العمليات التالية:
</p>

<ul>
<li>
		الفرز Sort.
	</li>
	<li>
		المطابقة Match.
	</li>
	<li>
		ربط البيانات Link.
	</li>
	<li>
		تجميع البيانات Aggregate.
	</li>
	<li>
		تخطي الحقول Skip fields.
	</li>
	<li>
		إجراء العمليات الحسابية Calculate.
	</li>
	<li>
		ترتيب Arrange البيانات.
	</li>
</ul>
<p>
	تتعدد استخدامات قواعد البيانات وترتبط بمجالات كثيرة، لذلك نجد من الممكن ربط قاعدة البيانات بكل من الأنظمة التالية:
</p>

<ul>
<li>
		موقع إلكتروني لتسجيل المستخدِمين.
	</li>
	<li>
		تطبيقات الهواتف مثل تطبيق لتخزين بيانات عملاء منظَمة تقدم خدمات اجتماعية.
	</li>
	<li>
		نظام السجلات الطبية لمنشأة رعاية صحية.
	</li>
	<li>
		دفتر العناوين address book الشخصية في عميل البريد الإلكتروني.
	</li>
	<li>
		تجميعة من الملفات النصية.
	</li>
	<li>
		نظام حجوزات الطيران.
	</li>
</ul>
<h2>
	خصائص قواعد البيانات
</h2>

<p>
	يملك نظام قواعد البيانات عددًا من الخصائص والفوائد التي تميزه عن النظام القائم على الملفات file-based system، حيث سنذكر منها ما يلي:
</p>

<h3>
	طبيعة الوصف الذاتي لنظام قاعدة البيانات
</h3>

<p>
	يُشار إلى نظام قاعدة البيانات على أنه ذاتي الوصف، وذلك بسبب احتوائه على قاعدة البيانات تفسها، وعلى بيانات وصفية metadata بحيث تُحدِّد البيانات وتصفها، والعلاقات بين الجداول في قاعدة البيانات، حيث تُستخدَم هذه المعلومات بواسطة برامج أنظمة إدارة قواعد البيانات DBMS، أو مستخدمي قاعدة البيانات، ويُعَدّ هذا الفصل بين البيانات ومعلوماتها أحد الفروقات الرئيسية التي تميز نظام قواعد البيانات عن النظام اتقليدي القائم على الملفات، والذي يكون فيه تعريف البيانات جزءًا من برامج التطبيقات.
</p>

<h3>
	العزل بين البرنامج والبيانات
</h3>

<p>
	تُحدَّد هيكلة ملفات البيانات في النظام القائم على الملفات داخل برامج التطبيق، لذلك إذا أراد المستخدم تعديل هيكلة ملف معيَّن، فعليه تعديل جميع البرامج التي تتصل بهذا الملف.
</p>

<p>
	من الناحية الأخرى، تُخزِّن قواعد البيانات هيكلة البيانات في دليل catalogue النظام وليس في البرامج، لذلك كل ما هو مطلوب لتعديل هيكل ملف معيَّن هو تعديل واحد فقط، ويسمى هذا بالعزل بين البرامج والبيانات أو الاستقلالية بين البرامج والبيانات program-data independence أيضًا.
</p>

<h2>
	دعم عدة واجهات عرض للبيانات
</h2>

<p>
	تدعم قاعدة البيانات استخدام عدة واجهات لعرض البيانات، حيث تُعَدّ واجهة العرض view مجموعةً فرعيةً من قاعدة البيانات database، والتي تُعرَّف وتُخصَّص لخدمة أغراض فئة محددَّة من مستخدِمي النظام، وقد يملك مستخدِمين متعددين واجهات مختلفةً في النظام، حيث تحتوي كل منها على البيانات التي تهم مستخدِم أو مجموعة من المستخدِمين دون غيرهم.
</p>

<h3>
	مشاركة البيانات والنظام متعدد المستخدمين
</h3>

<p>
	صمِّمت أنظمة قواعد البيانات لعدة مستخدِمين، حيث تتيح لعدد من المستخدِمين الوصول إلى قاعدة البيانات نفسها في الوقت نفسه، وذلك عن طريق استخدام استراتيجيات معيَّنة تُسمى استراتيجيات التحكم المتزامنة concurrency control strategies، حيث تضمن هذه الاستراتيجيات صِحة البيانات التي يتم الوصول إليها، كما تُحافظ على سلامة البيانات أيضًا.
</p>

<p>
	يُعَدّ تصميم أنظمة قواعد البيانات الحديثة المتعددة المستخدِمين تحسنًا كبيرًا مقارنةً بتلك التي كانت في الماضي، والتي تقتصر على شخص واحد في كل مرة.
</p>

<h3>
	التحكم في تكرار البيانات
</h3>

<p>
	تُخزَّن البيانات في نظام قواعد البيانات - وفي الحالة المثالية - دون أي تكرار redundancy، أي أنّ كل عنصر بيانات موجود في مكان واحد فقط في قاعدة البيانات. ولكن يحدث في بعض الحالات تكرار للبيانات بغرض تحسين أداء النظام في أجزاء معينة، كما يُتحكَّم في هذا التكرار عن طريق برمجة التطبيقات، وذلك بالمحافظة على الحد الأدنى منه عند تصميم قاعدة البيانات.
</p>

<h3>
	تشارك البيانات
</h3>

<p>
	يملك تكامل جميع بيانات المؤسسة داخل نظام قاعدة البيانات العديد من المزايا، حيث يسمح بمشاركة البيانات بين الموظفين وغيرهم من الذين يمكنهم الوصول إلى النظام، وكذلك يسمح للمستخدمين بتوليد المزيد من المعلومات من كمية معيَّنة من البيانات أكثر مما سيكون ممكنًا بدون التكامل.
</p>

<h3>
	تطبيق قيود صارمة لضمان سلامة البيانات وصحتها
</h3>

<p>
	توفر أنظمة إدارة قواعد البيانات القدرة على تحديد وفرض قيود معينة على البيانات لضمان إدخال معلومات صحيحة من قِبَل المستخدِمين، والمحافظة على سلامة البيانات، إذ تُعَدّ قيود قاعدة البيانات database constraint قواعدًا لفرض ما يمكن إدخاله أو تعديله في جدول معيَّن، مثل: الرمز البريدي باستخدام تنسيق معيَّن، أو إضافة مدينة حقيقية في حقل المدينة.
</p>

<p>
	هناك أنواع عديدة من القيود في قواعد البيانات، مثل: نوع البيانات Data type مثل تحدد نوع البيانات المسموح بها في الحقل مثل الأعداد فقط، أو تفرد البيانات Data uniqueness مثل المفتاح الأساسي والذي يضمن عدم إدخال أي تكرارات، كما يمكن أن تكون القيود بسيطةً -بحيث تفرض على الحقل مباشرةً-، أو معقدةً -أي برمجية-.
</p>

<h3>
	تقييد الوصول الغير مصرح به
</h3>

<p>
	لا يحظى جميع مستخدمي نظام قاعدة البيانات بصلاحيات الوصول نفسها، فمثلًا، قد يكون لدى أحد المستخدِمين صلاحيات القراءة فقط -أي القدرة على قراءة الملفات دون إجراء أيّ تعديلات عليها-، بينما يكون لدى مستخدِم آخر صلاحيات القراءة والكتابة - أي القدرة على قراءة الملفات والتعديل عليها-، ولهذا السبب يجب على نظام إدارة قاعدة البيانات توفير نظام أمان فرعي لإنشاء أنواع مختلفة من حسابات المستخدِمين، والتحكم فيها، وتقييد الوصول الغير مصرح به.
</p>

<h3>
	استقلالية البيانات
</h3>

<p>
	يوجد ميزة أخرى لنظام إدارة قواعد البيانات، وهي الطريقة التي يسمح بها باستقلالية البيانات، بمعنى آخر، يتم فصل أوصاف بيانات النظام أو البيانات التي تصف البيانات -أي البيانات الوصفية metadata- عن برامج التطبيق، وهذا ممكن لأن نظام إدارة قاعدة البيانات يعالج التغييرات في هيكل البيانات، ولا تُضمَّن هذه التغيرات في البرنامج نفسه.
</p>

<h3>
	معالجة المعاملات
</h3>

<p>
	يجب أن يتضمن نظام إدارة قواعد البيانات أنظمةً فرعيةً للتحكم في التزامن، حيث تضمن هذه الخاصية بقاء البيانات متسقةً وصالحةً أثناء معالجة المعامَلات حتى وإن قام العديد من المستخدِمين بتحديث المعلومات نفسها.
</p>

<h3>
	تقديم عدة واجهات عرض للبيانات
</h3>

<p>
	يسمح نظام إدارة قواعد البيانات DBMS للعديد من المستخدمين بالوصول إلى قواعد البيانات بصورة فردية أو بصورة متزامنة، كما ليس من المهم أن يعرف المستخدِمون كيف وأين تُخزَّن البيانات التي يصلون إليها.
</p>

<h3>
	النسخ الاحتياطي واسترجاع البيانات التالفة أو المفقودة
</h3>

<p>
	يُعَدّ النسخ الاحتياطي والاسترجاع طريقتَين لحماية البيانات من الضياع، حيث يوفر نظام قواعد البيانات عمليةً منفصلةً عن عملية النسخ الاحتياطي للشبكة لنسخ البيانات احتياطيًا واستعادتها، ويُعَدّ النسخ الاحتياطي لقاعدة البيانات الطريقة الوحيدة لاستعادتها في حال فشل محرك الأقراص الثابتة وتعذَّر الوصول إلى قاعدة البيانات المخزنة عليه.
</p>

<p>
	إذا فشل نظام الحاسوب في منتصف عملية تحديث البيانات، فيكون النظام الفرعي للاسترجاع هو المسؤول عن التأكد من استعادة قاعدة البيانات إلى حالتها الأصلية، ويكون ما سبق فائدتَين إضافيتَين لنظام إدارة البيانات.
</p>

<h2>
	مصطلحات أساسية
</h2>

<ul>
<li>
		استراتيجيات التحكم المتزامنة concurrency control strategies: تسمح للعديد من المستخدِمين بالوصول إلى عنصر البيانات نفسه في الوقت نفسه.
	</li>
	<li>
		نوع البيانات data type: يُحدِّد نوع البيانات المسموح بها في حقل معيَّن مثل يمكن أن يقبل الحقل أعدادًا فقط.
	</li>
	<li>
		تفرد البيانات data uniqueness: يضمن عدم إدخال بيانات مكرَّرة.
	</li>
	<li>
		قيود قاعدة البيانات database constraint: يُحدِّد القيد ما يُسمح بإدخاله أو تعديله في جدول معيَّن.
	</li>
	<li>
		البيانات الوصفية metadata: تُحدِّد وتصف البيانات والعلاقات بين الجداول في قاعدة البيانات.
	</li>
	<li>
		صلاحيات القراءة والكتابة read and write privileges: القدرة على قراءة الملفات وتعديلها.
	</li>
	<li>
		صلاحيات القراءة فقط read-only access: القدرة على قراءة الملفات فقط دون تعديلها.
	</li>
	<li>
		الوصف الذاتي self-describing: يُشار إلى نظام قاعدة البيانات على أنه ذاتي الوصف، لأنه يحتوي على قاعدة البيانات نفسها، بالإضافة إلى البيانات الوصفية التي تُحدِّد وتصف البيانات والعلاقات بين الجداول في قاعدة البيانات.
	</li>
	<li>
		واجهة العرض: مجموعة فرعية من قاعدة البيانات.
	</li>
</ul>
<h2>
	تمارين
</h2>

<ol>
<li>
		ماذا يُميِّز نظام إدارة قاعدة البيانات DBMSعن النظام القائم على الملفات file-based system؟
	</li>
	<li>
		ما هي استقلالية البيانات؟ وما أهميتها؟
	</li>
	<li>
		ما هو الغرض من إدارة المعلومات؟
	</li>
	<li>
		ناقش استخدام قواعد البيانات في بيئة العمل.
	</li>
	<li>
		ما هي البيانات الوصفية؟
	</li>
</ol>
<p>
	ترجمة وبتصرف للفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-3-characteristics-and-benefits-of-a-database/" rel="external nofollow">Chapter 3 Characteristics and Benefits of a Database</a> من كتاب <a href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبته Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r521/" rel="">نمذجة البيانات وأنواعها في عملية تصميم قواعد البيانات</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r519/" rel="">المفاهيم الأساسية في قواعد البيانات وتصميمها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%88%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D9%87-%D8%B9%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r509/" rel="">تحليل نظام الملفات لإدارة البيانات وتخزينها واختلافه عن نظام قاعدة البيانات</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r1726/" rel="">دليلك الشامل إلى أنواع البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">520</guid><pubDate>Sun, 04 Jul 2021 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x641;&#x627;&#x647;&#x64A;&#x645; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x641;&#x64A; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x648;&#x62A;&#x635;&#x645;&#x64A;&#x645;&#x647;&#x627;</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r519/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60ef2eb98f50a_------.png.a3efacc6517879c9ef741e9efdc94bee.png" /></p>
<p>
	سنتعرف في هذا المقال على أهم المصطلحات والمفاهيم الأساسية في قواعد البيانات بدءًا من التعرف على مفهوم قاعد البيانات بحد ذاته ثم التعرف إلى الصفات التي تتصف فيها قواعد البيانات وأخيرًا التعرف على مفهوم أنظمة إدارة قواعد البيانات وتصنيفاتها المندرجة ضمنها.
</p>

<h2>
	ما هي قاعدة البيانات؟
</h2>

<p>
	تُعَدّ <a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قاعدة البيانات</a> database تجميعةً مشترَكةً من البيانات ذات الصلة، وتُستخدَم لدعم أنشطة منظَمة معينة، كما يمكن النظر إلى قاعدة البيانات على أساس مستودع للبيانات التي تُعرَّف مرةً واحدةً، ومن ثم يمكن الوصول إليها من مستخدِمين مختلفِين كما هو موضح في الشكل التالي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93907" href="https://academy.hsoub.com/uploads/monthly_2022_03/RDBMS.png.a86b0728bcc647a1cfcc01d355ca5fab.png" rel="" data-fileext="png"><img alt="RDBMS.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93907" data-unique="2qtgtdnrl" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/RDBMS.thumb.png.7da88979f0af3f7bdd997679091310d0.png"></a>
</p>

<p style="text-align: center;">
	الشكل 1: قاعدة البيانات هي مستودع للبيانات
</p>

<h2>
	خصائص قاعدة البيانات
</h2>

<p>
	تملك قاعدة البيانات الخصائص التالية:
</p>

<ul>
	<li>
		تُمثِّل بعض جوانب العالم الحقيقي، أو تجميعةً من عناصر البيانات data elements -أو الحقائق facts- التي تُمثِّل معلومات مستقاة من الواقع.
	</li>
	<li>
		تُعَدّ قاعدة البيانات منطقيةً، ومتماسكةً، ومُتسقةً داخليًا.
	</li>
	<li>
		صُممَت قاعدة البيانات وبُنيت ومُلِئت بالبيانات لخدمة غرض معيّن.
	</li>
	<li>
		يُخزَّن كل عنصر بيانات في حقل field.
	</li>
	<li>
		تُكوِّن مجموعة الحقول جدولًا table، فمثلًا، يحتوي كل حقل في جدول الموظف على بيانات حول موظف فردي.
	</li>
</ul>

<p>
	يمكن أن تحتوي قاعدة البيانات على العديد من الجداول، فمثلًا، قد يحتوي نظام العضوية membership system على جدول عنوان، وجدول عضو فردي كما هو موضح في الشكل التالي.
</p>

<p style="text-align: center;">
	 
</p>

<p style="text-align: center;">
	<img alt="Capture d’écran 2022-03-18 084859.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93908" data-unique="u1t6ijm4x" style="" src="https://academy.hsoub.com/uploads/monthly_2022_03/62343980a65c4_Capturedcran2022-03-18084859.png.55a57a69e7ecb4e35174db0cbfcd9404.png">
</p>

<p style="text-align: center;">
	الشكل 2: نظام العضوية في Science World
</p>

<p>
	تتكون منظمة عالم العلوم مثلًا من عدة أعضاء، وهم: أفراد individuals، ومنازل جماعية group homes، وأعمال تجارية businesses، وشركات corporations، حيث يملكون عضوية نشطة في هذه المنظمة، كما يمكن شراء العضوية لمدة سنة أو سنتين، وبعد ذلك يمكن تجديدها لمدة سنة أو سنتين أيضًا.
</p>

<p>
	نلاحظ في الشكل السابق أنّ ميني ماوس Minnie Mouse قد جددت عضوية العائلة في منظمة عالم العلوم Science World، كما نلاحظ أنّ كل شخص يملك المعرِّف رقم 100755 يعيش في العنوان التالي: 8932 Rodent Lane. والأعضاء الأفراد كما يظهر في الشكل هم: Mickey Mouse وMinnie Mouse وحتى Moose Mouse كما هو ظاهر.
</p>

<h2>
	أنواع مستخدمي قاعدة البيانات
</h2>

<p>
	يندرج مستخدمو قواعد قواعد البيانات ضمن أحد التصنيفات التالية:
</p>

<h3>
	المستخدمون النهائيون
</h3>

<p>
	المستخدمون النهائيون End Users هم الأشخاص الذين تتطلب وظائفهم الوصول إلى قاعدة بيانات للاستعلام عن التقارير وتحديثها وإنشائها.
</p>

<h3>
	مستخدم التطبيق
</h3>

<p>
	مستخدم التطبيق Application user هو الشخص الذي يصل إلى برنامج تطبيقي موجود لأداء المهام اليومية.
</p>

<h3>
	المستخدم الخبير
</h3>

<p>
	المستخدمون الخبراء Sophisticated users هم المستخدمون الذين لديهم طريقتهم الخاصة في الوصول إلى قاعدة البيانات. هذا يعني أنهم لا يستخدمون البرنامج التطبيقي المتوفّر في النظام، فقد يحدّدون التطبيق الخاص بهم أو يصفِون حاجتهم مباشرةً باستخدام لغات استعلام. يحتفظ هؤلاء المستخدمون المتخصصون بقواعد بياناتهم الشخصية باستخدام حزم البرامج الجاهزة التي توفر أوامرًا قائمةً على القوائم menu driven commands وسهلة الاستخدام مثل برنامج MS Access.
</p>

<h3>
	مبرمجو التطبيقات
</h3>

<p>
	يطبّق هؤلاء المستخدمون - مبرمجو التطبيقات Application Programmers- برامجًا تطبيقية محددة للوصول إلى البيانات المخزَّنة، حيث يجب أن يكونوا على دراية بنظم إدارة قواعد البيانات لإنجاز مهاههم.
</p>

<h3>
	مسؤولو قاعدة البيانات
</h3>

<p>
	قد يكون مسؤول قاعدة البيانات Database Administrator -أو DBA اختصارًا- شخصًا أو مجموعة من الأشخاص في مؤسسةٍ، المسؤولين عن إعطاء التصريح بالوصول إلى قاعدة البيانات ومراقبة استخدامها وإدارة جميع الموارد لدعم استخدام نظام قاعدة البيانات بأكمله.
</p>

<h2>
	نظام إدارة قواعد البيانات وتصنيفاتها
</h2>

<p>
	يُعَدّ نظام إدارة قواعد البيانات database management system - أو DBMS اختصارًا- تجميعةً من البرامج التي تُمكِّن المستخدِمين من إنشاء قواعد البيانات databases، والحفاظ عليها، والتحكم في جميع عمليات الوصول إليها، كما يُعَدّ الهدف الأساسي لنظام إدارة قواعد البيانات هو توفير بيئة ملائمة وفعالة للمستخدِمين لاسترجاع المعلومات وتخزينها.
</p>

<p>
	يمكننا باستخدام نظام قواعد البيانات DBMS تمثيل النظام المصرفي التقليدي كما هو موضح في الشكل التالي، حيث يُستخدَم في هذا المثال المصرفي نظام إدارة قواعد البيانات من قِبَل قسم شؤون الموظفين، وقسم الحسابات، وقسم إدارة القروض، للوصول إلى قاعدة البيانات المشتركة للشركة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93909" href="https://academy.hsoub.com/uploads/monthly_2022_03/Banking-Systems-RDBMS.png.ae71a2ef076f559608230e136eafd492.png" rel="" data-fileext="png"><img alt="Banking-Systems-RDBMS.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93909" data-unique="fla5cmrg7" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Banking-Systems-RDBMS.thumb.png.286079602eb13ef30199fab004bae0de.png"></a>
</p>

<p style="text-align: center;">
	الشكل 3: نظام إدارة قواعد البيانات المصرفية
</p>

<p>
	يمكن تصنيف أنظمة إدارة قواعد البيانات بناءً على عدة معايير، مثل: نموذج البيانات data model، وأعداد المستخدمين user numbers، وتوزيع قاعدة البيانات database distribution؛ وفيما يلي بيان تفصيلي لكل من هذه المعايير.
</p>

<h3>
	التصنيف على أساس نموذج البيانات
</h3>

<p>
	نموذج البيانات الأكثر انتشارًا والمستخدم اليوم هو نموذج البيانات العلائقية relational data model، وذلك لأن جميع نظم إدارة قواعد البيانات، مثل: Oracle، وMS SQL Server، وDB2، وMySQL، تدعمه.
</p>

<p>
	لا تزال النماذج التقليدية traditional models الأخرى مثل نماذج البيانات الهرمية hierarchical data models، ونماذج بيانات الشبكة network data models مستخدَمةً في الصناعة بصورة أساسية على منصات الحواسيب المركزية، ولكن نجدها محصورةً في استخدامات بسيطة بسبب تعقيدها، ويشار إليها على أنها نماذج تقليدية traditional models لأنها سبقت النموذج العلائقي relational model.
</p>

<p>
	ظهرت في السنوات الأخيرة نماذج البيانات كائنية التوجه object-oriented data models، وهي نظام لإدارة قاعدة بيانات، حيث تُمثَّل فيه المعلومات في شكل كائنات كما هو مستخدم في البرمجة كائنية التوجه.
</p>

<p>
	تختلف قواعد البيانات كائنية التوجه عن قواعد البيانات العلائقية relational databases، والتي تعتمد على الجدول أي تُعَدّ جدولية التوجه table-oriented، كما تجمع أنظمة إدارة قواعد البيانات كائنية التوجه Object-oriented database management systems -وتختصر إلى OODBMS- بين إمكانيات قاعدة البيانات وإمكانيات لغات البرمجة كائنية التوجه.
</p>

<p>
	ما زال انتشار قواعد البيانات كائنية التوجه ضعيف موازنة بقواعد البيانات العلائقية وذلك يرجع إلى عدم تعرُّف المستخدِمِين عليها بعد، ويوجد بعض الأمثلة على نظم إدارة قواعد البيانات كائنية التوجه، وهي:
</p>

<ul>
	<li>
		O2.
	</li>
	<li>
		ObjectStore.
	</li>
	<li>
		Jasmine.
	</li>
</ul>

<h3>
	التصنيف على أساس أعداد المستخدمين
</h3>

<p>
	يمكن تصنيف نظم إدارة قواعد البيانات بناءً على عدد المستخدِمين القادر على دعمهم، حيث من الممكن دعم مستخدِم وحيد ويسمى نظام قواعد بيانات أحادي المستخدِم ingle-user database system، أو دعم العديد من المستخدِمين بصورة متزامنة ويسمى نظام قواعد بيانات متعدد المستخدِمين multiuser database system.
</p>

<h3>
	التصنيف على أساس توزيع قاعدة البيانات
</h3>

<p>
	توجد أربعة أنظمة توزيع رئيسية لأنظمة قواعد البيانات، ويمكن استخدامها لتصنيف قواعد البيانات حسب ماهو موضح أدناه.
</p>

<h4>
	الأنظمة المركزية Centralized systems
</h4>

<p>
	يُخزَّن نظام إدارة قواعد البيانات DBMS وقاعدة البيانات database عند استخدام الأنظمة المركزية لقواعد البيانات centralized database system في موقع واحد تستخدمه أنظمةً أخرى عديدةً كما هو موضَّح في الشكل التالي
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93910" href="https://academy.hsoub.com/uploads/monthly_2022_03/photo-13.thumb.png.d13ad5f802f070f5f1fb1c4ab6d70cec.png" rel="" data-fileext="png"><img alt="photo-13.thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93910" data-unique="xjophga25" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/photo-13.thumb.thumb.png.0ae11088087f4268c048ab300ec943f1.png"></a>
</p>

<p style="text-align: center;">
	الشكل 4: مثال على نظام قاعدة بيانات مركزية.
</p>

<p>
	استخدَمت العديد من المكتبات الكندية في أوائل الثمانينيات نظام GEAC 8000 لتحويل دليل أو فهرس البطاقات اليدوية إلى أنظمة فهرس مركزية يمكن قراءتها آليًا، حيث يحتوي كل فهرس على حقل باركود مشابه لذلك الموجود في منتجات المتاجر.
</p>

<h4>
	نظام قاعدة البيانات الموزعة
</h4>

<p>
	يوزَّع نظام إدارة قواعد البيانات DBMS وقاعدة البيانات database في نظام قاعدة البيانات الموزعة distributed database system من مواقع مختلفة متصلة بشبكة حاسوب، كما هو موضَّح في الشكل التالي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93911" href="https://academy.hsoub.com/uploads/monthly_2022_03/Distributed-Systems.png.790758a6ded1006446cba9b7bf80311d.png" rel="" data-fileext="png"><img alt="Distributed-Systems.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93911" data-unique="yp6tqz68c" style="width: 650px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_03/Distributed-Systems.thumb.png.b66aa6670b14e904569e20d3c60cb1eb.png"></a>
</p>

<p style="text-align: center;">
	الشكل 5: مثال على نظام قاعدة بيانات موزعة.
</p>

<h4>
	أنظمة قواعد البيانات الموزعة المتجانسة
</h4>

<p>
	تستخدِم أنظمة قواعد البيانات الموزعة المتجانسة Homogeneous distributed database systems برنامج إدارة قواعد البيانات نفسه من مواقع متعددة، كما يمكن تبادل البيانات بين هذه المواقع المختلفة بسهولة، فمثلًا، تستخدِم أنظمة معلومات المكتبات library information systems من البائع نفسه مثل نظام Geac Computer Corporation لإدارة قواعد البيانات نفسه، والذي يسمح بتبادل البيانات بسهولة بين مواقع مكتبة Geac المختلفة.
</p>

<h4>
	أنظمة قواعد البيانات الموزعة غير المتجانسة
</h4>

<p>
	تستخدِم مواقع مختلفة برنامج إدارة قواعد بيانات مختلف في نظام قاعدة البيانات الموزعة غير المتجانسة heterogeneous distributed database system، ولكن هناك برامج مشتركة إضافية تدعم تبادل البيانات بين هذه المواقع، فمثلًا، تستخدِم أنظمة قاعدة بيانات المكتبات المختلفة تنسيق الفهرسة المقروءة آليًا machine-readable cataloguing -أي MARC اختصارًا- نفسه لدعم تبادل بيانات تسجيلات المكتبة.
</p>

<h2>
	مصطلحات أساسية
</h2>

<ul>
	<li>
		عناصر البيانات data elements: حقائق تُمثِّل معلومات مستقاة من الواقع.
	</li>
	<li>
		قاعدة البيانات database: تجميعة مشتركة من البيانات ذات الصلة، وتُستخدَم لدعم أنشطة منظمة معيَّنة.
	</li>
	<li>
		نظام إدارة قواعد البيانات database management system - أو DBMS اختصارًا-: تجميعة من البرامج التي تُمكِّن المستخدِمين من إنشاء قواعد البيانات، والحفاظ عليها، والتحكم في جميع عمليات الوصول إليها.
	</li>
	<li>
		الجدول table: مجموعة من الحقول fields.
	</li>
	<li>
		نظام قاعدة البيانات المركزي centralized database system: يُخزَّن نظام إدارة قواعد البيانات DBMS وقاعدة البيانات database عند استخدام الأنظمة المركزية لقواعد البيانات centralized database system في موقع واحد تستخدمه أنظمةً أخرى عديدةً
	</li>
	<li>
		نظام قاعدة البيانات الموزعة distributed database system: يوزَّع نظام إدارة قواعد البيانات DBMS وقاعدة البيانات database في نظام قاعدة البيانات الموزعة distributed database system من مواقع مختلفة متصلة بشبكة حاسوب.
	</li>
	<li>
		نظام قاعدة البيانات الموزعة غير المتجانسة heterogeneous distributed database system: تستخدِم مواقع مختلفة برنامج إدارة قواعد بيانات مختلف، ولكن هناك برامج مشتركة إضافية تدعم تبادل البيانات بين هذه المواقع.
	</li>
	<li>
		نظام قاعدة البيانات الموزعة المتجانسة homogeneous distributed database systems: تستخدِم برنامج إدارة قواعد البيانات نفسه في مواقع متعددة.
	</li>
	<li>
		نظام قاعدة بيانات متعدد المستخدِمين multiuser database system: هو نظام إدارة قاعدة بيانات يدعم عدة مستخدِمين بصورة متزامنة.
	</li>
	<li>
		نموذج البيانات كائنية التوجه object-oriented data model: نظام لإدارة قواعد البيانات، حيث تُمثَّل المعلومات فيه على صورة كائنات كما هو مستخدم في البرمجة كائنية التوجه.
	</li>
	<li>
		نظام قاعدة بيانات أحادي المستخِدم single-user database system: نظام إدارة قاعدة بيانات يدعم مستخدم واحد فقط في كل مرة.
	</li>
	<li>
		النماذج التقليدية traditional models: هي نماذج البيانات التي سبقت النموذج العلائقي relational model.
	</li>
	<li>
		مبرمج التطبيق application programmer: هو المستخدم الذي يطبّق برامجًا تطبيقية محددة للوصول إلى البيانات المخزَّنة.
	</li>
	<li>
		مستخدم التطبيق application user: يمكنه الوصول إلى برنامجٍ تطبيقي موجود لأداء المهام اليومية.
	</li>
	<li>
		مسؤول قاعدة البيانات database administrator أو اختصارًا DBA: هو الشخص المسؤول عن إعطاء التصريح بالوصول إلى قاعدة البيانات ومراقبة استخدامها وإدارة جميع الموارد لدعم استخدام نظام قاعدة البيانات بأكمله.
	</li>
	<li>
		المستخدم النهائي end user: هو الشخص الذي تتطلب وظيفته الوصول إلى قاعدة بيانات للاستعلام عن التقارير وتحديثها وإنشائها.
	</li>
	<li>
		المستخدم الخبير sophisticated user: هو الشخص الذي يستخدم طرقًا أخرى مختلفة عن البرنامج التطبيقي للوصول إلى قاعدة البيانات.
	</li>
</ul>

<h2>
	تمارين
</h2>

<ol>
	<li>
		ما هو نظام إدارة قواعد البيانات؟
	</li>
	<li>
		ما هي خصائص نظام إدارة قواعد البيانات؟
	</li>
	<li>
		اذكر ثلاثة أمثلة لقواعد بيانات مستقاة من الواقع مثل تحتوي المكتبة على قاعدة بيانات للكتب.
	</li>
	<li>
		اذكر ثلاثة أمثلة لقواعد البيانات العلائقية المستخدَمة والأكثر شيوعًا.
	</li>
	<li>
		ما الفرق بين أنظمة قواعد البيانات المركزية والموزعة؟
	</li>
	<li>
		ما الفرق بين أنظمة قواعد البيانات الموزعة المتجانسة وأنظمة قواعد البيانات الموزعة غير المتجانسة؟
	</li>
</ol>

<p>
	ترجمة وبتصرف للفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-2-fundamental-concepts/" rel="external nofollow">Chapter 2 Fundamental Concepts</a>، والفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-6-classification-of-database-systems/" rel="external nofollow">Chapter 6 Classification of Database Management Systems</a>، والفصل <a href="https://opentextbc.ca/dbdesign01/chapter/chapter-14-database-users/" rel="external nofollow">Database Users</a> من كتاب <a href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبته Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%88%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D9%87-%D8%B9%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r509/" rel="">تحليل نظام الملفات لإدارة البيانات وتخزينها واختلافه عن نظام قاعدة البيانات</a>
	</li>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/general/%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%B2%D8%A7%D9%8A%D8%A7-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%82%D8%AF%D9%85%D9%87%D8%A7-r1257/" rel="">خصائص قواعد البيانات والمزايا التي تقدمها</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">519</guid><pubDate>Tue, 29 Jun 2021 12:00:00 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x648;&#x62A;&#x62E;&#x632;&#x64A;&#x646;&#x647;&#x627; &#x648;&#x627;&#x62E;&#x62A;&#x644;&#x627;&#x641;&#x647; &#x639;&#x646; &#x646;&#x638;&#x627;&#x645; &#x642;&#x627;&#x639;&#x62F;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%88%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D9%87-%D8%B9%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r509/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60e007ec54ad2_------.png.51adc54e8fe7a765f3da24baef8b4ce2.png" /></p>

<p>
	قطعت الطريقة التي تدير بها أجهزة الحاسوب البيانات شوطًا طويلًا على مدار العقود القليلة الماضية، كما يأخذ مستخدمي الحاسوب اليوم المزايا العديدة الموجودة في نظام قواعد البيانات أمرًا مسلَّمًا به على الرغم من عدم مرور وقت طويل على اعتماد أجهزة الحاسوب النظام القائم على الملفات File-based System والذي يُعَدّ النهج الأقل في الأناقة والتكلفة لإدارة البيانات.
</p>

<h2>
	النظام القائم على الملفات
</h2>

<p>
	يُعَدّ تخزين المعلومات في ملفات دائمة في الحاسوب إحدى طرق الحفاظ عليها، فمثلًا، يملك نظام الشركة عددًا من البرامج التطبيقية والمصمَّمة لمعالجة ملفات البيانات تلك، ثم توليد المخرجات والنتائج في ملفات أخرى، حيث تُصمَّم هذه البرامج بناءً على طلب المستخدِمين في المؤسسة، كما تضاف برامج جديدة إلى النظام عند الحاجة إليها، ويسمى هذا النظام بالنظام القائم على الملفات File-based System، فمثلًا، يمكن استخدام النظام القائم على الملفات لإدارة بيانات نظام مصرِفي تقليدي كما هو موضح في الشكل أدناه، حيث يوجد أقسام مختلفة في المصرِف، ولكل منها برامج خاصة لإدارة ومعالجة ملفات البيانات المختلفة، كما يمكن استخدام برامج لأداء عمليات عديدة في الأنظمة المصرفية، مثل: الخصم من الحساب أو ائتمانه، وإنشاء كشف برصيد الحساب، وإضافة قروض عقارية جديدة، وإنشاء كشوف حسابات شهرية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="93906" href="https://academy.hsoub.com/uploads/monthly_2022_03/FileBased.png.a9d2fbfeaa1d7c1e594d7d81fa2e1ed9.png" rel=""><img alt="FileBased.png" class="ipsImage ipsImage_thumbnailed" data-fileid="93906" data-unique="ce264gbk3" src="https://academy.hsoub.com/uploads/monthly_2022_03/FileBased.thumb.png.a90e82a30fc01b505cf69d280e73fb92.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	الشكل 1: مثال على نظام قائم على الملفات لبنك يستعمله لإدارة البيانات
</p>

<h2>
	عيوب النظام القائم على الملفات
</h2>

<p>
	يملك النظام القائم على الملفات والمستخدَم لحفظ المعلومات التنظيمية العديد من العيوب، والتي دفعت فيما بعد لتطوير أنظمة جديدة أكثر كفاءة، نذكر منها التالي:
</p>

<h3>
	تكرار البيانات
</h3>

<p>
	غالبًا ما تُنشأ ملفات البيانات الخاصة بالمؤسسة من طرف العديد من المبرمجين من أقسام مختلفة على مدى فترات طويلة من الزمن، مما يؤدي إلى تكرار البيانات عند تحديث أحد الحقول في أكثر من موضع واحد، حيث تسبب هذه العملية العديد من المشاكل، منها:
</p>

<ul>
<li>
		عدم توحيد تنسيق البيانات.
	</li>
	<li>
		الاحتفاظ بالمعلومة نفسها في عدة أماكن مختلفة، أي ضمن ملفات مختلفة.
	</li>
	<li>
		عدم تناسق البيانات، وهو الموقف الذي تتعارض فيه النسخ المختلفة من البيانات نفسها، مما يُهدر مساحة التخزين ويضاعف الجهد.
	</li>
</ul>
<h3>
	عزل البيانات
</h3>

<p>
	عزل البيانات هو الخاصية التي تحدد متى وكيف تصبح التغييرات التي يتم إجراؤها بواسطة عملية معينة مرئيةً للمستخدِمين المتزامنين، والأنظمة المتزامنة الأخرى؛ ويؤدي حدوث أي مشكلة في مزامنة البيانات إلى صعوبة استرجاع البيانات المناسِبة من قِبل التطبيقات الأخرى التي تصل لنفس البيانات والتي ربما تكون مخزَّنة في عدة ملفات مختلفة.
</p>

<h3>
	مشاكل السلامة
</h3>

<p>
	تُعَدّ مشاكل سلامة البيانات عيبًا آخرًا لاستخدام النظام القائم على الملفات، حيث تشير سلامة البيانات data integrity إلى صيانة البيانات، والتأكد من صحة وتناسق البيانات الموجودة في قاعدة البيانات، حيث يجب مراعاة العوامل التالية أثناء معالجة هذه المشكلة:
</p>

<ul>
<li>
		يجب على قيم البيانات استيفاء قيود تناسق معينة ومحدَّدة في برامج التطبيق.
	</li>
	<li>
		من الصعب إجراء تغييرات على برامج التطبيق من أجل فرض قيود جديدة.
	</li>
</ul>
<h3>
	مشاكل الأمان
</h3>

<p>
	يُعَدّ الأمان مشكلةً في النظام القائم على الملفات للأسباب التالية:
</p>

<ul>
<li>
		وجود قيود تتعلق بالحصول على الصلاحيات.
	</li>
	<li>
		تُضاف متطلبات التطبيق إلى النظام بطرق مخصصة، لذلك من الصعب فرض القيود.
	</li>
</ul>
<h3>
	الوصول المتزامن
</h3>

<p>
	التزامن هو قدرة قاعدة البيانات على السماح لعدة مستخدِمين بالوصول للسجل نفسه دون التأثير سلبًا على معالجة المعامَلات. يجب على النظام القائم على الملفات إدارة التزامن وضبطه باستخدام برامج تطبيقية، حيث يُقفَل الملف ويُمنَع الوصول إليه عندما يفتحه تطبيق ما، مما يعني أنه لا يمكن لأي شخص آخر الوصول إلى ذاك الملف في الوقت نفسه آنذاك.
</p>

<p>
	تُدير أنظمة قواعد البيانات عملية التزامن من خلال السماح لعدة مستخدِمين من الوصول إلى السجل نفسه، ويُعَدّ هذا فرق مهم بين قواعد البيانات والأنظمة القائمة على الملفات.
</p>

<h2>
	نظام قواعد البيانات
</h2>

<p>
	دفعت الصعوبات الناشئة عن استخدام النظام القائم على الملفات إلى تطوير نظام جديد لإدارة الكميات الكبيرة من المعلومات التنظيمية، والذي يُسمى بنظام قاعدة البيانات.
</p>

<p>
	تلعب قواعد البيانات وتقنيتها دورًا مهمًا في معظم المجالات التي تُستخدَم فيها أجهزة الحاسوب، بما في ذلك الأعمال التجارية، والتعليم، والطب، وغيرها، وسنبدأ في هذا المقال بتقديم بعض المفاهيم الأساسية المتعلقة بهذا المجال لفهم أساسيات أنظمة قواعد البيانات.
</p>

<h3>
	دور قواعد البيانات في إدارة الأعمال
</h3>

<p>
	يستخدِم الجميع قواعد البيانات بطريقة أو بأخرى، حتى ولو كانت استخدامات بسيطة مثل تخزين معلومات عن أصدقائهم وعائلاتهم فقط، كما يمكن تدوين هذه البيانات أو تخزينها على جهاز حاسوب باستخدام برنامج معالجة النصوص، أو يمكن حفظها على صورة جداول، ومع ذلك فإنّ أفضل طريقة لتخزين البيانات هي استخدام برامج إدارة قواعد البيانات، وهي أدوات برمجية قوية تسمح لك بتخزين البيانات، ومعالجتها، واسترجاعها بعدة طرق مختلفة.
</p>

<p>
	تتتبّع معظم الشركات معلومات العملاء من خلال تخزينها في قاعدة بيانات، وقد تشمل هذه البيانات العملاء، أو الموظفين، أو المنتجات، أو الطلبات، أو أي شيء آخر يساعد الشركة في تنفيذ مهامها.
</p>

<h2>
	معنى البيانات
</h2>

<p>
	تُعَدّ البيانات Data معلومات واقعيةً، مثل: القياسات، أو الإحصائيات حول الأشياء والمفاهيم، كما تُستخدَم للمناقشات، أو على أساس جزء من العمليات الحسابية، و يمكن أن تكون هذه البيانات شخصًا، أو مكانًا، أو حدَثًا، أو إجراءً، أو أي شيء آخر، حيث تُمثِّل كل معلومة أو حقيقة معينة عنصرًا من عناصر البيانات أي data element.
</p>

<p>
	إذا كانت البيانات معلومات، وكانت المعلومات هي ما نعتمد عليه في العمل، فيمكنك البدء في معرفة المكان الذي قد تخزِّن هذه البيانات فيه، فمثلًا، يُمكن تخزين البيانات في:
</p>

<ul>
<li>
		ملفات تخزين مخصصة
	</li>
	<li>
		جداول البيانات
	</li>
	<li>
		المجلدات
	</li>
	<li>
		الدفاتر
	</li>
	<li>
		القوائم
	</li>
	<li>
		الأوراق
	</li>
</ul>
<p>
	تخزِّن كل هذه المواد المعلومات وكذلك قاعدة البيانات.
</p>

<p>
	بسبب الطبيعة الميكانيكية لقواعد البيانات، نجد أنَّ لها مقدرة كبيرة على إدارة ومعالجة المعلومات المُخزَّنة فيها، مما يجعل هذه المعلومات أكثر فائدة لعملك.
</p>

<p>
	يمكننا البدء من خلال هذا الفهم للبيانات في رؤية كيف يمكن لقاعدة البيانات تخزين مجموعة من البيانات، وتنظيمها، وإجراء بحث سريع عليها، واسترجاعها، ومعالجتها. ويتضمن هذا الكتاب والفصول التالية الكثير من التفاصيل عن أنظمة إدارة قواعد البيانات وكيفية التعامل معها.
</p>

<h2>
	مصطلحات أساسية
</h2>

<ul>
<li>
		<strong>التزامن Concurrency</strong>: هو قدرة قاعدة البيانات على السماح لعدة مستخدمين من الوصول إلى السجل نفسه دون التأثير سلبًا على معالجة المعاملات.
	</li>
	<li>
		<strong>عنصر البيانات Data element</strong>: حقيقة أو معلومة واحدة.
	</li>
	<li>
		<strong>عدم تناسق البيانات Data inconsistency</strong>: الحالة التي تتعارض فيها النسخ المختلفة للبيانات نفسها.
	</li>
	<li>
		<strong>عزل البيانات Data isolation</strong>: الخاصية التي تحدد متى وكيف تصبح التغييرات التي تجري بواسطة عملية معينة مرئيةً للمستخدِمين المتزامنين والأنظمة المتزامنة الأخرى.
	</li>
	<li>
		<strong>سلامة البيانات Data integrity</strong>: يشير إلى الصيانة والتأكد من أن البيانات في قاعدة البيانات صحيحة ومتّسقة.
	</li>
	<li>
		<strong>تكرار البيانات Data redundancy</strong>: حالة تحدث في قاعدة بيانات عندما يحتاج أحد الحقول إلى التحديث في أكثر من جدول.
	</li>
	<li>
		<strong>نظام قاعدة البيانات Database approach</strong>: يسمح بإدارة كميات كبيرة من المعلومات التنظيمية.
	</li>
	<li>
		<strong>برامج إدارة قواعد البيانات Database management software</strong>: أداة برمجية قوية تتيح لك تخزين البيانات، ومعالجتها، واسترجاعها بطرق مختلفة.
	</li>
	<li>
		<strong>النظام القائم على الملفات File-based system</strong>: برنامج تطبيق مصمَّم للتعامل مع ملفات البيانات.
	</li>
</ul>
<h2>
	تمارين
</h2>

<ol>
<li>
		ناقش كل من المصطلحات التالية:
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		البيانات
	</li>
	<li>
		الحقل
	</li>
	<li>
		السجل
	</li>
	<li>
		الملف
	</li>
</ul>
<ol start="2">
<li>
		ما هو تكرار البيانات؟
	</li>
	<li>
		ناقش عيوب النظام القائم على الملفات.
	</li>
	<li>
		اشرح الفرق بين البيانات والمعلومات.
	</li>
	<li>
		استخدم الشكل أدناه للإجابة على الأسئلة التالية:
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		كم عدد السجلات التي يحتوي عليها الملف؟
	</li>
	<li>
		كم عدد الحقول في كل سجل؟
	</li>
	<li>
		ما المشكلة التي قد تواجهها إذا أردت إنشاء قائمة مرتبة حسب المدينة؟
	</li>
	<li>
		كيف يمكنك حل هذه المشكلة عن طريق تعديل هيكلة الملف؟
	</li>
</ul>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
<thead><tr>
<th>
				PROJECT_CODE
			</th>
			<th>
				PROJECT_MANAGER
			</th>
			<th>
				MANAGER_PHONE
			</th>
			<th>
				MANAGER_ADDRESS
			</th>
			<th>
				PROJECT_BID_PRICE
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				21-5Z
			</td>
			<td>
				Holly B. Parker
			</td>
			<td>
				904-338-3416
			</td>
			<td>
				3334 Lee Rd., Gainesville, FL 37123
			</td>
			<td>
				$16٬833٬460٫00
			</td>
		</tr>
<tr>
<td>
				25-2D
			</td>
			<td>
				Jane D. Grant
			</td>
			<td>
				615-898-9909
			</td>
			<td>
				218 Clark Blvd., Nashville, TN 36362
			</td>
			<td>
				$12,500٬000٫00
			</td>
		</tr>
<tr>
<td>
				25-5A
			</td>
			<td>
				George F. Dorts
			</td>
			<td>
				615-227-1245
			</td>
			<td>
				124 River Dr., Franklin, TN 29185
			</td>
			<td>
				$32٬512٬420٫00
			</td>
		</tr>
<tr>
<td>
				25-9T
			</td>
			<td>
				Holly B. Parker
			</td>
			<td>
				904-338-3416
			</td>
			<td>
				3334 Lee Rd., Gainesville, FL 37123
			</td>
			<td>
				$21٬563٬234٫00
			</td>
		</tr>
<tr>
<td>
				27-4Q
			</td>
			<td>
				George F. Dorts
			</td>
			<td>
				615-227-1245
			</td>
			<td>
				124 River Dr., Franklin, TN 29185
			</td>
			<td>
				$10٬314٬545٫00
			</td>
		</tr>
<tr>
<td>
				29-2D
			</td>
			<td>
				Holly B. Parker
			</td>
			<td>
				904-338-3416
			</td>
			<td>
				3334 Lee Rd., Gainesville, FL 37123
			</td>
			<td>
				$25٬559٬999٫00
			</td>
		</tr>
<tr>
<td>
				31-7P
			</td>
			<td>
				0/11liam K. Moor
			</td>
			<td>
				904-445-2719
			</td>
			<td>
				216 Morton Rd., Stetson, FL 30155
			</td>
			<td>
				$56٬850٬000٫00
			</td>
		</tr>
</tbody>
</table>
<p style="text-align: center;">
	جدول التمرين رقم 5
</p>

<p>
	ترجمة وبتصرف للفصل <a data-ss1625296435="1" href="https://opentextbc.ca/dbdesign01/chapter/chapter-1-before-the-advent-of-database-systems/" rel="external nofollow">Chapter 1 Before the Advent of Database Systems</a> من كتاب <a data-ss1625296435="1" href="https://opentextbc.ca/dbdesign01/" rel="external nofollow">Database Design</a> لصاحبه Adrienne Watt.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r519/" rel="">المفاهيم الأساسية في قواعد البيانات وتصميمها</a>
	</li>
	<li>
		<a data-ss1625296435="1" href="https://academy.hsoub.com/devops/servers/databases/%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D9%81%D8%B1%D9%88%D9%82%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sql-%D9%88%D9%86%D8%B8%D9%8A%D8%B1%D8%A7%D8%AA%D9%87%D8%A7-nosql-r71/" rel="">شرح الفروقات بين قواعد بيانات SQL ونظيراتها NoSQL</a>
	</li>
	<li>
		<a data-ss1625296435="1" href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A%D8%A9-sqlite-%D9%85%D8%B9-mysql-%D9%85%D8%B9-postgresql-r72/" rel="">مقارنة بين أنظمة إدارة قواعد البيانات العلاقية: SQLite مع MySQL مع </a><a data-ss1625296435="1" href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A%D8%A9-sqlite-%D9%85%D8%B9-mysql-%D9%85%D8%B9-postgresql-r72/" rel="">PostgreSQL</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب <a href="https://academy.hsoub.com/files/26-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تصميم قواعد البيانات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">509</guid><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x633;&#x628;&#x639;&#x629; &#x644;&#x631;&#x648;&#x627;&#x628;&#x637; &#x627;&#x644;&#x62C;&#x62F;&#x627;&#x648;&#x644; &#x641;&#x64A; SQL</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%B3%D8%A8%D8%B9%D8%A9-%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D9%81%D9%8A-sql-r426/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_06/5d0a176dbede7_.jpg.806bbbe6892fda6d56cdf88fdc7ad958.jpg" /></p>

<p>
	من المُستبعد احتمال أنّك ستعمل مع بيانات من جدول واحد فقط، لذا ستحتاج إلى الحصول على البيانات من جداول مُتعدّدة. استعمال الروابط (Joins) أحد الخيارات للقيام بالأمر، وفي قواعد البيانات العلائقيّة (Relational databases)، فالروابط هي التي تجعل قواعد البيانات علائقيّة. يوفّر هذا الدّرس تذكيرا سريعا بالأنواع الأربعة الأساسيّة لروابط SQL وثلاثة من فروعها.
</p>

<h2 id="-">
	ما هو الرابط؟
</h2>

<p>
	الرابط طريقة للربط بين البيانات من جدولين أو أكثر اعتمادا على عمود مُشترك بين الجداول. على سبيل المثال، يُمكن ربط جدول عناوين مع جدول أرقام الهواتف حسب اسم شخص مُعيّن (أعطني عنوان ورقم هاتف الشّخص المُسمّى مُحمّد أحمد).
</p>

<h2 id="-">
	لماذا تعد الروابط مهمة؟
</h2>

<p>
	تُمكّن الروابط من الحصول على البيانات من عدّة جداول باستعلام (query) واحد. من المُستبعد بأنّك ستعمل مع جدول واحد فقط. استعمال جدول واحد فقط يعني بأنّك إمّا تحدّ نفسك في كميّة البيانات التي تحصل عليها أو أنّك تمتلك الكثير من البيانات التي قد تجعل من الجدول صعب المراس. تُنشئ الروابط <strong>علاقة</strong> بين جدول وآخر (ومنه جاء مُصطلح “قواعد البيانات العلائقيّة”).
</p>

<h2 id="-sql-">
	ما هي أنواع روابط SQL الموجودة؟
</h2>

<p>
	ما يلي عبارة عن قائمة من أنواع روابط SQL الأربعة الرّئيسية (إضافة إلى ثلاثة أشكال فرعيّة)، مُرتبة من أكثرها حصرا إلى أكثرها شمولا. أضفنا كذلك عينات SQL إلى الشروحات المكتوبة لتجربتها والنظر إلى نتيجة استعمال رابط مُعيّن في الاستعلام الخاص بك.
</p>

<h2 id="-inner-join">
	الرابط الدّاخلي Inner Join
</h2>

<p>
	رُبما يعتبر الرّابط الدّاخلي من أكثر أنواع روابط SQL استعمالا. ويُرجِع الرابط الداخلي جميع الصفوف التي تُحقّق شرط الرّبط (join condition) من جدولين أو أكثر.
</p>

<p style="text-align: center;">
	<img alt="inner_join.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30108" data-unique="7e0f4x9gd" src="https://academy.hsoub.com/uploads/monthly_2019_06/inner_join.png.926f1b578c93788516f078250687455c.png"></p>

<h3 id="-sql">
	عينة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_6" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
INNER JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName</span><span class="pun">;</span></pre>

<h2 id="-">
	الربط اليساري (الخارجي)
</h2>

<p>
	يُرجع الرّبط اليساري الخارجي (أحيانا يُختصر إلى الرّبط اليساري) جميع الصفوف من الجدول المُحدّد يسار الشّرط ON والصفوف التي تًحقّق شرط الرّبط فقط من الجدول في اليمين.
</p>

<p style="text-align: center;">
	<img alt="left_join.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30109" data-unique="m9i2ymgrc" src="https://academy.hsoub.com/uploads/monthly_2019_06/left_join.png.5a8836248c8ea5a51c2be8b49e0bdf84.png"></p>

<h3 id="-sql">
	عينة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_8" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
LEFT OUTER JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName</span></pre>

<h2 id="-">
	الربط اليساري (الخارجي) دون تقاطع
</h2>

<p>
	هذا الرّبط فرع من فروع الرّبط اليساري، ويُرجع جميع الصفوف من الجدول على يسار الشّرط ON والتي تُحقّق شرط الرّبط كذلك، دون الصفوف التي تُحقّق شرط الرّبط من الجدول على اليمين.
</p>

<p style="text-align: center;">
	<img alt="left_join2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30110" data-unique="wx9jg2fzi" src="https://academy.hsoub.com/uploads/monthly_2019_06/left_join2.png.fb62ef60c6452c6a48d1ff11f88d2eb7.png"></p>

<h3 id="-sql">
	عينة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_10" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
LEFT OUTER JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName
WHERE B</span><span class="pun">.</span><span class="pln">columnName IS NULL</span></pre>

<h2 id="-">
	الربط اليميني (الخارجي)
</h2>

<p>
	يُرجع الرّبط اليميني الخارجي (أحيانا يُختصر إلى الرّبط اليميني) جميع الصّفوف من يمين شرط ON والصفوف التي تحقّق شرط الرّبط فقط من الجدول على اليسار.
</p>

<p style="text-align: center;">
	<img alt="right_join.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30113" data-unique="2gqxfi34o" src="https://academy.hsoub.com/uploads/monthly_2019_06/right_join.png.ddc714993660da202d42970e80a77590.png"></p>

<h3 id="-sql">
	عيّنة SQL
</h3>

<pre class="ipsCode">
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">columns</span>
<span class="hljs-keyword">FROM</span> TableA
<span class="hljs-keyword">RIGHT</span> <span class="hljs-keyword">OUTER</span> <span class="hljs-keyword">JOIN</span> TableB
<span class="hljs-keyword">ON</span> A.columnName = B.columnName
</pre>

<h2 id="-">
	الربط اليميني (الخارجي) دون تقاطع
</h2>

<p>
	هذا الرّبط فرع من فروع الرّبط اليميني، ويُرجع جميع الصفوف من الجدول على يمين الشّرط ON والتي تُحقّق شرط الرّبط كذلك، دون الصفوف التي تُحقّق شرط الرّبط من الجدول على اليسار.
</p>

<p style="text-align: center;">
	<img alt="right_join2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30114" data-unique="rjjl2ttnm" src="https://academy.hsoub.com/uploads/monthly_2019_06/right_join2.png.0962808c39b743c3edbfdb7284fafae9.png"></p>

<h3 id="-sql">
	عيّنة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_14" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
RIGHT OUTER JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName
WHERE A</span><span class="pun">.</span><span class="pln">columnName IS NULL</span></pre>

<h2 id="-">
	الربط التام (الخارجي)
</h2>

<p>
	يُرجع الرّبط التّام الخارجي (يُختصر أحيانا إلى الرّبط التّام) جميع الصفوف من كلا الجدولين المُحددين في الشّرط ON في حالة <em>لم</em> يتحقق شرط الرّبط (ما يشمل القيم الفارغة NULL).
</p>

<p style="text-align: center;">
	<img alt="outer_join.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30111" data-unique="63oybx6pg" src="https://academy.hsoub.com/uploads/monthly_2019_06/outer_join.png.92a6fa61f4a2c93e23da49f3c124e678.png"></p>

<h3 id="-sql">
	عيّنة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_16" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
FULL JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName</span></pre>

<h2 id="-">
	الربط التام (الخارجي) دون تقاطع
</h2>

<p>
	هذا فرع من الرّوابط التّامة الخارجية يُرجع جميع الصفوف من كلا الجدولين المُحدّدين في الشّرط ON في حالة <em>لم</em> يتحقّق شرط الرّبط (باستثناء القيم الفارغة NULL).
</p>

<p style="text-align: center;">
	<img alt="outer_join2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30112" data-unique="tymgmheuc" src="https://academy.hsoub.com/uploads/monthly_2019_06/outer_join2.png.2dbdac4a3135173055d6532d3371cf9e.png"></p>

<h3 id="-sql">
	عيّنة SQL
</h3>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_2849_18" style="">
<span class="pln">SELECT columns
FROM </span><span class="typ">TableA</span><span class="pln">
FULL JOIN </span><span class="typ">TableB</span><span class="pln">
ON A</span><span class="pun">.</span><span class="pln">columnName </span><span class="pun">=</span><span class="pln"> B</span><span class="pun">.</span><span class="pln">columnName
WHERE A</span><span class="pun">.</span><span class="pln">columnName IS NULL
OR B</span><span class="pun">.</span><span class="pln">columnName IS NULL</span></pre>

<h2 id="-">
	ختاما
</h2>

<p>
	غطّى هذا الدّرس الأنواع الأربعة الأساسيّة لروابط SQL وثلاثة روابط مُتفرّعة منها. الروابط هي التي تجعل من قواعد البيانات العلائقيّة علاقية، لذا إن لم تحترف أنواع روابط SQL المختلفة، فاستعمل TeamSQL الآن واستخدم عينات SQL الموفَّرة في هذا الدّرس لتُلقي نظرة على كيفيّة الحصول على أجزاء مختلفة من البيانات الخاصة بك.
</p>

<p>
	ترجمة -بتصرّف- للمقال <a href="https://blog.teamsql.io/the-seven-types-of-sql-joins-5bc72f69a609" rel="external nofollow">The Seven Types of SQL Joins </a> لصاحبه Eren Baydemir.
</p>
]]></description><guid isPermaLink="false">426</guid><pubDate>Sun, 23 Jun 2019 08:06:02 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x63A;&#x64A;&#x64A;&#x631; &#x645;&#x62C;&#x644;&#x62F; &#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; MariaDB &#x625;&#x644;&#x649; &#x645;&#x643;&#x627;&#x646;&#x64D; &#x622;&#x62E;&#x631;</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1-%D9%85%D8%AC%D9%84%D8%AF-%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-mariadb-%D8%A5%D9%84%D9%89-%D9%85%D9%83%D8%A7%D9%86%D9%8D-%D8%A2%D8%AE%D8%B1-r349/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59c50272ce681_main(46).png.46e4000918d190d1eb9160b67262eacb.png" /></p>

<p>
	تتوسع قواعد البيانات بسرعة مع مرور الزمن، وتكاد في بعض الأحيان أن تملأ المساحة التخزينية المتاحة في نظام الملفات كلها. وقد تتعرض أيضًا إلى مشاكل في الإدخال والإخراج نتيجةً لمحاولة عدِّة خدمات الكتابة على (أو القراءة من) القسم نفسه معًا.<br>
	هذا الدرس سيفيدك لو كنتَ تريد إضافة المزيد من المساحة التخزينية، أو استخدام خصائص جهاز التخزين لزيادة الأداء (ربما عبر استخدام RAID)، أو تتطلّع إلى استعمال ميزات أخرى للتخزين. سيعلِّمُك هذا الدرس طريقة تغيير مجلد تخزين بيانات MySQL.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<p>
	للمتابعة مع هذا الدرس يجب أن يكون عندك:<br>
	- خادوم CentOS 7 مع حساب مستخدم ليس جذرًا لكنه يمتلك امتيازات الجذر باستعمال الأمر <code>sudo</code>، وفيه خادوم MariaDB مثبت مسبقًا، يمكنك معرفة المزيد من المعلومات حول ضبط CentOS 7 بقراءة درس <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-centos-7-r345/" rel="">الضبط المبدئي لخادوم CentOS 7</a>، وإذا لم تثبت MariaDB من قبل، فسيساعدك درس <a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%86%D8%B8%D8%A7%D9%85%D9%8A-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-mysql-%D9%88postgresql-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r194/" rel="">تثبيت وإعداد نظامي إدارة قواعد البيانات MySQL وPostgreSQL</a> على ذلك.<br>
	سننقل البيانات من جهاز تخزينٍ موصولٍ (mounted) في نقطة الوصل <code>‎/mnt/volume-nyc1-01</code>. يمكنك معرفة المزيد من المعلومات عن أجهزة التخزين والأقسام وكيفية استخدامها في درس «<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D9%85%D9%87%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r302/" rel="">كيفية إجراء مهام إدارة أجهزة التخزين البسيطة في لينكس</a>».<br>
	سيعلّمك هذا الدرس طريقة نقل مجلد تخزين بيانات MySQL إلى مكانٍ جديد بغض النظر عن وسيط التخزين الذي تستخدمه (قرص صلب، أو مصفوفة RAID، أو تخزين شبكي).
</p>

<h2 id="الخطوة-الأولى-نقل-مجلد-بيانات-mariadb">
	الخطوة الأولى: نقل مجلد بيانات MariaDB
</h2>

<p>
	لكي نحضِّر لنقل مجلد بيانات MariaDB فلنحاول معرفة مساره الحالي عبر بدء جلسة تفاعلية بتسجيل الدخول بحساب المستخدم <code>root</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<span class="pln">mysql </span><span class="pun">-</span><span class="pln">u root </span><span class="pun">-</span><span class="pln">p</span></pre>

<p>
	أدخِل كلمة المرور عند طلبها، ثم نفِّذ التعليمة التالية من سطر أوامر <code>mysql</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_8" style="">
<span class="kwd">select</span><span class="pln"> </span><span class="pun">@</span><span class="lit">@datadir</span><span class="pun">;</span></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs asciidoc"><span class="hljs-code"><span class="pun">+-----------------+</span></span><span class="pln">
</span><span class="hljs-header"><span class="pun">|</span><span class="pln"> </span><span class="pun">@</span><span class="lit">@datadir</span><span class="pln">       </span><span class="pun">|</span><span class="pln">
</span><span class="pun">+-----------------+</span></span><span class="pln">
</span><span class="hljs-header"><span class="pun">|</span><span class="pln"> </span><span class="str">/var/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">/</span><span class="pln"> </span><span class="pun">|</span><span class="pln">
</span><span class="pun">+-----------------+</span></span><span class="pln">
</span><span class="lit">1</span><span class="pln"> row </span><span class="kwd">in</span><span class="pln"> </span><span class="kwd">set</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0.00</span><span class="pln"> sec</span><span class="pun">)</span></code></pre>

<p>
	الناتج السابق يُظهِر أنَّ قواعد MariaDB مضبوطة لاستخدام مجلد تخزين البيانات المبدئي <code>‎/var/lib/mysql/‎</code>، وهذا هو مسار المجلد الذي علينا نقله؛ نفِّذ الأمر <code>exit</code> للخروج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs bash"><span class="hljs-keyword"><span class="kwd">exit</span></span></code></pre>

<p>
	لكي نضمن سلامة البيانات، علينا أولًا إغلاق خادوم MariaDB قبل تعديل مجلد البيانات:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl stop mariadb</span></code></pre>

<p>
	الأمر <code>systemctl</code> لا يُظهِر نتيجة تنفيذ أوامر إدارة الخدمات، لذا إذا أردتَ التحقق أنَّ الخادوم قد أُغلِق بنجاح، فنفِّذ الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl status mariadb</span></code></pre>

<p>
	انظر إلى آخر سطر من ناتج الأمر السابق الذي يجب أن يخبرك أنَّ الخادوم قد توقف عن العمل:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs css"><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Dec</span></span><span class="pln"> </span><span class="lit">16</span><span class="pln"> </span><span class="lit">18</span><span class="hljs-pseudo"><span class="pun">:</span><span class="lit">29</span></span><span class="hljs-pseudo"><span class="pun">:</span><span class="lit">26</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">mysql</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">systemd</span></span><span class="hljs-attr_selector"><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Stopped</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">MariaDB</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">database</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">server</span></span><span class="pun">.</span></code></pre>

<p>
	سننسخ مجلد قواعد البيانات الموجود حاليًا إلى المكان الجديد باستخدام <code>rsync</code> وذلك بعد إغلاق الخادوم.<br>
	سنستخدم الخيار <code>‎-a</code> للحفاظ على الأذونات وخصائص المجلد الأخرى، وسيزودنا الخيار <code>‎-v</code> بمخرجات توضِّح سير عملية النسخ.<br>
	ملاحظة: احرص على عدم وجود خط مائل (<code>/</code>) في نهاية مسار المجلد الذي ستُنسَخ البيانات منه، والذي قد يُضاف تلقائيًا إذا كنتَ تُكمِل المسار باستعمال زر tab، فإذا كان الخط المائل موجودًا فسينسخ الأمر <code>rsync</code> المجلد نفسه وليس محتوياته.
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs lasso"><span class="pln">sudo rsync </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">av</span></span><span class="pln"> </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">mysql </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">volume</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">nyc1</span></span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">01</span></span></code></pre>

<p>
	بعد إكمال تنفيذ أمر <code>rsync</code> السابق، فأعد تسمية المجلد الحالية وأضف إليه اللاحقة <code>‎.bak</code> (لتعرف أنه نسخة احتياطية وليس المجلد الأصل) وأبقِه موجودًا حتى تتأكد من نجاح عملية النقل؛ أعدنا تسميته لتفادي الخلط بين الملفات الموجودة في المكان القديم والجديد:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs cs"><span class="pln">sudo mv </span><span class="pun">/</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">mysql </span><span class="pun">/</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">.</span><span class="pln">bak</span></code></pre>

<p>
	سنشرع الآن بتعديل ضبط قواعد البيانات.
</p>

<h2 id="الخطوة-الثانية-الإشارة-إلى-مكان-تخزين-البيانات-الجديد">
	الخطوة الثانية: الإشارة إلى مكان تخزين البيانات الجديد
</h2>

<p>
	هنالك طرائق عدِّة لتجاوز القيم المضبوطة في MySQL، إذ تُضبَط التعليمة <code>datadir</code> مبدئيًا إلى <code>‎/var/lib/mysql</code> في ملف <code>‎/etc/my.cnf</code>، لذا لنعدِّل هذا الملف لتغيير المسار إلى المجلد الجديد:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vi </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="kwd">my</span><span class="pun">.</span><span class="pln">cnf</span></code></pre>

<p>
	ابحث عن السطر الذي يبدأ بالكلمة <code>datadir=‎</code> وغيّر المسار الذي يُشير إليه إلى المسار الجديد. ولوجود ملف المقبس (socket file) في مجلد البيانات القديم، فعلينا تحديثه ليشير إلى المكان الجديد أيضًا:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs ruby"><span class="pun">[</span><span class="pln">mysqld</span><span class="pun">]</span><span class="pln">
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
datadir</span><span class="pun">=</span><span class="hljs-regexp"><span class="str">/mnt/</span><span class="pln">volume</span></span><span class="pun">-</span><span class="pln">nyc1</span><span class="pun">-</span><span class="hljs-number"><span class="lit">01</span></span><span class="pun">/</span><span class="pln">mysql
socket</span><span class="pun">=</span><span class="hljs-regexp"><span class="str">/mnt/</span><span class="pln">volume</span></span><span class="pun">-</span><span class="pln">nyc1</span><span class="pun">-</span><span class="hljs-number"><span class="lit">01</span></span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">.</span><span class="pln">sock
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></code></pre>

<p>
	بعد تحديث الأسطر السابقة الموجودة في الملف، فلنضف ضبطًا خاصًا بعميل <code>mysql</code> وذلك بإضافة الضبط الآتي إلى نهاية الملف (لكي لا نُقسِّم تعليمات الضبط الخاصة بخادوم MySQL إلى قسمين) لكن قبل السطر الذي يحتوي على الكلمة <code>include</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs avrasm"><span class="pun">[</span><span class="pln">client</span><span class="pun">]</span><span class="pln">
port</span><span class="pun">=</span><span class="hljs-number"><span class="lit">3306</span></span><span class="pln">
socket</span><span class="pun">=</span><span class="str">/mnt/</span><span class="pln">volume</span><span class="pun">-</span><span class="pln">nyc1</span><span class="pun">-</span><span class="hljs-number"><span class="lit">01</span></span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">/</span><span class="pln">mysql</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">sock</span></span><span class="pln">

</span><span class="pun">!</span><span class="pln">includedir </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="kwd">my</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">cnf</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">d</span></span></code></pre>

<p>
	بعد أن تنتهي من تعديل الملف، فاضغط على زر Escape ثم اكتب <code>‎:wq!‎</code> لحفظ الملف والخروج من المحرر.
</p>

<h2 id="الخطوة-الثالثة-إعادة-تشغيل-خادوم-mariadb">
	الخطوة الثالثة: إعادة تشغيل خادوم MariaDB
</h2>

<p>
	بعد أن حدثنا الضبط ليشير إلى مسار المجلد الجديد، فيمكننا الآن تشغيل خادوم MariaDB والتأكد من عمله بشكل سليم:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl start mariadb
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl status mariadb</span></code></pre>

<p>
	للتأكد أننا نستعمل المجلد الموجود في المسار الجديد لتخزين البيانات، فسنتصل عبر عميل <code>mysql</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs lasso"><span class="pln">mysql </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">u</span></span><span class="pln"> root </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">p</span></span></code></pre>

<p>
	وننظر إلى قيمة <code>datadir</code> مجددًا:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs sql"><span class="hljs-operator"><span class="hljs-keyword"><span class="kwd">select</span></span><span class="pln"> </span><span class="pun">@</span><span class="lit">@datadir</span><span class="pun">;</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_8668_10" style="">
<code class="hljs asciidoc"><span class="hljs-code"><span class="pun">+----------------------------+</span></span><span class="pln">
</span><span class="hljs-header"><span class="pun">|</span><span class="pln"> </span><span class="pun">@</span><span class="lit">@datadir</span><span class="pln">                  </span><span class="pun">|</span><span class="pln">
</span><span class="pun">+----------------------------+</span></span><span class="pln">
</span><span class="hljs-header"><span class="pun">|</span><span class="pln"> </span><span class="str">/mnt/</span><span class="pln">volume</span><span class="pun">-</span><span class="pln">nyc1</span><span class="pun">-</span><span class="lit">01</span><span class="pun">/</span><span class="pln">mysql</span><span class="pun">/</span><span class="pln"> </span><span class="pun">|</span><span class="pln">
</span><span class="pun">+----------------------------+</span></span><span class="pln">
</span><span class="lit">1</span><span class="pln"> row </span><span class="kwd">in</span><span class="pln"> </span><span class="kwd">set</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0.01</span><span class="pln"> sec</span><span class="pun">)</span></code></pre>

<p>
	نفِّذ <code>exit</code> للخروج من العميل.<br>
	بعد أن أعدت تشغيل خادوم MariaDB وتأكدت أنَّه يستعمل المكان الجديد، فخذ وقتك للتحقق من سلامة بياناتك وأنَّ قواعد بياناتك تعمل دون مشاكل، وبعدئذٍ تستطيع حذف المجلد الاحتياطي بالأمر <code>sudo rm -rf /var/lib/mysql.bak</code>.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا الدرس طريقة نقل مجلد بيانات MariaDB إلى مسارٍ جديد، وهذه الطريقة ستعمل مهما كانت تقنية التخزين التي يعتمدها وسيط التخزين الذي ستستعمله.<br>
	ولمّا كانت قواعد بيانات MariaDB مشتقةً من MySQL، فيمكنك معرفة المزيد من المعلومات حول إدارة مجلدات البيانات في القسمين الآتيين من توثيق MySQL الرسمي: <a href="https://dev.mysql.com/doc/refman/5.7/en/data-directory.html" rel="external nofollow">The MySQL Data Directory</a> و <a href="https://dev.mysql.com/doc/refman/5.7/en/multiple-data-directories.html" rel="external nofollow">Setting Up Multiple Data Directories</a>.<br>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-change-a-mariadb-data-directory-to-a-new-location-on-centos-7" rel="external nofollow">How To Change a MariaDB Data Directory to a New Location on CentOS 7</a> لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">349</guid><pubDate>Sat, 23 Sep 2017 08:00:00 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x646;&#x638;&#x627;&#x645;&#x64A; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; MySQL &#x648;PostgreSQL &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%86%D8%B8%D8%A7%D9%85%D9%8A-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-mysql-%D9%88postgresql-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r194/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-mysql-postgresql.png.1bbf8f71a09c86025375b463c8ae271e.png" /></p>

<p dir="rtl">توفر أوبنتو خادومَيّ قواعد بيانات شهيرَين هما:</p><ul dir="rtl"><li>قواعد بيانات MySQL.</li><li>قواعد بيانات PostgreSQL.</li></ul><p dir="rtl">حيث تتوفران في المستودع الرئيسي (main)؛ ويشرح هذا الدرس كيفية تثبيت وضبط خادومَي قواعد البيانات آنفَيّ الذكر.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-mysql-postgresql.png.0c59848e0ca5e036af787c0fcee87c45.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="11862" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-mysql-postgresql.thumb.png.05f4ae61a9fb203b3711b02b753264c6.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-mysql-postgresql.thumb.png"></a></p><h2 dir="rtl">MySQL</h2><p dir="rtl">إن MySQL هو خادوم قواعد بيانات سريع ومتعدد الخيوط (multi-threaded) ومتعدد المستخدمين ومرن جدًا؛ مُطوَّر للأنظمة الإنتاجية المحورية والتي تتحمل حِملًا ثقيلًا، ويمكن أيضًا تضمينه في البرمجيات سريعة النشر (mass-deployed).</p><h3 dir="rtl">التثبيت</h3><p dir="rtl">نفذِّ الأمر الآتي في الطرفية لتثبيت MySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install mysql-server</pre><p dir="rtl">سيُطلب منك إدخال كلمة مرور للمستخدم الجذر لخادوم MySQL أثناء التثبيت.</p><p dir="rtl">بعد أن ينتهي التثبيت، فيجب أن يبدأ خادوم MySQL تلقائيًا؛ تستطيع تنفيذ الأمر الآتي في الطرفية للتحقق إذا كان خادوم MySQL يعمل أم لا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo netstat -tap | grep mysql</pre><p dir="rtl">يجب أن تشاهد شيئًا شبيهًا بما يلي بعد تنفيذ الأمر السابق:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">tcp 0 0 localhost:mysql *:* LISTEN 2556/mysqld</pre><p dir="rtl">إذا لم يكن يعمل الخادوم، فتستطيع تشغيله بالأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service mysql restart</pre><h3 dir="rtl">الضبط</h3><p dir="rtl">تستطيع تعديل الملف <span style="font-family:courier new,courier,monospace;">‎/etc/mysql/my.cnf</span> لضبط الإعدادات الأساسية، مثل ملف السجل، ورقم المنفذ ...إلخ. فمثلًا لضبط MySQL ليستمع إلى الاتصالات من مضيفي الشبكة، عليك تعديل قيمة التعليمة <span style="font-family:courier new,courier,monospace;">bind-address </span>إلى عنوان IP للخادوم:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bind-address = 192.168.0.5</pre><p dir="rtl"><strong>ملاحظة</strong>: عدِّل 192.168.0.5 إلى العنوان الملائم.</p><p dir="rtl">بعد إجراء التعديلات على ملف <span style="font-family:courier new,courier,monospace;">‎/etc/mysql/my.cnf</span>؛ فيجب إعادة تشغيل عفريت MySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service mysql restart</pre><p dir="rtl">أدخل الأمر الآتي في الطرفية إذا رغبت بتغيير كلمة مرور المستخدم الجذر (root) في MySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo dpkg-reconfigure mysql-server-5.5</pre><p dir="rtl">سيُوقَف عمل عفريت MySQL، وستُسأل عن كلمة المرور الجديدة.</p><h3 dir="rtl">محركات قاعدة البيانات</h3><p dir="rtl">على الرغم من أن الضبط الافتراضي لخادوم MySQL الموفر من حزم أوبنتو يعمل عملًا صحيحًا دون مشاكل، لكن هنالك بعض الأمور التي عليك أخذها بعين الاعتبار قبل الإكمال.</p><p dir="rtl">صُمِّمَت قواعد بيانات MySQL للسماح بتخزين البيانات بطرقٍ مختلفة؛ يُشار لهذه الطرق إما بمحركات قواعد البيانات أو محركات التخزين (Storage engine)؛ هنالك محركان رئيسيان ستكون مهتمًا بهما: InnoDB و MyISAM؛ لا تتغير طريقة التعامل مع محركات التخزين المختلفة بالنسبة للمستخدم النهائي؛ حيث تتعامل MySQL مع الأمور بطريقة مختلفة وراء الستار، أي أنه بغض النظر عن محرك التخزين الذي تستخدمه، فإنك ستتعامل مع قواعد البيانات بنفس الطريقة تمامًا.</p><p dir="rtl">لكل محرك إيجابياته وسلبياته؛ وبينما من الممكن دمج عدِّة محركات قواعد بيانات على مستوى الجدول، لكن ذلك خطيرٌ، فربما يقلل ذلك من الفعالية والأداء لأنك تُقسِّم الموارد بين محركين بدلًا من تخصيصها لمحرك واحد فقط.</p><ul dir="rtl"><li><strong>المحرك MyISAM</strong> هو الأقدم بين المحركين المذكورين؛ يمكن أن يكون أسرع من InnoDB في حالات معيّنة ويفضل الأعمال التي تتطلب القراءة فقط؛ تتمحور بعض تطبيقات الويب حول MyISAM (على الرغم أنها لن تُبطَئ إذا استخدمت InnoDB)؛ يدعم MyISAM أيضًا نوع البيانات FULLTEXT؛ الذي يسمح بالبحث بسرعة كبيرة في كمياتٍ كبيرةٍ من النص؛ لكن MyISAM قادر على قفل الجدول بأكمله فقط عند الكتابة، هذا يعني أن عمليةً واحدةً فقط تستطيع تحديث الجدول في لحظة زمنية معينّة؛ قد يكون هذا إعاقةً لتوسع تطبيق يعتمد على هذا الجدول؛ ولا يحتوي MyISAM على ميزة «journaling»، وهذا يعني أنه من الصعب استرجاع البيانات بعد حدوث انهيار.</li><li><strong>المحرك InnoDB </strong>هو محرك قواعد بيانات أكثر حداثةً، صُمِّم ليكون متوافقًا مع <a rel="external nofollow" href="http://en.wikipedia.org/wiki/ACID">ACID</a> الذي يضمن إجراء العمليات على قواعد البيانات بطريقة عملية؛ قفل الكتابة يحدث على مستوى السجل (row) ضمن الجدول؛ هذا يعني أنه من الممكن إجراء عدِّة تحديثات لسجلات جدولٍ ما في نفس الوقت؛ التخزين الموقت للبيانات يحدث في الذاكرة ضمن محرك قواعد البيانات، مما يسمح بالتخزين على أساس السجل وليس على أساس كتلة الملف (file block)؛ ولكي يتوافق مع ACID، فإن كل العمليات تحدث بطريقة «journaled» مستقلةً عن الجداول الرئيسية؛ وهذا يؤدي إلى استرجاع البيانات استرجاعًا عمليًا.</li></ul><p dir="rtl">إن InnoDB هو المحرك الافتراضي في MySQL 5.5 ومن المستحسن بشدة استخدامه بدلًا من MyISAM ما لم تكن تريد استخدام مزايا خاصة بذاك المحرك.</p><h3 dir="rtl">الضبط المتقدم: إنشاء ملف ضبط my.cnf</h3><p dir="rtl">هنالك عدد من المعاملات التي يمكن تعديلها في ملف ضبط MySQL مما يسمح لك بتحسين أداء الخادوم مع مرور الوقت؛ ربما تجد الأداة «<a rel="external nofollow" href="http://tools.percona.com/members/wizard">Percona's my.cnf generating tool</a>» مفيدةً للإعداد الابتدائي؛ ستولد هذه الأداة ملف my.cnf ليكون أكثر ملائمةً لإمكانيات ومتطلبات خادومك.</p><p dir="rtl">لا تستبدل ملف<span style="font-family:courier new,courier,monospace;"> my.cnf</span> المولد من Percona إذا وضعت بيانات في قاعدة بيانات، بعض التغييرات في الملف لن تسبب مشاكل لأنها تُعدِّل طريقة تخزين البيانات على القرص الصلب ولن تتمكن من تشغيل MySQL؛ إذا أردت استخدامه وكانت لديك بيانات موجودة مسبقًا، فعليك أن تجري <span style="font-family:courier new,courier,monospace;">mysqldump</span> ثم تعيد التحميل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mysqldump --all-databases --all-routines -u root -p &gt; ~/fulldump.sql</pre><p dir="rtl">ستُسأل عن كلمة مرور المستخدم الجذر لقواعد MySQL قبل إنشاء نسخة من البيانات؛ من المستحسن أن تتأكد أنه لا يوجد مستخدمين أو عمليات تستخدم قاعدة البيانات قبل إجراء هذه الخطوة؛ ربما تأخذ عملية النسخ بعض الوقت بناءً على مقدار البيانات الموجودة في قاعدة البيانات لديك؛ لن ترى شيئًا على الشاشة أثناء تنفيذ الأمر السابق.</p><p dir="rtl">أغلق خادوم MySQL بعد إكمال عملية التفريغ (dump):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service mysql stop</pre><p dir="rtl">خذ الآن نسخةً احتياطيةً من <span style="font-family:courier new,courier,monospace;">my.cnf </span>واستبدله بالملف الجديد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo cp /etc/my.cnf /etc/my.cnf.backup
sudo cp /path/to/new/my.cnf /etc/my.cnf</pre><p dir="rtl">الآن احذف وأعد تهيئة مجال قواعد البيانات وتأكد أن الملكية صحيحة قبل إعادة تشغيلMySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo rm -rf /var/lib/mysql/*
sudo mysql_install_db
sudo chown -R mysql: /var/lib/mysql
sudo service start mysql</pre><p dir="rtl">كل ما تبقى الآن هو إعادة استيراد بياناتك؛ وللحصول على فكرة عن مدى إتمام عملية الاستيراد، فربما تجد الأداة <span style="font-family:courier new,courier,monospace;">pv</span>‏ (Pipe Viewer) مفيدةً؛ الأمر الآتي يظهر كيفية تثبيت واستخدام<span style="font-family:courier new,courier,monospace;"> pv</span> لهذه الحالة، ربما لا تريد أن تستخدمها وكل ما عليك فعله هو استبدال <span style="font-family:courier new,courier,monospace;">pv</span> بالأمر <span style="font-family:courier new,courier,monospace;">cat</span>؛ تجاهل أية أوقات متوقعة للانتهاء (ETA) مولدة من <span style="font-family:courier new,courier,monospace;">pv</span>؛ لأنها مبنية على الوقت المستغرق لكي يُعالَج كل سجل من الملف، لكن سرعة إدراج البيانات قد تختلف اختلافًا كبيرًا من سجل إلى سجل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install pv
pv ~/fulldump.sql | mysql</pre><p dir="rtl"><strong>ملاحظة</strong>: هذا ليس ضروريًا لكل تعديلات <span style="font-family:courier new,courier,monospace;">my.cnf</span>؛ أغلبية المتغيرات التي قد ترغب في تعديلها لتحسين الأداء يمكن أن تُغيَّر حتى وإن كان يعمل الخادوم؛ تأكد من الحصول على نسخة احتياطية من ملفات الضبط والبيانات قبل إجراء التعديلات.</p><h3 dir="rtl">MySQL Tuner</h3><p dir="rtl">الأداة «MySQL Tuner» هي أداة مفيدة تستطيع الاتصال إلى خدمة MySQL التي تعمل وتوفر اقتراحات عن كيفية ضبطها بأفضل ضبط لحالتك؛ وكما كان يعمل الخادوم لوقتٍ أطول، كلما كانت «النصيحة» التي سيوفرها <span style="font-family:courier new,courier,monospace;">mysqltuner</span> أفضل؛ خذ بعين الاعتبار الانتظار لمدة 24 ساعة في بيئة إنتاجية قبل تشغيل هذه الأداة؛ تستطيع تثبيت <span style="font-family:courier new,courier,monospace;">mysqltuner</span> من مستودعات أوبنتو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install mysqltuner</pre><p dir="rtl">ثم تشغيلها بعد تثبيتها بالأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mysqltuner</pre><p dir="rtl">وانتظر التقرير النهائي، سيوفر القسم العلوي معلوماتٍ عن خادوم قاعدة البيانات، ويوفر القسم السفلي اقتراحاتٍ لكي تعدلها في ملف <span style="font-family:courier new,courier,monospace;">my.cnf</span>؛ يمكن تعديل أغلبية الاقتراحات على الخادوم مباشرةً دون إعادة تشغيله، انظر إلى توثيق MySQL الرسمي للمتغيرات المناسبة لتعديلها في البيئات الإنتاجية؛ ما يلي هو جزء من تقرير من قاعدة بيانات إنتاجية الذي يُظهِر أن هنالك بعض الفائدة من زيادة مقدار ذاكرة تخزين الطلبية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    key_buffer_size (&gt; 1.4G)
    query_cache_size (&gt; 32M)
    table_cache (&gt; 64)
    innodb_buffer_pool_size (&gt;= 22G)</pre><p dir="rtl">تعليق أخير عن ضبط قواعد البيانات: بينما نستطيع أن نقول أن بعض الإعدادات هي الأفضل، لكن قد يختلف الأداء من تطبيق لآخر؛ على سبيل المثال، ما يعمل عملًا ممتازًا لووردبريس (Wordpress) قد لا يكون الأفضل لدروبال (Drupal) أو جوملا (Joomla) أو التطبيقات التجارية؛ الأداء متعلقٌ بأنواع الطلبيات واستخدام الفهارس، وإذا ما كان تصميم قاعدة البيانات جيدًا، وهكذا... ربما من الجيد إنفاق بعض الوقت في البحث عن إعدادات ملائمة لقواعد البيانات بناءً على التطبيقات التي تستخدمها؛ لكن بعد أن تتجاوز التعديلات حدًا معيّنًا، فإن أيّة تغييرات تجريها لا تتسبب إلا بتحسين بسيط جدًا في أداء التطبيق، ومن الأفضل لك تحسين التطبيق نفسه، أو التفكير في توسيع خادوم MySQL إما باستخدام عتاد أفضل أو بإضافة خواديم تابعة (slave).</p><h3 dir="rtl">مصادر</h3><ul dir="rtl"><li>راجع <a rel="external nofollow" href="http://www.mysql.com/">الموقع</a><a rel="external nofollow" href="http://www.mysql.com/"> الرئيسي</a> لقواعد MySQL لمزيدٍ من المعلومات.</li><li>التوثيق الكامل متوفر بصيغ online و offline من «<a rel="external nofollow" href="http://dev.mysql.com/doc/">MySQL Developers portal</a>».</li><li>لمعلومات عامة حول SQL، انظر إلى كتاب «<a rel="external nofollow" href="http://www.informit.com/store/product.aspx?isbn=0768664128">Using SQL Special Edition</a>».</li><li>صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/ApacheMySQLPHP">Apache MySQL PHP</a>» فيها بعض المعلومات المفيدة.</li></ul><h2 dir="rtl">PostgreSQL</h2><p dir="rtl">PostgreSQL هي قاعدة بيانات علائقية تعتمد على الكائنات وتملك ميزات أنظمة قواعد البيانات التجارية التقليدية مع تحسينات موجودة في الجيل الجديد من أنظمة DBMS.</p><h3 dir="rtl">التثبيت</h3><p dir="rtl">أدخل الأمر الآتي في الطرفية لتثبيت PostgreSQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install postgresql</pre><p dir="rtl">بعد انتهاء التثبيت، عليك ضبط خادوم PostgreSQL بناءً على متطلباتك، على الرغم من أن الضبط الافتراضي قابل للاستخدام.</p><h3 dir="rtl">الضبط</h3><p dir="rtl">الاتصال عبر TCP/IP معطَّل افتراضيًا؛ تدعم PostgreSQL عدّة طرق للاستيثاق من العميل؛ طريقة الاستيثاق IDENT تُستعمَل للمستخدمين المحليين ولمستخدم postgres ما لم يُضبَط غير ذلك؛ رجاءً راجع «<a rel="external nofollow" href="http://www.postgresql.org/docs/8.4/static/admin.html">PostgreSQL</a><a rel="external nofollow" href="http://www.postgresql.org/docs/8.4/static/admin.html"> </a><a rel="external nofollow" href="http://www.postgresql.org/docs/8.4/static/admin.html">Administrator's Guide</a>» إذا أردت ضبط بدائل مثل Kerberos.</p><p dir="rtl">سنفترض في ما يلي أنك ستُفعِّل اتصالات TCP/IP وتستخدم طريقة MD5 للاستيثاق من العميل؛ تُخزَّن ملفات ضبط PostgreSQL في المجلد ‎<span style="font-family:courier new,courier,monospace;">/etc/postgresql/&lt;version&gt;/main</span>؛ على سبيل المثال، إذا ثبتت خادوم PostgreSQL 9.1، فإن ملفات الضبط ستُخزَّن في المجلد ‎<span style="font-family:courier new,courier,monospace;">/etc/postgresql/9.1/main</span>.</p><p dir="rtl"><strong>تنويه</strong>: لضبط الاستيثاق بطريقة ident، فأضف مدخلات إلى ‎<span style="font-family:courier new,courier,monospace;">/etc/postgresql/9.1/‎ main/pg_ident.conf</span>؛ هنالك تعليقات تفصيلية في الملف لتساعدك.</p><p dir="rtl">لتفعيل اتصالات TCP/IP، عليك تعديل الملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/postgresql/9.1/main/postgresql.conf</span> ومن ثم تحديد السطر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> ‎‎#listen_addresses = 'localhost‎‎'‎ </pre><p dir="rtl">ثم تغييره إلى:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">listen_addresses = '*'</pre><p dir="rtl"><strong>ملاحظة</strong>: للسماح باتصالات IPv4 و IPv6، استبدل «localhost» بالرمز «::».</p><p dir="rtl">ربما تريد تعديل بقية المعاملات، إذا كنت تعرف ماذا تفعل! للتفاصيل، ارجع إلى ملف الضبط أو إلى توثيق PostgreSQL.</p><p dir="rtl">الآن وبعد أن استطعنا الاتصال بخادوم PostgreSQL فإن الخطوة الآتية هي ضبط كلمة مرور للمستخدم postgres؛ نفذ الأمر الآتي في الطرفية للاتصال بقاعدة بيانات PostgreSQL الافتراضية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo -u postgres psql template1</pre><p dir="rtl">يتصل الأمر السابق بقاعدة بيانات PostgreSQL المسماة template1 كالمستخدم postgres؛ بعد أن تتصل إلى خادوم PostgreSQL وتحصل على مِحَث لإدخال تعليمات SQL، فيمكنك إدخال أمر SQL الآتي في مِحَث psql لضبط كلمة المرور للمستخدم postgres:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ALTER USER postgres with encrypted password 'your_password';</pre><p dir="rtl">بعد ضبط كلمة المرور، عدِّل الملف <span style="font-family:courier new,courier,monospace;">‎/etc/postgresql/9.1/main/pg_hba.conf </span>لاستخدام استيثاق MD5 مع المستخدم postgres:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">local all postgres md5</pre><p dir="rtl">في النهاية، يجب أن تُعيد تشغيل خدمة PostgreSQL لتهيئة الضبط الجديد، وذلك بإدخال الأمر الآتي من الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service postgresql restart</pre><p dir="rtl"><strong>تحذير</strong>: الضبط السابق ليس كاملًا بأي شكل من الأشكال، رجاءً راجع «<a rel="external nofollow" href="http://www.postgresql.org/docs/9.1/static/admin.html">PostgreSQL Administrator's Guide</a>» لمعاملات ضبط إضافية.</p><p dir="rtl">يمكنك اختبار اتصالات الخادوم من الأجهزة الأخرى باستخدام عملاء PostgreSQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install postgresql-client
psql -h postgres.example.com -U postgres -W</pre><p dir="rtl"><strong>ملاحظة</strong>: استبدل اسم النطاق في المثال السابق باسم نطاقك الفعلي.</p><h3 dir="rtl">مصادر</h3><ul dir="rtl"><li>كما ذُكِر سابقًا، فإن «<a style="line-height: 22.4px;" rel="external nofollow" href="http://www.postgresql.org/docs/9.1/static/admin.html">PostgreSQL Administrator's Guide</a>» هو مصدر رائع، وهو متوفر أيضًا في حزمة <span style="font-family:courier new,courier,monospace;">postgresql-doc-9.1</span>؛ نفذ ما يلي لتثبيت تلك الحزمة:</li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install postgresql-doc-9.1</pre><ul dir="rtl"><li>أدخِل الوصلة<span style="font-family:courier new,courier,monospace;"> file:///usr/share/doc/postgresql-doc-9.1/html/index.html </span>في شريط العنوان في متصفحك لمشاهدة الدليل.</li><li>راجع أيضًا صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/PostgreSQL">PostgreSQL</a>» لمزيدٍ من المعلومات.</li></ul><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/databases.html">Ubuntu Server Guide: Databases</a>.</p>
]]></description><guid isPermaLink="false">194</guid><pubDate>Tue, 26 Jan 2016 13:04:01 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; MemSQL &#x639;&#x644;&#x649; Ubuntu</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-memsql-%D8%B9%D9%84%D9%89-ubuntu-r140/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/memsql-ubuntu-benchmark.png.d95281665759538a1c4de1a27a3d97e1.png" /></p>

<div id="wmd-preview-section-10"><p id="كيفية-تثبيت-memsql-على-ubuntu"><strong>MemSQL</strong> عبارة عن قاعدة بيانات تعمل مُباشرة من الذاكرة in-memory تستطيع أن تُخدِّم القراءة والكتابة بشكل أسرع من قواعد البيانات التقليديّة، وبالرغم من أنّها تقنية حديثة إلّا أنّها تتعامل بميفاق protocol قاعدة بيانات MySQL لذلك يكون التعامل معها مألوفًا.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/memsql-ubuntu-benchmark.png.2fce4b9d57b6cf22def3abfccdcc9067.png"><img data-fileid="7232" class="ipsImage ipsImage_thumbnailed" alt="memsql-ubuntu-benchmark.thumb.png.b3678c" src="https://academy.hsoub.com/uploads/monthly_2015_11/memsql-ubuntu-benchmark.thumb.png.b3678c7d27b134a2fe7eeebc5c4c3ba7.png"></a></p><p>تضم MemSQL أحدث قدرات MySQL مع ميّزات حديثة مثل دعم JSON والقدرة على عمل upsert للبيانات (تعني كلمة upsert إدراج صف جديد إن لم يكن موجودًا أي insert، أو تحديث هذا الصف إن كان موجودًا أي update). إنّ أحد أهم نقاط تفوّق MemSQL على MySQL هي قدرتها على فصل الاستعلام query عبر عدّة عقد nodes، والمعروفة أيضًا باسم المعالجة المتوازية على نطاق واسع massively parallel processing، ممّا يؤدي إلى سرعة أكبر في قراءة الاستعلامات.</p><p>سنقوم في هذا الدّرس بتثبيت MemSQL على خادوم Ubuntu، تنفيذ تجارب قياس الأداء benchmarks، والتعامل مع إدراج بيانات JSON عبر عميل سطر الأوامر في MySQL.</p></div><div id="wmd-preview-section-12"><h2 id="المتطلبات-الأساسية">المتطلبات الأساسية</h2><p>سنحتاج لمتابعة هذا الدّرس إلى:</p><ul><li>Ubuntu 14.04 x64 Droplet مع ذاكرة RAM 8 غيغابايت على الأقل (أو خادوم محلّي بنفس المواصفات)</li><li>مستخدم غير جذري non-root مع صلاحيّات sudo، والذي يُمكِن إعداده عن طريق درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الأولي للخادوم مع Ubuntu</a>.</li></ul></div><div id="wmd-preview-section-13"><h2 id="الخطوة-الأولى-تثبيت-memsql">الخطوة الأولى – تثبيت MemSQL</h2><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">سنقوم في هذا القسم بتحضير بيئة العمل من أجل تثبيت MemSQL.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">يتم عرض آخر إصدار من MemSQL على <a style="box-sizing: border-box; outline: none !important; color: rgb(79, 161, 219); text-decoration: none; transition: background-color 0.15s ease-in-out, color 0.15s ease-in-out, border-color 0.15s ease-in-out; background: transparent;" rel="external nofollow" href="http://www.memsql.com/download/">صفحة تحميله</a>، سنقوم بتحميل وتثبيت MemSQL Ops، والذي هو برنامج يدير تحميل وتحضير خادومنا لتشغيل MemSQL بشكل صحيح، الإصدار الأحدث من MemSQL Ops لدى كتابة هذا الدّرس هو 4.0.35.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">نقوم في البداية بتنزيل ملف حزمة تثبيت MemSQL من موقعها على الإنترنت:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; padding: 0px; color: inherit; border-radius: 0px; outline: none !important; background-color: transparent !important;"> </code></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">wget http://download.memsql.com/memsql-ops-4.0.35/memsql-ops-4.0.35.tar.gz</pre><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">نستخرج extract بعدها الحزمة:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; padding: 0px; color: inherit; border-radius: 0px; outline: none !important; background-color: transparent !important;"> </code></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">tar -xzf memsql-ops-4.0.35.tar.gz</pre><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">أنشأ استخراج الحزمة مجلّدًا يُدعى <span style="font-family:courier new,courier,monospace;"><code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 0.9em; padding: 2px 4px; border-radius: 4px; outline: none !important; background-color: rgba(128, 128, 128, 0.0745098);">memsql-ops-4.0.35</code></span>، نلاحظ أنّ اسم المجلّد يحتوي على رقم الإصدار، لذلك إن قمت بتنزيل إصدار أحدث من الإصدار المحدّد في هذا الدّرس فستملك مجلّدًا مع رقم الإصدار الذي نزّلته.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">نغير الدليل إلى هذا المجلّد:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; padding: 0px; color: inherit; border-radius: 0px; outline: none !important; background-color: transparent !important;"> </code></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd memsql-ops-4.0.35</pre><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">ثم نقوم بتنفيذ script التثبيت والذي هو جزء من حزمة التثبيت التي استخرجناها للتو:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; padding: 0px; color: inherit; border-radius: 0px; outline: none !important; background-color: transparent !important;"> </code></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo ./install.sh</pre><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">سنرى بعض الخَرْج output من الـ script، وسيسألنا بعد لحظات إذا ما كنّا نرغب بتثبيت MemSQL على هذا المُضيف host فقط، سنتعلّم تثبيت MemSQL على عدّة أجهزة في درس لاحق، لذا من أجل غرض هذا الدّرس فلنقل نعم yes عن طريق إدخال الحرف y:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; padding: 0px; color: inherit; border-radius: 0px; outline: none !important; background-color: transparent !important;"> </code></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Installation script prompt and output
. . .
Do you want to install MemSQL on this host only? [y/N] y

2015-09-04 14:30:38: Jd0af3b [INFO] Deploying MemSQL to 45.55.146.81:3306
2015-09-04 14:30:38: J4e047f [INFO] Deploying MemSQL to 45.55.146.81:3307
2015-09-04 14:30:48: J4e047f [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:48: J4e047f [INFO] Installing MemSQL
2015-09-04 14:30:49: Jd0af3b [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:49: Jd0af3b [INFO] Installing MemSQL
2015-09-04 14:31:01: J4e047f [INFO] Finishing MemSQL Install
2015-09-04 14:31:03: Jd0af3b [INFO] Finishing MemSQL Install
Waiting for MemSQL to start...</pre><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">نمتلك الآن مجموعة MemSQL مُثبَّتة على خادوم أوبونتو لدينا، ولكن نلاحظ من السجلّات السّابقة أنّه تم تثبيت MemSQL مرتين.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">تستطيع MemSQL أن تعمل بدورين مختلفين: عقدة مُجمِّع aggregator node وعقدة ورقة leaf node، إنّ سبب تثبيت MemSQL مرتين هو أنّها تحتاج على الأقل إلى عقدة مُجمِّع واحدة وعقدة ورقة واحدة لكي يعمل العنقود cluster.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">إنّ عقدة المُجمِّع aggregator node هي واجهتنا إلى MemSQL، وهي تبدو بالنسبة للعالم الخارجي مشابهة كثيرًا لـ MySQL، فهي تستمع إلى نفس المنفذ port، وبإمكاننا أن نربط إليها أدوات تتوقّع أن تتعامل مع MySQL ومكتبات MySQL المعياريّة، وظيفة المُجمِّع هي أن يعرف عن كافّة عُقَد الورقة leaf nodes لـ MemSQL، يتعامل مع عُملاء MySQL، ويترجم استعلاماتهم إلى MemSQL.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">تُخزِّن عقدة الورقة leaf node البيانات فعليًّا، فعندما تستقبل عقدة الورقة طلبًا من عقدة المُجمِّع لقراءة أو كتابة البيانات تقوم بتنفيذ هذا الاستعلام وتُعيد النتائج إلى عقدة المُجمِّع، تسمح MemSQL لنا بمشاركة بياناتنا عبر عدّة مضيفين، وتمتلك كل عقدة ورقة قسمًا من تلك البيانات (حتى مع وجود عقدة ورقة واحدة تكون البيانات تكون البيانات مُقسَّمة ضمن تلك العقدة).</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">عندما نملك عدة عقد ورقة يكون المُجمِّع مسؤولًا عن ترجمة استعلامات MySQL لجميع عقد الورقة التي ينبغي أن تشارك في هذا الاستعلام، ومن ثمّ يتلقى الردود من جميع عقد الورقة ويُجمِّع النتيجة في استعلام واحد يعود إلى عميل MySQL لدينا، وهكذا تتم إدارة الاستعلامات المتوازية.</p><p style="box-sizing: border-box; outline: none !important; margin: 0px 0px 1.1em;">يمتلك إعداد المضيف الوحيد لدينا عقدة مُجمِّع وورقة تعملان على نفس الجهاز، ولكن نستطيع إضافة المزيد من عقد الورقة عبر العديد من الأجهزة الأخرى.</p></div><div id="wmd-preview-section-14"><h2 id="الخطوة-الثانية-تنفيذ-تجربة-قياس-أداء">الخطوة الثانية – تنفيذ تجربة قياس أداء</h2><p>فلنرى مدى السّرعة التي تستطيع أن تعمل بها MemSQL باستخدام الأداة MemSQL Ops والتي تم تثبيتها كجزء من script تثبيت MemSQL.</p><p>نذهب إلى <a rel="external nofollow" href="http://your">http://you_server_ip:9000</a> في متصفحنا:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/img1.png.86762a03808af35ce4a2ea61c617b08a.png"><img data-fileid="7229" class="ipsImage ipsImage_thumbnailed" alt="img1.thumb.png.e54adb79b1e34047530a71b15" src="https://academy.hsoub.com/uploads/monthly_2015_11/img1.thumb.png.e54adb79b1e34047530a71b152f8db04.png"></a></p><p>تعطينا الأداة MemSQL Ops لمحة عامّة عن العنقود cluster لدينا، نمتلك عقدتي MemSQL: المُجمِّع الرئيسي وعقدة الورقة.</p><p>فلنقم بإجراء اختبار السّرعة Speed Test على عقدة MemSQL في جهازنا المفرد، نضغط على Speed Test من القائمة الموجودة على اليسار، وبعدها نضغط على <strong>START TEST</strong>، وهذا مثال عن النتائج التي قد نراها:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/img2.png.ecf9d8ac40e5fbe37b7448ca00a7c080.png"><img data-fileid="7230" class="ipsImage ipsImage_thumbnailed" alt="img2.thumb.png.4d0b3a08a9f195067e1ea3ec7" src="https://academy.hsoub.com/uploads/monthly_2015_11/img2.thumb.png.4d0b3a08a9f195067e1ea3ec73bea7a6.png"></a></p><p>لن نشرح في هذا الدّرس كيفيّة تثبيت MemSQL على خواديم متعددة، ولكن من أجل المقارنة أدرجنا هنا قياس أداء من عنقود MemSQL على نظام Ubuntu يملك 8 جيجابايت من الذّاكرة Ram وعدّة عقد (عقدة مُجمِّع وعقدتا leaf):</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/img3.png.dd0d77be6d02fee635e108c7e58f012a.png"><img data-fileid="7231" class="ipsImage ipsImage_thumbnailed" alt="img3.thumb.png.6a19ef371c963b98a2ca0dee4" src="https://academy.hsoub.com/uploads/monthly_2015_11/img3.thumb.png.6a19ef371c963b98a2ca0dee44867a4c.png"></a></p><p>نكون قادرين بزيادة عدد عقد leaf أن نُضاعِف مُعدَّل الإدراج insert، وبالنظر إلى أقسام قراءة الصفوف Rows Read نستطيع أن نرى أنّ عنقود العقد الثلاثة لدينا قادر على قراءة الصفوف بشكل متزامن أكثر بمقدار 12 مليون صف من عنقود العقدة الواحدة وفي نفس المدة الزمنية.</p></div><div id="wmd-preview-section-15"><h2 id="الخطوة-الثالثة-التعامل-مع-memsql-من-خلال-mysql-client">الخطوة الثالثة – التعامل مع MemSQL من خلال mysql-client</h2><p>تبدو MemSQL بالنسبة للعملاء مثل MySQL، فكلاهما تتعامل بنفس الميفاق protocol، ولبدء التخاطب مع عنقود MemSQL لدينا نقوم بتثبيت <span style="font-family:courier new,courier,monospace;">mysql-client</span>.</p><p>في البداية نقوم بتحديث <span style="font-family:courier new,courier,monospace;">apt</span> لكي نُثبِّت الإصدار الأخير من العميل client في الخطوة التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update</pre><p>نُثبِّت الآن عميل MySQL والذي سيُمكّننا من تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">mysql</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install mysql-client-core-5.6</pre><p>نحن الآن على استعداد للاتصال بـ MemSQL باستخدام عميل MySQL، سنتصل باستخدام المستخدم الجذري root إلى المضيف<span style="font-family:courier new,courier,monospace;"> 127.0.0.1</span> (والذي هو عنوان IP للمضيف المحلّي localhost لدينا) على المنفذ 3306، سنقوم بتخصيص رسالة المُحث prompt لتكون <span style="font-family:courier new,courier,monospace;">&lt;memsql</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">mysql -u root -h 127.0.0.1 -P 3306 --prompt="memsql&gt; "</pre><p>سنشاهد بعض أسطر الخَرْج متبوعة بالمُحث <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">&lt;memsql</span>.</p><p>فلنقم بسرد list قواعد البيانات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; show databases;</pre> <p>سنشاهد هذا الخَرْج:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+--------------------+ 
| Database           | 
+--------------------+ 
| information_schema | 
| memsql             | 
| sharding           | 
+--------------------+ 
3 rows in set (0.01 sec)</pre><p>نُنشِئ قاعدة بيانات جديدة تُدعى <strong>tutorial</strong>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; create database tutorial;</pre><p>ثم نتحوّل لاستخدام قاعدة البيانات الجديدة باستخدام الأمر <span style="font-family:courier new,courier,monospace;">use</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; use tutorial;</pre><p>نقوم بعدها بإنشاء جدول <strong>users</strong> والذي يملك الحقلين <span style="font-family:courier new,courier,monospace;">id </span>و <span style="font-family:courier new,courier,monospace;">email</span>، يجب علينا تحديد نوع لكلا هذين الحقلين، فلنجعل <span style="font-family:courier new,courier,monospace;">id </span>من نوع <span style="font-family:courier new,courier,monospace;">bigint</span> و <span style="font-family:courier new,courier,monospace;">email</span> من نوع <span style="font-family:courier new,courier,monospace;">varchar</span> بطول 255، سنخبر أيضًا قاعدة البيانات أنّ الحقل <span style="font-family:courier new,courier,monospace;">id</span> هو مفتاح أساسي primary key والحقل <span style="font-family:courier new,courier,monospace;">email</span> لا يُمكن أن يكون عَدم Null.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; create table users (id bigint auto_increment primary key, email varchar(255) not null);</pre><p>ربّما تلاحظ زمن تنفيذ بطيء للأمر الأخير (15-20 ثانية)، هناك سبب رئيسي يجعل من MemSQL بطيئة في إنشاء هذا الجدول الجديد وهو: توليد الشيفرة code generation.</p><p>تستخدم MemSQL توليد الشيفرة لتنفيذ الاستعلامات، وهذا يعني أنّه في كل مرة تتم فيها مصادفة نوع جديد من الاستعلامات تحتاج MemSQL توليد وتصريف compile الشيفرة التي تُمثِّل الاستعلام، يتم بعدها نقل الشيفرة إلى العنقود لتنفيذها، وهذا يُسرِّع عمليّة معالجة البيانات الفعليّة ولكن هناك تكلفة من أجل التحضير، تبذل MemSQL جهدها لإعادة استخدام الاستعلامات المُولَّدة مُسبقًا pre-generated queries، ولكن تبقى الاستعلامات الجديدة ذات البُنية التي لم تشاهدها MemSQL من قبل بطيئة.</p><p>وبالعودة إلى جدول <strong>users</strong> نقوم بإلقاء نظرة على تعريفه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; describe users;</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+-------+--------------+------+------+---------+----------------+ 
| Field | Type         | Null | Key  | Default | Extra          | 
+-------+--------------+------+------+---------+----------------+ 
| id    | bigint(20)   | NO   | PRI  | NULL    | auto_increment | 
| email | varchar(255) | NO   |      | NULL    |                | 
+-------+--------------+------+------+---------+----------------+ 
2 rows in set (0.00 sec)</pre><p>فلنقم الآن بإدراج بعض أمثلة عناوين البريد الإلكتروني في الجدول <strong>users</strong>، وهي نفس الصياغة syntax التي نستخدمها لقاعدة بيانات MySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; insert into users (email) values ('one@example.com'), ('two@example.com'), ('three@example.com');</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Inserting emails output Query OK, 3 rows affected (1.57 sec) Records: 3 Duplicates: 0 Warnings: 0</pre><p>نستعلم الآن عن الجدول <strong>users</strong>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from users;</pre><p>بإمكاننا رؤية البيانات التي أدخلناها للتو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-------------------+ 
| id | email             | 
+----+-------------------+ 
| 2  | two@example.com   | 
| 1  | one@example.com   | 
| 3  | three@example.com | 
+----+-------------------+ 
3 rows in set (0.07 sec)
</pre></div><div id="wmd-preview-section-16"><h2 id="الخطوة-الرابعة-إدراج-واستعلام-json">الخطوة الرابعة – إدراج واستعلام JSON</h2><p>توفِّر MemSQL نوع JSON، لذا سنقوم في هذه الخطوة بإنشاء جدول أحداث events لاستخدام الأحداث الواردة، يمتلك هذا الجدول حقل id (كما فعلنا مع جدول <strong>users</strong>) وحقل <span style="font-family:courier new,courier,monospace;">event</span> والذي سيكون من النوع JSON:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; create table events (id bigint auto_increment primary key, event json not null);</pre><p>فلنقم بإدراج حدثين، سنقوم في JSON بإرجاع حقل <span style="font-family:courier new,courier,monospace;">email</span> والذي بدوره يقوم بإعادة الإرجاع إلى مُعرِّفات IDs المستخدمين الذين أدخلناهم في الخطوة الثالثة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; insert into events (event) values ('{"name": "sent email", "email": "one@example.com"}'), ('{"name": "received email", "email": "two@example.com"}');</pre><p>نقوم الآن بإلقاء نظرة على الأحداث events التي أدرجناها للتو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from events;</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-----------------------------------------------------+ 
| id | event                                               | 
+----+-----------------------------------------------------+ 
| 2  | {"email":"two@example.com","name":"received email"} | 
| 1  | {"email":"one@example.com","name":"sent email"}     | 
+----+-----------------------------------------------------+ 
2 rows in set (3.46 sec)</pre><p>نستطيع بعدها الاستعلام عن كل الأحداث events التي تكون خاصّية JSON لها التي تُدعى <span style="font-family:courier new,courier,monospace;">name</span> هي النّص “received email”:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from events where event::$name = 'received email';</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-----------------------------------------------------+ 
| id | event                                               | 
+----+-----------------------------------------------------+  
| 2  | {"email":"two@example.com","name":"received email"} | 
+----+-----------------------------------------------------+ 
1 row in set (5.84 sec)</pre><p>نحاول تغيير هذا الاستعلام لإيجاد تلك الأحداث التي خاصيّة <span style="font-family:courier new,courier,monospace;">name</span> لها هي النّص “sent email”:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from events where event::$name = 'sent email';</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-------------------------------------------------+ 
| id | event                                           | 
+----+-------------------------------------------------+ 
| 1  | {"email":"one@example.com","name":"sent email"} | 
+----+-------------------------------------------------+ 
1 row in set (0.00 sec)</pre><p>تم تنفيذ هذا الاستعلام الأخير بشكل أسرع من الاستعلام الذي سبقه لأنّنا غيّرنا فقط مُعامِل في الاستعلام، لذا كانت MemSQL قادرة على تخطّي توليد الشيفرة.</p><p>فلنقم بعمل شيء أكثر تقدّمًا بالنسبة لقاعدة بيانات SQL مُوزَّعة، وهو ضم جدولين على أساس مفاتيح غير أساسيّة non-primary حيث يتم تداخل قيمة ما من الانضمام join بداخل قيمة JSON ولكن يكون الترشيح filter على أساس قيمة JSON مختلفة.</p><p>نسأل في البداية عن كافّة حقول جدول المستخدمين <strong>users</strong> مع ضم جدول الأحداث <strong>events</strong> بمطابقة حقل البريد الإلكتروني <span style="font-family:courier new,courier,monospace;">email</span> حيث يكون اسم الحدث هو “received email”.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from users left join events on users.email = events.event::$email where events.event::$name = 'received email';</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-----------------+------+-----------------------------------------------------+ 
| id | email           | id   | event                                               | 
+----+-----------------+------+-----------------------------------------------------+ 
| 2  | two@example.com | 2    | {"email":"two@example.com","name":"received email"} | 
+----+-----------------+------+-----------------------------------------------------+ 
1 row in set (14.19 sec)</pre><p>نجرب بعد ذلك نفس الاستعلام ولكن مع ترشيح الأحداث “sent email” فقط:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">memsql&gt; select * from users left join events on users.email = events.event::$email where events.event::$name = 'sent email';
</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">+----+-----------------+------+-------------------------------------------------+ 
| id | email           | id   | event                                           | 
+----+-----------------+------+-------------------------------------------------+ 
| 1  | one@example.com | 1    | {"email":"one@example.com","name":"sent email"} | 
+----+-----------------+------+-------------------------------------------------+ 
1 row in set (0.01 sec)</pre><p>وكما وجدنا سابقًا فإنّ الاستعلام الثاني أسرع بكثير من الأول، تظهر فائدة توليد الشيفرة عند تنفيذ أكثر من مليون صف، كما رأينا في قياس الأداء، إنّ مرونة استخدام قواعد بيانات SQL تفهم JSON وكيفيّة الانضمام بين الجداول هي ميزة قوية للمستخدمين.</p></div><div id="wmd-preview-section-17"><h2 id="الخاتمة">الخاتمة</h2><p>لقد قمنا بتثبيت MemSQL، تنفيذ تجربة قياس أداء العقد لدينا، التعامل مع العقدة من خلال عميل MySQL المعياري، وتعاملنا مع بعض الميّزات المتقدمة غير الموجودة في MySQL، ينبغي أن يعطينا هذا فكرة واضحة عمّا يمكن أن تفعله قاعدة بيانات SQL داخل الذاكرة لنا.</p><p>لا يزال هناك الكثير لتعلّمه حول كيفيّة توزيع MemSQL لبياناتنا فعليًّا، كيفية بناء الجداول من أجل أفضل أداء، كيفيّة توسيع MemSQL عبر عدّة عقد، كيفيّة تكرار بياناتنا من أجل توافريّة عالية للبيانات، وكيفيّة تأمين MemSQL.</p><p>ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-memsql-on-ubuntu-14-04">How to Install MemSQL on Ubuntu 14.04</a> لصاحبه Ian Hansen.</p></div>
]]></description><guid isPermaLink="false">140</guid><pubDate>Thu, 12 Nov 2015 17:56:06 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x648;&#x645;&#x62A;&#x649; &#x646;&#x633;&#x62A;&#x62E;&#x62F;&#x645; SQLite</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%83%D9%8A%D9%81-%D9%88%D9%85%D8%AA%D9%89-%D9%86%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-sqlite-r111/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/sqlite-why-and-when.png.e7ba12bf359937726c5df583df248b37.png" /></p>

<p dir="rtl"><strong>Sqlite</strong> هي عبارة عن محرك SQL مفتوح المصدر سريع وبسيط جدا، يشرح هذا الدرس متى يكون من الأمثل استخدام <strong>Sqlite</strong> كبديل لأنظمة إدارة قواعد البيانات الارتباطية RDBMS مثل MySQL أو Postgres، بالإضافة إلى كيفية تثبيتها وأمثلة عن استخداماتها الأساسية، تُغطي عمليات CRUD: الإنشاء Create، القراءة Read، التحديث Update، والحذف Delete.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/sqlite-why-and-when.png.833085eae750691a542ec88e5c133b5e.png"><img data-fileid="5332" class="ipsImage ipsImage_thumbnailed" alt="sqlite-why-and-when.thumb.png.448db33df6" src="https://academy.hsoub.com/uploads/monthly_2015_09/sqlite-why-and-when.thumb.png.448db33df6b0038b409f659c6f4f1049.png"></a></p><h2 dir="rtl">مفاهيم خاطئة</h2><p dir="rtl">لا يجب أن ننخدع بالاعتقاد أن Sqlite تستَخدم فقط للاختبار والتطوير، فعلى سبيل المثال تعمل Sqlite بشكل جيد لمواقع الإنترنت التي تتلقى 100,000 زائر يوميا، وهذا هو الحد المُحافظ. إن الحد الأقصى لحجم قاعدة بيانات Sqlite هو 140 تيرابايت (والذي من المفترض أن يكون كافيًا، أليس كذلك؟)، وبإمكانها أن تكون أسرع بكثير من RDBMS، يتم تخزين قاعدة البيانات كاملةمع كافة البيانات الضرورية في ملف عادي في نظام ملفات المضيف Host، ولذلك لا توجد حاجة لعملية خادوم Server منفصلة (الاستغناء عن الحاجة إلى الاتصالات البطيئة بين العمليّات).</p><h2 dir="rtl">الاستخدام الأمثل على VPS الخاص بنا</h2><p dir="rtl">تركز Sqlite على البساطة، وبما أنها تعمل داخليا internal بشكلٍ تام، فهي غالبًا ما تكون أسرع بكثير من البدائل الأخرى، إن كنا نبحث عن قابلية النقل portability (فيما يتعلق باللغات والمنصّات معًا)، البساطة، السرعة، والاستهلاك القليل للذاكرة فإن Sqlite مثاليّة لهذا، فعيوبها تكون واضحة فقط عند الحاجة لتزامن عال بالقراءة أو الكتابة.</p><p dir="rtl">حيث تستطيع Sqlite أن تدعم كاتب writer واحد فقط في نفس الوقت، وقد يكون زمن الوصول latency لنظام الملفات المرتَفِع عادة غير مُلائِم إن كانت هناك حاجة لنفاذ access العديد من العملاء إلى قاعدة بيانات Sqlite في نفس الوقت. العيب الأخير المُحتَمل وجوده في Sqlite هو صياغتها syntax الفريدة، بالرغم من تشابهها مع أنظمة SQL الأخرى، ومن البديهي عند الانتقال إلى نظام آخر -إن قمنا باستخدام Sqlite والتي تتطوّر بسرعة- أن نجد بعض العقبات في المرحلة الانتقاليّة.</p><h2 dir="rtl">تثبيت Sqlite على VPS الخاص بنا</h2><p dir="rtl">إن وحدة sqlite3 module هي جزء من مكتبة بايثون المعيارية، لذلك لا نحتاج لأي تثبيت آخر على توزيعة Ubuntu المعيارية أو على أي نظام آخر مُثبّت عليه بايثون، ولتثبيت واجهة سطر الأوامر لـ Sqlite على Ubuntu نستخدم هذه الأوامر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update

sudo apt-get install sqlite3 libsqlite3-dev</pre><p dir="rtl">إن كُنّا نريد تصريفه Compile من المصدر Source يجب علينا الحصول على آخر إصدار من <span style="font-family:courier new,courier,monospace;">autoconf</span> من الرّابط <a rel="external nofollow" href="http://sqlite.org/download.html">sqlite.org/download.html</a>، وهو الإصدار المتوفّر وقت كتابة هذا الدّرس:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">wget http://sqlite.org/2013/sqlite-autoconf-3080100.tar.gz
tar xvfz sqlite-autoconf-3080100.tar.gz

cd sqlite-autoconf-3080100

./configure

make

make install</pre><p dir="rtl">ملاحظات من أجل البناء من المصدر:</p><ol dir="rtl"><li>لا يجب أن نقوم بفعل هذا على توزيعة Ubuntu معياريّة لأنّه من المُحتمل أن نتلقّى خطأ عن عدم التّوافق في إصدار التّرويسة Header والمصدر "<strong>header and source version mismatch</strong>" بسبب التّعارض بين الإصدار المُثبّت حاليًّا والإصدار الجّديد الذي نريد تثبيته.</li><li>إن كان يبدو أنّ الأمر <strong>make</strong> ينتظر المزيد من المُدخلات منك فكُن صبورًا فقط، حيث أنّ تصريف Compile المصدر قد يستغرق بعض الوقت.</li></ol><h2 dir="rtl">الاستخدامات الأساسية لواجهة سطر الأوامر</h2><p dir="rtl">لإنشاء قاعدة بيانات نقوم بتنفيذ الأمر التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sqlite3 database.db</pre><p dir="rtl">حيث يكون <span style="font-family:courier new,courier,monospace;">database</span> هو اسم قاعدة البيانات لدينا، وإن كان الملف<span style="font-family:courier new,courier,monospace;"> database.db</span> موجودًا مُسبقًا ستقوم Sqlite بإنشاء اتصال معه، وإن لم يكن موجودًا سيتمّ إنشاؤه، يجب أن يكون الخرج Output مُشابهًا لما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SQLite version 3.8.1 2013-10-17 12:57:35

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite&gt;</pre><p dir="rtl">فلنقم الآن بإنشاء جدول <strong>Table</strong> وإدخال بعض البيانات إليه، يملك هذا الجدول المُسمَّى الأندية <strong>clubs</strong> أربعة أعمدة columns، من أجل <strong>id</strong>، اسم النادي <strong>name</strong>، مدرّبه <strong>coach</strong>، وبلد النّادي <strong>country</strong>، سنقوم بإدخال بيانات ثلاثة أندية كرة قدم إلى قاعدة بياناتنا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CREATE TABLE clubs (id integer, name varchar(30), coach varchar(20), country varchar(20));

INSERT INTO clubs VALUES (1, "Real Madrid", "Benitez", "Spain");

INSERT INTO clubs VALUES (2, "Barcelona", "Enrique", "Spain");

INSERT INTO clubs VALUES (3, "Chelsea", "Mourinho", "England");</pre><p dir="rtl">لقد أنشأنا قاعدة بيانات، جدول، وبعض الإدخالات، نضغط الآن <span style="font-family:courier new,courier,monospace;">Ctrl+D</span> للخروج من Sqlite ونكتب ما يلي (يجب هنا أيضًا أن نضع اسم قاعدة بياناتنا بدلًا من 'database') والذي سيقوم بإعادة الاتصال إلى قاعدة البيانات التي أنشأناها للتو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sqlite3 database.db</pre><p dir="rtl">الآن نكتب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SELECT * FROM clubs;</pre><p dir="rtl">يجب أن نرى هنا الإدخالات التي قُمنا بها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1|Real Madrid|Benitez|Spain

2|Barcelona|Enrique|Spain

3|Chelsea|Mourinho|England</pre><p dir="rtl">رائع، هذا هو كلّ شيء فيما يتعلّق بالإنشاء <strong>Creating</strong> والقراءة <strong>Reading</strong>، فلنقم الآن بالتّحديث <strong>Update</strong> والحذف <strong>Delete</strong>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">UPDATE clubs SET country="Spain" WHERE country="England";</pre><p dir="rtl">سيقوم هذا الأمر بتحديث قاعدة البيانات بحيث يجعل الأندية المُدرَجة على أنّها من إنكلترا يتم إدراجها وكأنّها أندية من إسبانيا، فلنتأكّد من النتائج باستخدام الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SELECT * FROM clubs;</pre><p dir="rtl">يجب أن نرى:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1|Real Madrid|Benitez|Spain

2|Barcelona|Enrique|Spain

3|Chelsea|Mourinho|Spain</pre><p dir="rtl">أصبحت لدينا الآن كل الأندية من إسبانيا، فلنقم بحذف Chelsea من قاعدة بياناتنا كونه النادي الوحيد الذي في الحقيقة ليس من إسبانيا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">DELETE FROM clubs WHERE id=3;

SELECT * FROM clubs;</pre><p dir="rtl">ينبغي أن نجد الآن عدد الأندية لدينا أقل بواحد من السّابق:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">1|Real Madrid|Benitez|Spain

2|Barcelona|Enrique|Spain</pre><p dir="rtl">يُغطِّي هذا جميع العمليّات الأساسيّة لقواعد البيانات، وقبل أن ننتهي دعونا نجرّب مثالًا آخر أقل بديهيّة بقليل، والذي يستخدم جدولين وانضمام join أساسي بينهما.</p><p dir="rtl">فلنخرج الآن من Sqlite باستخدام الأمر <span style="font-family:courier new,courier,monospace;">Ctrl+D</span> ونعيد الاتصال إلى قاعدة بيانات جديدة باستخدام:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> sqlite3 database2.db</pre><p dir="rtl">سنقوم بإنشاء جدول مشابه جدًّا لجدول الأندية <strong>clubs</strong> ولكنّنا سننشئ أيضًا جدول للدول <strong>countries</strong>، والذي يقوم بتخزين اسم الدّولة ورئيسها الحالي، فلنقم أولًا بإنشاء جدول الدّول <strong>countries</strong> وإدخال إسبانيا وفرنسا إليه باستخدام ما يلي (لاحظ أنّنا نستطيع نسخ ولصق عدّة أسطر من شيفرة sqlite دفعة واحدة):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CREATE TABLE countries (id integer, name varchar(30), president varchar(30));

INSERT INTO countries VALUES (1, "Spain", "Rajoy Brey");

INSERT INTO countries VALUES(2, "France", "Francois Hollande");</pre><p dir="rtl">ونستطيع بعدها إعادة إنشاء الجدول <strong>clubs</strong> باستخدام ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">CREATE TABLE clubs (id integer, name varchar(30), country_id integer);

INSERT INTO clubs VALUES (1, "Real Madrid", 1);

INSERT INTO clubs VALUES (2, "Barcelona", 1);

INSERT INTO clubs VALUES (3, "Chelsea", 2);</pre><p dir="rtl">دعونا الآن نرى ما هي الأندية الموجودة في إسبانيا باستخدام:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SELECT name FROM clubs JOIN countries ON country_id=countries.id WHERE countries.name="Spain";</pre><p dir="rtl">ينبغي أن نشاهد ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Real Madrid

Barcelona</pre><p dir="rtl">يُغطّي هذا موضوع الانضمام الأساسي <strong>basic join</strong>، فلنلاحظ أنّ sqlite تفعل الكثير من أجلنا، ففي التّعبير السّابق يرمز الانضمام <strong>Join</strong> افتراضيًّا إلى <strong>INNER JOIN</strong> بالرغم من أنّنا استخدمنا فقط الكلمة المفتاحيّة JOIN، ولا يجب علينا أيضًا تحديد <strong>clubs.country_id</strong> لأنّها واضحة لا لبس فيها، من ناحية أخرى إن جرّبنا هذا الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">SELECT name FROM clubs JOIN countries ON country_id=id WHERE country_id=1;</pre><p dir="rtl">سنتلقّى رسالة خطأ:  "<strong><span style="font-family:courier new,courier,monospace;">Error: ambiguous column name: id"</span></strong> وهو خطأ معقول بما فيه الكفاية لأنّ الجدولين لدينا كلاهما يملكان عمود <strong>id</strong>، ولكن بشكلٍ عام sqlite متسامحة مع الأخطاء إلى حد ما، فرسائل الأخطاء فيها تميل إلى أن تجعل تحديد مكان أيّ مشاكل وإصلاحها شيئًا بديهيا إلى حد ما، وهذا يُساعد على تسريع عمليّة التّطوير.</p><p dir="rtl"> للمزيد من المساعدة في موضوع الصّياغة Syntax فإنّ الوثائق الرّسميّة لها مليئة بالمخطّطات البيانيّة diagrams مثل هذا <a rel="external nofollow" href="http://www.sqlite.org/lang_delete.html">sqlite.org/langdelete.html</a>، والتي من الممكن أن تكون مفيدة.</p><p dir="rtl">وفي الختام، تملك sqlite أغلفة wrappers وتعريفات في جميع اللغات الرئيسيّة، ويُمكن تشغيلها على معظم الأنظمة، نستطيع إيجاد قائمة بالعديد من هذه اللغات هنا، حظًّا سعيدًا واستمتع بوقتك.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-and-when-to-use-sqlite">How and When to Use Sqlite</a> لصاحبه Gareth Dwyer.</p>
]]></description><guid isPermaLink="false">111</guid><pubDate>Tue, 29 Sep 2015 22:26:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x627;&#x631;&#x646;&#x629; &#x628;&#x64A;&#x646; &#x623;&#x646;&#x638;&#x645;&#x629; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x639;&#x644;&#x627;&#x642;&#x64A;&#x629;: SQLite &#x645;&#x639; MySQL &#x645;&#x639; PostgreSQL</title><link>https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A%D8%A9-sqlite-%D9%85%D8%B9-mysql-%D9%85%D8%B9-postgresql-r72/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/rdbms-comparison.png.981de538939f95860aa03a80f1a695f7.png" /></p>

<p dir="rtl">
	تُستخدَم قواعد البيانات العلاقيّة منذ وقت طويل. لقد اكتسبت قواعد البيانات من هذا النوع شُهرة بفضل أنظمة إدارتها التي تستخدم النموذج العلاقيّ بشكل جيّد للغاية، وهو النموذج الذي أثبت نفسه كطريقة رائعة للتعامل مع البيانات وخاصة في التطبيقات ذات المهام الحرجة.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/rdbms-comparison.png.01c9dc95e4084a76e4ebb19857229762.png" data-fileid="4145" rel=""><img alt="rdbms-comparison.thumb.png.f7a8c544fc5d9" class="ipsImage ipsImage_thumbnailed" data-fileid="4145" src="https://academy.hsoub.com/uploads/monthly_2015_08/rdbms-comparison.thumb.png.f7a8c544fc5d933cbb4d0726b6435c29.png"></a>
</p>

<p dir="rtl">
	سنحاول في هذا المقال شرح الفروقات الرئيسيّة في بعض أكثر أنظمة إدارة قواعد البيانات العلاقيّة (RDBMS) شُهرة واستخدامًا. سنستكشف الفروقات الرئيسيّة بينها من حيث المزايا والأداء الوظيفيّ، وكيفية عملها، ومتى تتفوق إحداها على الأخرى، وذلك من أجل مساعدة المطورين على اختيار نظام إدارة قواعد بيانات علاقية (RDBMS).
</p>

<h2 dir="rtl">
	أنظمة إدارة قواعد البيانات
</h2>

<p dir="rtl">
	<a href="https://academy.hsoub.com/devops/servers/databases/%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-database/" rel="">قواعد البيانات</a> هي مساحات تخزين مرتبة منطقيًّا لكل الأنواع المختلفة من المعلومات (البيانات). لكل نوع من قواعد البيانات –باستثناء عديمة المخطط– نموذج يقدم هيكلة للبيانات التي يتم التعامل معها. أنظمة إدارة قواعد البيانات هي تطبيقات (أو مكتبات) تدير قواعد البيانات بأشكالها وأحجامها وأنواعها المختلفة.
</p>

<h2 dir="rtl">
	أنظمة إدارة قواعد البيانات العلاقية
</h2>

<p dir="rtl">
	تستخدم أنظمة قواعد البيانات العلاقيّة النموذج العلاقيّ للعمل على البيانات. يشكّل النموذج العلاقيّ المعلومات التي ستُخَزَّن مهما كان نوعها، وذلك بتعريفها ككيانات مترابطة ذات خصائص تتعدى الجداول (أي مخططات).
</p>

<p dir="rtl">
	تتطلب أنظمة إدارة قواعد البيانات من هذا النوع أن تكون البُنى (كالجداول مثلًا) معرّفة لتحوي بيانات وتتعامل معها. لكلّ عمود (مثل الخصائص) في الجداول نوعٌ مختلف من المعلومات (نوع البيانات). يُترجَم كلّ سجلّ في قاعدة البيانات –مُعرّف بمفتاح فريد– إلى صفّ ينتمي إلى جدول، وتكون مجموعة خصائص كل سجل معروضة كأعمدة للجدول. وتكون كلها مرتبطة ببعضها كما هو محدد في النموذج العلاقيّ.
</p>

<h3 dir="rtl">
	العلاقات وأنواع البيانات
</h3>

<p dir="rtl">
	يمكن اعتبار العلاقات مجموعات حسابية تحوي مجموعة من الخصائص التي تشكّل معًا قاعدة البيانات والمعلومات المحفوظة فيها. تسمح هذه الطريقة في التعريف والتجميع لقواعد البيانات العلاقيّة بالعمل بالطريقة التي تعمل بها.
</p>

<p dir="rtl">
	عند تعريف جدول لإدخال سجلات، يجب أن يطابق كلّ عنصر يشكل سجلًّا (كالصفة attribute مثلًا) نوع البيانات المحدّد له (كأن يكون عددًا صحيحًا أو تاريخًا مثلًا). تستخدم أنظمة إدارة قواعد البيانات العلاقيّة أنواعًا مختلفة من البيانات ولا يمكن في العادة تبديل واحدة من هذه الأنواع مكان الأخرى. التعامل مع وعبر قيود –كالتي ذكرناها قبل قليل– شائع مع قواعد البيانات العلاقيّة. في الحقيقة، تشكّل القيودُ مركزَ العلاقات.
</p>

<p dir="rtl">
	<strong>ملاحظة:</strong> إذا كنت تحتاج للتعامل مع معلومات غير مترابطة إطلاقًا وممثلة عشوائيًّا (كالمستندات مثلًا)، فقد تكون مهتمًّا باستخدام NoSQL (قواعد البيانات عديمة المخططات schema-less).
</p>

<h3 dir="rtl">
	قواعد بيانات علاقية شائعة وهامة
</h3>

<p dir="rtl">
	سنتعرف في هذا المقال على ثلاثة أنواع رئيسيّة وهامّة من أنظمة إدارة قواعد البيانات العلاقيّة مفتوحة المصدر التي ساهمت في تكوين عالم تطوير البرمجيات:
</p>

<ul dir="rtl">
<li>
		<strong>SQLite:</strong>  نظام إدارة قواعد بيانات علاقيّة مضمّن وقويّ جدًّا.
	</li>
	<li>
		<strong>MySQL:</strong> نظام إدارة قواعد البيانات العلاقيّة الأشهر والأكثر استخدامًا.
	</li>
	<li>
		<strong>PostgreSQL:</strong> نظام إدارة قواعد البيانات العلاقيّة الكيانيّ مفتوح المصدر المتوافق مع SQL الأكثر تقدّمًا.
	</li>
</ul>
<p dir="rtl">
	<strong>ملاحظة:</strong> تقريبًا دائمًا تتيح التطبيقات مفتوحة المصدر حريّة استخدام الطريقة التي تريدها. وفي غالب الأحيان تسمح لك أيضًا إنشاء تفرّع (fork) عن المشروع (وبالتالي استخدام نصوصه البرمجيّة) لإنشاء شيء جديد. إذا كنت مهتمًّا بأنظمة إدارة قواعد البيانات، فقد ترغب بالاطلاع على بعض المشاريع المتفرّعة المبنية على هذه المشاريع الشهيرة، مثل <a href="https://mariadb.org/" rel="external nofollow">MariaDB</a>.
</p>

<h2 dir="rtl">
	<a name="sqlite" rel=""></a>SQLite
</h2>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/SQLite370.svg.png.0cea81cbdb41fe4bd1cfc6be6bde0ff2.png" data-fileid="4146" rel=""><img alt="SQLite370.svg.thumb.png.a05e2836a5f3b92b" class="ipsImage ipsImage_thumbnailed" data-fileid="4146" src="https://academy.hsoub.com/uploads/monthly_2015_08/SQLite370.svg.thumb.png.a05e2836a5f3b92bd281734f37a8ad7f.png"></a>
</p>

<p dir="rtl">
	إنّ SQLite مكتبة رائعة تُضمَّن في التطبيقات التي تستخدمها. وكونها قاعدة بيانات قائمة بذاتها ومعتمدة على الملفات. تقدّم SQLite مجموعة رائعة من الأدوات للتعامل مع كل أنواع البيانات بقيود أقلّ بكثير وسهولة مقارنة بقواعد البيانات المستضافة المعتمدة على العمليات (خواديم قواعد البيانات). عندما يستخدم برنامج ما SQLite، يعمل هذا التكامل بنداءات (calls) مباشرة ومؤدية للغرض موجهة لملف يحوي البيانات (كقاعدة بيانات SQLite) بدلًا من التواصل عبر واجهة من نوع ما (كالمنافذ ports والمقابس sockets). هذا يجعل SQLite كفؤة وسريعة للغاية، وقويّة كذلك، وهذا بفضل التقنية التي بنيت عليها هذه المكتبة.
</p>

<h3 dir="rtl">
	أنواع البيانات التي تدعمها SQLite:
</h3>

<ul dir="rtl">
<li>
		<strong>NULL:</strong> قيمة فارغة NULL.
	</li>
	<li>
		<strong>INTEGER:</strong> عدد صحيح ذو إشارة (موجب أو سالب) محفوظ في بايت واحد، 2، 3، 4، 6، أو 8 بايت، وهذا يعتمد على حجم القيمة.
	</li>
	<li>
		<strong>REAL</strong>: قيمة النقطة العائمة (floating point)، مخزنة كرقم نقطة IEEE عائمة ذي 8-بايت.
	</li>
	<li>
		<strong>TEXT:</strong> سلسلة نصيّة مخزنة باستخدام ترميز قاعدة البيانات (UTF-8, UTF-16BE or UTF-16LE).
	</li>
	<li>
		<strong>BLOB:</strong> فقاعة من البيانات، تخزّن كما أدخِلَت تمامًا.
	</li>
</ul>
<p dir="rtl">
	<strong>ملاحظة:</strong> لمعرفة المزيد عن أنواع بيانات SQLite والعلاقات بين أنواع SQLite، ألقِ نظرة على<a href="http://www.sqlite.org/datatype3.html" rel="external nofollow"> التوثيق الرسميّ</a> حول الموضوع.
</p>

<h3 dir="rtl">
	مزايا SQLite:
</h3>

<ul dir="rtl">
<li>
		<strong>معتمدة على الملفات:</strong> تتكون قاعدة البيانات بأكملها من ملف واحد على القرص، مما يجعلها محمولة تمامًا.
	</li>
	<li>
		<strong>مدركة للمعايير:</strong> رغم أنها قد تبدو كتطبيق قواعد بيانات "بسيط"، إلّا أن SQLite تستخدم SQL. ورغم أنّها أزالت بعض المزايا ( RIGHT OUTER JOIN أو FOR EACH STATEMENT) إلّا أنها تحوي بداخلها مزايا أخرى إضافيّة.
	</li>
	<li>
		<strong>ممتازة للتطوير، بل وحتى للاختبار:</strong> أثناء مرحلة تطوير التطبيقات، في الغالب يحتاج أغلب الناس لحلّ يمكن تطويعه للطلبات المتعدّدة. لدى SQLite قاعدة مزايا غنيّة، ويمكنها تقديم أكثر مما تحتاجه للتطوير، وبسهولة العمل مع ملف وحيد ومكتبة مرتبطة مبنية على C.
	</li>
</ul>
<h3 dir="rtl">
	عيوب SQLite:
</h3>

<ul dir="rtl">
<li>
		<strong>لا توفّر إدارة للمستخدمين: </strong>تأتي قواعد البيانات المتقدّمة بإدارة للمستخدمين –فمثلًا، فيها اتصالات مُدارة بصلاحيات الوصول إلى قواعد البيانات والجداول–. وبأخذ هدف وطبيعة SQLite بعين الاعتبار (عدم وجود مستوىً عالٍ من تعدّد المستخدمين في ذات الوقت)، لا وجود لهذه الميزة.
	</li>
	<li>
		<strong>عدم توفر إمكانية التلاعب بها للحصول على أداء أفضل:</strong> ونظرًا لطبيعة تصميمها أيضًا، لا يمكن التلاعب بـ SQLite للحصول على قدر كبير من الأداء. المكتبة سهلة الضبط والاستخدام. وبما أنها ليست معقّدة، فلا يمكن تقنيًّا جعلها أكثر أداءًا مما هي عليه، وبشكل يفوق أداءها الحاليّ الرائع.
	</li>
</ul>
<h3 dir="rtl">
	متى تستخدم SQLite:
</h3>

<ul dir="rtl">
<li>
		<strong>التطبيقات المضمّنة:</strong> كلّ التطبيقات التي تحتاج لقابليّة النقل، والتي لا تحتاج لتحجيم، كتطبيقات المستخدم المحلي والوحيد، وتطبيقات الهاتف النقّال أو الألعاب.
	</li>
	<li>
		<strong>كبديل عن الوصول إلى القرص:</strong> في العديد من الحالات، يمكن أن تستفيد التطبيقات التي تحتاج للقراءة من والكتابة إلى الملفات على القرص مباشرة من الانتقال إلى SQLite من أجل المزيد من الوظائف والسهولة اللتان تأتيان من استخدام لغة الاستعلام البنيويّة (Structured Query Language – SQL).
	</li>
	<li>
		<strong>الاختبار:</strong> من التبذير أن تستخدم نسبة كبيرة من التطبيقات عمليّة إضافيّة لاختبار منطقيّة العمل (أي الهدف الرئيسيّ للتطبيق: الوظيفيّة).
	</li>
</ul>
<h3 dir="rtl">
	متى لا تستخدم SQLite:
</h3>

<ul dir="rtl">
<li>
		<strong>في التطبيقات متعدّدة المستخدمين:</strong> إذا كنت تعمل على تطبيق يحتاج فيه العديد من المستخدمين الوصول إلى نفس قاعدة البيانات واستخدامها، فالغالب أنّ مدير قواعد بيانات علاقيّ كامل المزايا (مثل MySQL) خيار أفضل من SQLite.
	</li>
	<li>
		<strong>في التطبيقات التي تحتاج لقدر كبير من الكتابة: </strong>من محدوديّات SQLite عمليات الكتابة. يسمح نظام إدارة قواعد البيانات هذا عملية كتابة واحدة وحيدة أن تتم في وقت محدّد، مما يسمح بقدر محدود من الدفق.
	</li>
</ul>
<h2 dir="rtl">
	<a name="mysql" rel=""></a>MySQL
</h2>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/MySQL.svg.png.4c691360136c08abc9352dc55a3653b4.png" data-fileid="4147" rel=""><img alt="MySQL.svg.thumb.png.ac394f54133950336593" class="ipsImage ipsImage_thumbnailed" data-fileid="4147" src="https://academy.hsoub.com/uploads/monthly_2015_08/MySQL.svg.thumb.png.ac394f54133950336593d476debddb3b.png"></a>
</p>

<p dir="rtl">
	تعد MySQL أشهر خوادم قواعد البيانات الكبيرة. وهو منتج مفتوح المصدر غنيّ بالمزايا، ويشغّل الكثير من المواقع والتطبيقات على الإنترنت. من السهل البدء باستخدام MySQL، ولدى المطورين وصول إلى كمّ هائل من المعلومات المتعلقة بقواعد البيانات على الإنترنت.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: يجب أن نذكر أنّه نتيجة لشيوع المُنتَج، فإنّ هناك الكثير من تطبيقات الشركات الأخرى وأدواتها ومكتباتها المضمّنة التي تساعد كثيرًا في الهديد من نواحي العمل مع نظام إدارة قواعد البيانات العلاقيّة هذا.
</p>

<p dir="rtl">
	ورغم عدم محاولتها تطبيق معيار SQL كامل، إلّا أنّ MySQL تقدّم الكثير من الوظائف للمستخدمين. وكخادم SQL قائم بذاته، تتصل التطبيقات بعملية مراقب MySQL (وهو تطبيق يعمل في الخلفية بعيدًا عن مرأى المستخدم، ويشار إليه أحيانًا بعبارة جنيّ أو عفريت) للوصول إلى قواعد البيانات ذاتها على خلاف SQLite.
</p>

<h3 dir="rtl">
	أنواع البيانات التي تدعمها MySQL:
</h3>

<ul dir="rtl">
<li>
		<strong>TINYINT</strong>: عدد صحيح متناهي الصغر.
	</li>
	<li>
		<strong>SMALLINT</strong>: عدد صحيح صغير.
	</li>
	<li>
		<strong>MEDIUMINT</strong>: عدد صحيح متوسّط الحجم.
	</li>
	<li>
		<strong>INT or INTEGER</strong>: عدد صحيح بحجم عاديّ.
	</li>
	<li>
		<strong>BIGINT</strong>: عدد صحيح كبير.
	</li>
	<li>
		<strong>FLOAT</strong>: عدد بفاصلة عائمة صغير أحاديّ الدقّة (single-precision floating-point). لا يمكن إلغاؤه.
	</li>
	<li>
		<strong>DOUBLE, DOUBLE PRECISION, REAL</strong>: عدد بفاصلة عائمة متوسط الحجم مزدوج الدقّة (normal-size/double-precision floating-point). لا يمكن إلغاؤه.
	</li>
	<li>
		<strong>DECIMAL, NUMERIC</strong>: عدد بفاصلة عائمة غير مُحتوىً. لا يمكن إلغاؤه.
	</li>
	<li>
		<strong>DATE</strong>: تاريخ.
	</li>
	<li>
		<strong>DATETIME</strong>: تجميعة من الوقت والتاريخ
	</li>
	<li>
		<strong>TIMESTAMP</strong>: ختم زمني (وقت وتاريخ حدوث حدث ما).
	</li>
	<li>
		<strong>TIME</strong>: وقت.
	</li>
	<li>
		<strong>YEAR</strong>: سنة بهيئة منزلتين أو أربعة منازل (المبدئيّ 4 منازل).
	</li>
	<li>
		<strong>CHAR</strong>: سلسلة نصّيّة ذات طول محدّد يتم دائمًا إكمالها من ناحية اليمين بفراغات إلى الطول المحدّد عند تخزينها.
	</li>
	<li>
		<strong>VARCHAR</strong>: سلسلة نصيّة ذات طول متغيّر.
	</li>
	<li>
		<strong>TINYBLOB, TINYTEXT</strong>: عمود نصّ أو فقاعة (blob) بحدّ أقصى للطول قدره 255 (أي 2^8 – 1) محرفًا.
	</li>
	<li>
		<strong>BLOB, TEXT</strong>: عمود نصّ أو فقاعة (blob) بحدّ أقصى للطول قدره 65535 (أي 2^16 – 1) محرفًا.
	</li>
	<li>
		<strong>MEDIUMBLOB, MEDIUMTEXT</strong>: عمود نصّ أو فقاعة (blob) بحدّ أقصى للطول قدره 16777215 (أي 2^24 - 1) محرفًا.
	</li>
	<li>
		<strong>LONGBLOB, LONGTEXT</strong>: عمود نصّ أو فقاعة (blob) بحدّ أقصى للطول قدره 4294967295 (أي 2^32 - 1) محرفًا.
	</li>
	<li>
		<strong>ENUM</strong>: تِعداد.
	</li>
	<li>
		<strong>SET</strong>: مجموعة.
	</li>
</ul>
<h3 dir="rtl">
	<a name="advantages-of-mysql" rel=""></a>
</h3>

<h3 dir="rtl">
	مزايا MySQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>سهلة الاستخدام:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	يمكن تثبيت MySQL بسهولة شديدة. أدوات الأطراف الخارجية (third-party)، بما فيها المرئيّة (أي الواجهات الرسوميّة) تجعل البدء مع قواعد البيانات سهلًا للغاية.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>غنيّة بالمزايا:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	تدعم MySQL الكثير من وظائف SQL المتوقّع وجودها في أنظمة إدارة قواعد البيانات العلاقيّة، سواء بطريقة مباشرة أو غير مباشرة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>آمنة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	الكثير من مزايا الأمن وبعضها متقدّم مبنيّة في MySQL.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>قويّة وقابلة للتحجيم:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	يمكن لـMySQL التعامل مع الكثير من البيانات، ويمكنها أيضًا استخدامها على نطاق واسع إذا احتاج الأمر.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>سريعة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	التخليّ عن بعض المعايير سمح لـ MySQL بالعمل بكفاءة عالية وبطريقة سلسة، مما أكسبها سرعة عالية.
</p>

<h3 dir="rtl">
	عيوب MySQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>المحدوديّات المعروفة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	من حيث التصميم، لا تنوي MySQL عمل كلّ شيء، وتأتي بمحدوديّات وظيفيّة قد تتطلبها بعض التطبيقات المتقدّمة جدًّا من الناحية الفنيّة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>القضايا المتعلّقة بالمتانة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	الطريقة التي يتم التعامل فيها مع بعض الوظائف في MySQL (كالمراجع، والتبادلات، والتدقيق، وغيرها) تجعلها أقل متانة بقليل من بعض أنظمة إدارة قواعد البيانات العلاقيّة الأخرى.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>بطء تطويرها:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	رغم أنّ MySQL ما زالت من الناحية الفنيّة منتجًا مفتوح المصدر، إلّا أنّ هناك انتقادات تتعلق بعمليّة تطويرها منذ الاستحواذ عليها. ولكن علينا التنويه إلى أنّ هناك قواعد بيانات مبنيّة على MySQL ومتكاملة معها تمامًا تضيف مزايا على تثبيت MySQL القياسيّ (مثل MariaDB).
</p>

<h3 dir="rtl">
	متى تستخدم MySQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>العمليّات الموزّعة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عندما تحتاج لأكثر مما تتيحه SQLite، فإنّ تضمين MySQL في قائمة التطوير لديك – كذلك بالأمر بالنسبة لتضمين أيّ خادم قواعد بيانات مستقل – يقدّم لك الكثير من الحريّة في العمل إلى جانب بعض المزايا المتقدّمة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>الأمان العالي:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مزايا MySQL الأمنيّة تقدّم حماية يُعتمد عليها للوصول إلى البيانات (واستخدامها) بطريقة بسيطة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>المواقع وتطبيقات الوِب:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	يمكن للأغلبية العُظمى من المواقع (وتطبيقات الوِب) العمل ببساطة مع MySQL رغم القيود. هذه الأداة المرنة والتي يمكن تحجيمها إلى حدّ ما سهلةُ الاستخدام والإدارة؛ وهذا مفيدٌ جدًّا على المدى البعيد.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>الحلول الخاصّة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	إذا كنت تعمل على حلول محدّدة جدًّا ومخصّصة للغاية، يمكن لـMySQL العمل ضمن احتياجاتك بسهولة، وذلك بفضل إعدادات الضبط الغنيّة فيها وأوضاع العمل.
</p>

<h3 dir="rtl">
	متى لا تستخدم MySQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>التوافقيّة مع SQL:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	بما أنّ MySQL لا تطبّق (ولا تسعى لتطبيق) معيار SQL بأكمله، فإنّ هذه الأداة ليست متوافقة بالكامل مع SQL. إذا كنت قد تحتاج التكامل مع أنظمة إدارة قواعد بيانات علاقيّة كهذه، فإنّ الانتقال من MySQL لن يكون سهلًا.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>التعدّدية Concurrency:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	رغم أنّ MySQL وبعض محرّكات الحفظ تعمل بأداء جيّد جدًّا في عمليات القراءة، إلا أنّ عمليات القراءة والكتابة متزامنتين قد تكون سيئة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>نقص المزايا:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مجدّدًا نقول، اعتمادًا على اختيار محرّك قواعد البيانات، يمكن أن لا تحوي MySQL على بعض المزايا، كالبحث في النصوص الكاملة.
</p>

<h2 dir="rtl">
	<a name="postgresql" rel=""></a>PostgreSQL
</h2>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/postgresql-logo.png.f4adac27c8e88ea69eac4c00d23c2b02.png" data-fileid="4148" rel=""><img alt="postgresql-logo.thumb.png.f8158339b3dc5c" class="ipsImage ipsImage_thumbnailed" data-fileid="4148" src="https://academy.hsoub.com/uploads/monthly_2015_08/postgresql-logo.thumb.png.f8158339b3dc5cbd886ce33bdd423931.png"></a>
</p>

<p dir="rtl">
	إنّ PostgreSQL هي نظام إدارة قواعد البيانات العلاقيّة الكيانيّ مفتوح المصدر الأكثر تقدّمًا، والتي هدفها الرئيسيّ أن تكون موافقة للمعايير ويمكن الزيادة عليها. تسعى PostgreSQL (أو Postgres) إلى تبني معايير ANSI/ISO SQL مع مراجعاتها.
</p>

<p dir="rtl">
	تتميّز PostgreSQL عن أنظمة إدارة المحتوى الأخرى بدعمها للتوجه الكيانيّ (object-oriented) المتكامل والمطلوب بشدّة و/أو وظائف قواعد البيانات العلاقيّة، كدعمها الكامل للتبادلات (القيود transactions) التي يعتمد عليها، أي أن تكون مكونة من عناصر غير قابلة للتجزئة، وأن تكون متّسقة ومعزولة وذات قدرات تحمل عالية (Atomicity, Consistency, Isolation, Durability – ACID).
</p>

<p dir="rtl">
	وبسبب التقنية القوية التي تقف خلفها، لدى Postgres قدرات عالية جدًّا في التعامل مع العديد من المهام بكفاءة عالية. يتم الوصول إلى التعدّدية (concurrency) دون قفل قراءة، وذلك بفضل تطبيق تحكم التعدّديّة متعدد الإصدارات (Multiversion Concurrency Control – MVCC). يمكن برمجة الكثير في PostgreSQL، وبالتالي يمكن توسعتها، وذلك باستخدام إجراءات مخصّصة تُدعى "إجراءات التخزين" (store procesures). يُمكن إنشاء هذه الإجراءات لتسهيل تنفيذ عمليات قاعدة البيانات المكررة والمعقدة والتي تكثر الحاجة إليها.
</p>

<p dir="rtl">
	رغم أنّ نظام إدارة قواعد البيانات هذا لا يحظى بشعبيّة MySQL، إلّا أنّ هناك الكثير من أدوات الأطراف الأخرى ومكتباتهم مصمّمة لجعل العمل مع PostgreSQL سهلًا، رغم طبيعته القويّة. يمكن الحصول على PostgreSQL هذه الأيام كحزمة تطبيقات من خلال مدير الحزم المبدئيّ للعديد من أنظمة التشغيل بسهولة.
</p>

<h3 dir="rtl">
	أنواع البيانات التي تدعمها PostgreSQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>bigint</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد صحيح من 8-بايت ذو إشارة
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>bigserial</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد صحيح من 8-بايت يزداد تلقائيًّا
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(bit [(n</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	سلسلة ثنائيّة ذات طول محدّد
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(bit varying [(n</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	سلسلة ثنائيّة متغيرة الأطوال
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>boolean</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	متغيّر منطقي (صواب/خطأ)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>box</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	صندوق مستطيل في سطح مستوٍ
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>bytea</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	بيانات ثنائيّة ("مصفوفة بايت")
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(character varying [(n</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	سلسلة محارف (character string) ذات طول متغير
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(character [(n</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	سلسلة محارف ذات طول ثابت
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>cidr</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عنوان شبكة IPv4 أو IPv6
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>circle</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	دائرة في سطح مستوٍ
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>date</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	تاريخ في تقويم (السنة، الشهر، اليوم)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>double precision</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد فاصلة عائمة ذو دقّة مزدوجة (8 بايت)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>inet</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عنوان مضيف IPv4 أو IPv6
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>integer</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد صحيح من 4 بايت ذو إشارة
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(interval [fields] [(p</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مدة زمنية
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>line</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	خط لا نهائيّ في مستوى
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>lseg</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	جزء من خطّ مستقيم في مستوى
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>macaddr</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عنوان تحكم بالوصول إلى الوسيط (Media Access Control – MAC)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>money</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مقدار من المال
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[(numeric [(p, s</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	دقّة رقميّة محدّدة أو يمكن اختيارها
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>path</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مسار هندسيّ على سطح
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>point</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	نقطة هندسيّة على سطح
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>polygon</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	شكل هندسيّ مغلق على سطح
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>real</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد فاصلة عائمة ذي دقّة أحاديّة (4 بايت)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>smallint</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد صحيح من 2-بايت ذو إشارة
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>serial</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عدد صحيح من 4 بايت يزداد تلقائيًّا
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>text</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	سلسلة محارف ذات طول متغيّر
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[time [(p)] [without time zone</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	وقت في اليوم (دون منطقة زمنية)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>time [(p)] with time zone</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	الوقت من اليوم (مع منطقة زمنية)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>[timestamp [(p)] [without time zone</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	تاريخ ووقت (دون منطقة زمنية)
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>timestamp [(p)] with time zone</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	تاريخ ووقت يشمل المنطقة الزمنيّة
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>tsquery</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	استعلام بحث نصّيّ
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>tsvector</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مستند بحث نصيّ
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>txid_snapshot</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	لَقطَة (transaction) لهويّة التبادل على مستوى المستخدم
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>uuid</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	معرّف فريد عالميًّا
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>xml</strong>:
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	بيانات XML
</p>

<h3 dir="rtl">
	مزايا PostgreSQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>نظام إدارة قواعد بيانات مفتوح المصدر موافق لمعايير SQL:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	PostgreSQL مفتوح المصدر ومجانيّ، ولكنه نظام إدارة قواعد بيانات علاقيّة قويّ جدًّا.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>مجتمع قويّ:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	PostgreSQL مدعوم من مجتمع خبيرٍ ومخلص يمكن الوصول إليه عبر مواقع الأسئلة والإجابات والقاعدة المعرفيّة طوال الوقت ومجانًا.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>دعم قويّ من الأطراف الأخرى:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	بغض النظر عن المزايا المتقدّمة جدًّا، تُزيّن PostgreSQL العديدُ من الأدوات الجيّدة ومفتوحة المصدر من أطراف أخرى لتصميم وإدارة واستخدام نظام الإدارة هذا.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>إمكانية التوسعة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	يمكن توسعة PostgreSQL برمجيًّا باستخدام إجراءات مخزّنة، كما يفترض أن يكون الوضع في نظام إدارة قواعد بيانات علاقيّة متقدّم.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>كيانيّ:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	ليس PostgreSQL مجرّد نظام إدارة قواعد بيانات علاقيّة، ولكنه كيانيّ (objective) أيضًا – ويدعم التضمين (nesting)، ومزايا أخرى.
</p>

<h3 dir="rtl">
	عيوب PostgreSQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>الأداء:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	للعمليات البسيطة كثيفة القراءة، يمكن أن تكون PostgreSQL مبالغًا فيها، ويمكن أن تبدو أقلّ أداءً من منافساتها، مثل MySQL.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>الشعبيّة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	نظرًا لطبيعة هذه الأداة، فإنها تقبع في الخلف فيما يتعلق بشعبيتها، رغم كثرة من استخدامها – مما قد يؤثر على سهولة الحصول على دعم.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>الاستضافة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	نتيجة للعوامل المذكورة أعلاه، يصعب إيجاد مستضيفين أو مقدمي خدمة يعرضون خدمات PostgreSQL مُدارة.
</p>

<h3 dir="rtl">
	متى تستخدم PostgreSQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>صحّة البيانات:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	عندما تكون صحّة البيانات وإمكانية التعويل عليها ضرورة حتميّة، ولا يكون هناك عذر إذا حدث خطب ما، فستكون PostgreSQL الخيار الأفضل.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>الإجراءات المخصّصة المعقّدة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	إذا كنت تتطلّب من قاعدة بياناتك أداء إجراءات مخصّصة، فـPostgreSQL هي الخيار الأفضل، كونه يمكن توسعتها.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>التكامل:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	إذا كان يُحتمل في المستقبل أن تكون هناك حاجة لنقل نظام قاعدة البيانات بأكمله إلى حلّ مملوك (مثل أوراكل)، فستكون PostgreSQL الأكثر توافقًا والأسهل في التعامل معها عند الانتقال.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>التصاميم المعقّدة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	مقارنة بتطبيقات أنظمة إدارة قواعد البيانات العلاقيّة المجانية ومفتوحة المصدر الأخرى، تقدّم PostgreSQL لتصاميم قواعد البيانات المعقّدة أكبر قدر من الوظائف والإمكانات دون التفريط بالأمور الأخرى.
</p>

<h3 dir="rtl">
	متى لا تستخدم PostgreSQL
</h3>

<ul>
<li>
		<p dir="rtl">
			<strong>السرعة:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	إذا كان كلّ ما تطلبه عمليات قراءة سريعة، فليست PostgreSQL الأداة التي عليك استخدامها.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>سهولة الإعداد:</strong>
		</p>
	</li>
</ul>
<p dir="rtl" style="margin-right: 40px;">
	إذا لم تكن تحتاج لصحّة مطلقة للبيانات، أو للتوافق مع ACID أو التصاميم المعقّدة، فقد تكون PostgreSQL مبالغًا فيها للإعدادات البسيطة.
</p>

<ul>
<li>
		<p dir="rtl">
			<strong>التكرار:</strong>
		</p>
	</li>
</ul>
<p dir="rtl">
	إذا لم تكن مستعدًّا لقضاء الوقت، وبذل الجهد والموارد، فالحصول على التكرار (أو تعدّد النُسَخ) في MySQL قد يكون أسهل لمن ليست لديهم خبرة في إدارة الأنظمة وقواعد البيانات.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems" rel="external nofollow">SQLite vs MySQL vs PostgreSQL: A Comparison Of Relational Database Management Systems</a> لصاحبه O.S. Tezer.
</p>
]]></description><guid isPermaLink="false">72</guid><pubDate>Wed, 26 Aug 2015 00:17:00 +0000</pubDate></item><item><title>&#x634;&#x631;&#x62D; &#x627;&#x644;&#x641;&#x631;&#x648;&#x642;&#x627;&#x62A; &#x628;&#x64A;&#x646; &#x642;&#x648;&#x627;&#x639;&#x62F; &#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; SQL &#x648;&#x646;&#x638;&#x64A;&#x631;&#x627;&#x62A;&#x647;&#x627; NoSQL</title><link>https://academy.hsoub.com/devops/servers/databases/%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D9%81%D8%B1%D9%88%D9%82%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sql-%D9%88%D9%86%D8%B8%D9%8A%D8%B1%D8%A7%D8%AA%D9%87%D8%A7-nosql-r71/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_07/sql-vs-nosql.png.5eed02e77401252f7bbe2ab1b4eb91ee.png" /></p>

<p dir="rtl">منذ زمن سحيق، كانت الذاكرةُ أكثر وظيفة نحتاجها ونعتمد عليها في الحاسوب. ورغم اختلاف التقنيات وأساليب التنفيذ الكامنة وراءها، إلّا أنّ معظم الحواسيب تأتي بالعتاد الضروريّ لمعالجة المعلومات وحفظها بأمان لاستخدامها في المستقبل متى احتجنا لها. لقد صار من المستحيل في عالمنا الحديث تخيل أيّ عمل لا يستفيد من هذه القدرة في الأجهزة، سواء كانت خواديم أو حواسيب شخصية أو كفّيّة. تُعالَج البيانات وتُسجَّل وتُسترجَع مع كل عملية، وفي كل مكان من الألعاب إلى الأدوات المتعلقة بالأعمال، بما فيها المواقع.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/sql-vs-nosql.png.a529b7ce6a9eeced3e2249330ff4b86f.png"><img data-fileid="3158" class="ipsImage ipsImage_thumbnailed" alt="sql-vs-nosql.thumb.png.71b74c61faa7839c3" src="https://academy.hsoub.com/uploads/monthly_2015_07/sql-vs-nosql.thumb.png.71b74c61faa7839c34677f870a310bcd.png"></a></p><p dir="rtl">أنظمة إدارة قواعد البيانات (DataBase Management Systems – DBMS) هي برمجيات عالية المستوى تعمل مع واجهات برمجة تطبيقات (APIs) أدنى منها في المستوى، وتلك الواجهات بدورها تهتم بهذه العمليات. لقد تم تطوير العديد من أنظمة إدارة قواعد البيانات (كقواعد البيانات العلائقيّة relational databases، وnoSQL، وغيرها) لعقود من الزمن للمساعدة على حلّ المشكلات المختلفة، إضافة إلى برامج لها (مثل MySQL ,PostgreSQL ,MongoDB ,Redis، إلخ).</p><p dir="rtl">سنقوم في هذا المقال بالمرور على أساسيّات قواعد البيانات وأنظمة إدارة قواعد البيانات. وسنتعرف من خلالها على المنطق الذي تعمل به قواعد البيانات المختلفة، وكيفية التفرقة بينها.</p><h2 dir="rtl">أنظمة إدارة قواعد البيانات</h2><p dir="rtl">إن مفهوم نظام إدارة قاعدة البيانات مظلّةٌ تندرج تحتها كلّ الأدوات المختلفة أنواعها (كبرامج الحاسوب والمكتبات المضمّنة)، والتي غالبًا تعمل بطرق مختلفة وفريدة جدًّا. تتعامل هذه التطبيقات مع مجموعات من المعلومات، أو تساعد بكثرة في التعامل معها. وحيث أن المعلومات (أو البيانات) يُمكِن إن تأتي بأشكال وأحجام مختلفة، فقد تم تطوير العشرات من أنظمة قواعد البيانات، ومعها أعداد هائلة من تطبيقات قواعد البيانات منذ بداية النصف الثاني من القرن الحادي والعشرين، وذلك من أجل تلبية الاحتياجات الحوسبيّة والبرمجية المختلفة.</p><p dir="rtl">تُبنى أنظمة إدارة قواعد البيانات على نماذج لقواعد البيانات: وهي بُنى محدّدة للتعامل مع البيانات. وكل تطبيق ونظام إدارة محتوى جديد أنشئ لتطبيق أساليبها يعمل بطريقة مختلفة فيما يتعلق بالتعريفات وعمليات التخزين والاسترجاع للمعلومات المُعطاة.</p><p dir="rtl">ورغم أنّ هناك عددًا كبيرًا من الحلول التي تُنشئ أنظمة إدارة قواعد بيانات مختلفة، إلّا أنّ كلّ مدة زمنية تضمّنت خيارات محدودة صارت شائعة جدًّا وبقيت قيد الاستخدام لمدة أطول، والغالب أنّ أكثرها هيمنة على هذه الساحة خلال العقدين الأخيرين (وربما أكثر من ذلك) هي أنظمة إدارة قواعد البيانات العلائقيّة (Relational Database Management Systems – RDBMS).</p><h2 dir="rtl">أنواع قواعد البيانات</h2><p dir="rtl">يستخدم كلُّ نظام إدارة بياناتٍ نموذجًا لقواعد البيانات لترتيب البيانات التي يديرها منطقيًّا. هذه النماذج (أو الأنواع) هي الخطوة الأولى والمحدّد الأهم لكيفية عمل تطبيق قواعد البيانات وكيفية تعامله مع المعلومات وتصرفه بها. هناك بعض الأنواع المختلفة لنماذج لقواعد البيانات التي تعرض بوضوع ودقّة معنى هيكلة البيانات، والغالب أن أكثر هذه الأنواع شهرةً قواعدُ البيانات العلائقيّة.</p><p dir="rtl">ورغم أنّ النموذج العلائقيّ وقواعد البيانات العلائقيّة (relational databases) مرنة وقويّة للغاية –عندما يعلم المبرمج كيف يستخدمها–، إلّا أنّ هناك بعض المشكلات التي واجهات عديدين، وبعض المزايا التي لم تقدمها هذه الحلول.</p><p dir="rtl">لقد بدأت حديثًا مجموعة من التطبيقات والأنظمة المختلفة المدعوّة بقواعد بيانات NoSQL بالاشتهار بسرعة كبيرة، والتي قدمت وعودًا لحل هذه المشكلات وتقديم بعض الوظائف المثيرة للاهتمام بشدّة. بالتخلص من البيانات المهيكلة بطريقة متصلّبة (بإبقاء النمط المعرّف في النموذج العلائقيّ (relational model))، تعمل هذه الأنظمة بتقديم طريقة حرّة أكثر في التعامل مع المعلومات، وبهذا توفّر سهولة ومرونة عاليتين جدًّا؛ رغم أنّها تأتي بمشاكل خاصة بها –والتي تكون بعضها جدّيّة– فيما يتعلق بطبيعة البيانات الهامّة والتي لا غنى عنها.</p><h3 dir="rtl">النموذج العلائقيّ</h3><p dir="rtl">يقدّم النظام العلائقيّ الذي ظهر في تسعينات القرن الماضي طريقة مناسبة للرياضيات في هيكلة وحفظ واستخدام البيانات. توسّع هذه الطريقة من التصاميم القديمة، كالنموذج المسطّح (flat)، والشبكيّ، وغيرها، وذلك بتقديمها مفهوم "العلاقات". تقدّم العلاقات فوائد تتعلق بتجميع البيانات كمجموعات مقيّدة، تربط فيها جداول البيانات –المحتوية على معلومات بطريقة منظمة (كاسم شخص وعنوانه مثلاً)– كل المدخلات بإعطاء قيم للصفات (كرقم هوية الشخص مثلًا).</p><p dir="rtl">وبفضل عقود من البحث والتطوير، تعمل أنظمة قواعد البيانات التي تستخدم النموذج العلائقيّ بكفاءة وموثوقيّة عاليتين جدًّا. أضف إلى ذلك الخبرة الطويلة للمبرمجين ومديري قواعد البيانات في التعامل مع هذه الأدوات؛ لقد أدّى هذا إلى أن يصبح استخدام تطبيقات قواعد البيانات العلائقيّة الخيار الأمثل للتطبيقات ذات المهام الحرجة، والتي لا يمكنها احتمال فقدان أيّة بيانات تحت أيّ ظرف، وخاصة كنتيجة لخلل ما أو لطبيعة التطبيق نفسه الذي قد يكون أكثر عرضة للأخطاء.</p><p dir="rtl">ورغم طبيعتها الصارمة المتعلقة بتشكيل والتعامل مع البيانات، يمكن لقواعد البيانات العلائقيّة أن تكون مرنة للغاية وأن تقدم الكثير، وذلك بتقديم قدر ضئيل من المجهود.</p><h3 dir="rtl">التوجّه عديم النموذج (Model-less) أو NoSQL</h3><p dir="rtl">تعتمد طريقة NoSQL في هيكلة البيانات على التخلص من هذه القيود، حيث تحرر أساليب حفظ، واستعلام، واستخدام المعلومات. تسعى قواعد بيانات NoSQL إلى التخلص من العلائقات المعقدة، وتقدم أنواع عديدة من الطرق للحفاظ على البيانات والعمل عليها لحالات استخدام معينة بكفاءة (كتخزين مستندات كاملة النصوص)، وذلك من خلال استخدامها توجّها غير منظم (أو الهيكلة على الطريق / أثناء العمل).</p><h2 dir="rtl">أنظمة إدارة قواعد بيانات شائعة</h2><p dir="rtl">هدفنا في هذا المقال هو أن نقدم لك نماذج عن بعض أشهر حلول قواعد البيانات وأكثرها استخدامًا. ورغم صعوبة الوصول إلى نتيجة بخصوص نسبة الاستخدام، يمكننا بوضوح افتراض أنّه بالنسبة لغالب الناس، تقع الاختيارات بين محرّكات قواعد البيانات العلائقيّة، أو محرك NoSQL أحدث. لكن قبل البدء بشرح الفروقات بين التطبيقات المختلفة لكل منهما، دعنا نرى ما يجري خلف الستار.</p><h3 dir="rtl">أنظمة إدارة قواعد البيانات العلائقيّة</h3><p dir="rtl">لقد حصلت أنظمة إدارة قواعد البيانات العلائقيّة على اسمها من النموذج الذي تعتمد عليه، وهو النموذج العلائقيّ الذي ناقشناه أعلاه. إنّ هذه الأنظمة –الآن، وستبقى لمدة من الزمن في المستقبل– الخيار المفضّل للحفاظ على البيانات موثوقة وآمنة؛ وهي كذلك كفؤة.</p><p dir="rtl">تتطلب أنظمة إدارة قواعد البيانات العلائقيّة مخططات معرفة ومحددة جيدًا –ولا يجب أن يختلط الأمر مع تعريف PostgreSQL الخاص بهذه الأنظمة– لقبول هذه البيانات. تشكّل هذه الهيئات التي يحددها المستخدم كيفية حفظ واستخدام البيانات. إنّ هذه المخططات شبيهة جدًّا بالجداول، وفيها أعمدة تمثّل عدد ونوع المعلومات التي تنتمي لكل سجل، والصفوف التي تمثّل المدخلات.</p><p dir="rtl">من أنظمة إدارة قواعد البيانات الشائعة نذكر:</p><ul><li>SQLite: نظام إدارة قواعد بيانات علائقيّة مضمّن قويّ جدًّا.</li><li>MySQL: نظام إدارة قواعد بيانات علائقيّة الأكثر شهرة والشائع استخدامه.</li><li>PostgreSQL: أكثر نظام إدارة قواعد بيانات علائقيّة كيانيّ (objective-RDBMS) متقدم وهو متوافق مع SQL ومفتوح المصدر.</li></ul><p dir="rtl">ملاحظة: لمعرفة المزيد عن أنظمة إدارة قواعد بيانات NoSQL، راجع المقالة التالية عن الموضوع: <a rel="external nofollow" href="https://www.digitalocean.com/community/articles/a-comparison-of-nosql-database-management-systems-and-models">A Comparison Of NoSQL Database Management Systems</a>.</p><h3 dir="rtl">أنظمة قواعد بيانات NoSQL (أو NewSQL)</h3><p dir="rtl">لا تأتي أنظمة قواعد بيانات NoSQL بنموذج كالمستخدم في (أو الذي تحتاجه) الحلول العلائقيّة المهيكلة. هناك العديد من التطبيقات، وكلّ منها تعمل بطريقة مختلفة كليًّا، وتخدم احتياجات محدّدة. هذه الحلول عديمة المخططات (schema-less) إمّا تسمح تشكيلات غير محدودة للمدخلات، أو –على العكس– بسيطة جدًّا ولكنها كفؤة للغاية كمخازن قيم معتمد على المفاتيح (key based value stores) مفيدة.</p><p dir="rtl">على خلاف قواعد البيانات العلائقيّة التقليديّة، يمكن تجميع مجموعات من البينات معًا باستخدام قواعد بيانات NoSQL، كـ MongoDB مثلًا. تُبقي مخازن المستندات هذه كل قطعة من البيانات مع بعضها كمجموعة واحدة (أي كملف) في قاعدة البيانات. يمكن تمثيل هذه المستندات ككيانات بيانات منفردة، مثلها في ذلك كمثل JSON، ومع ذلك تبقى كراسات، وذلك يعتمد على خصائصها.</p><p dir="rtl">ليس لقواعد بيانات NoSQL طريقة موحدة للاستعلام عن البيانات (مثل SQL لقواعد البيانات العلائقيّة) ويقدم كلّ من الحلول طريقته الخاصّة للاستعلام.</p><p dir="rtl">ملاحظة: لمعرفة المزيد عن أنظمة إدارة قواعد البيانات العلائقيّة، ألق نظرة على هذه المقالة المتعلقة بالموضوع: <a rel="external nofollow" href="https://www.digitalocean.com/community/articles/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems">A Comparison Of Relational Database Management Systems</a>.</p><h2 dir="rtl">مقارنة بين أنظمة إدارة قواعد بيانات SQL و NoSQL</h2><p dir="rtl">من أجل الوصول إلى نتيجة بسيطة ومفهومة، لنحلّل أولًا الاختلافات بين أنظمة إدارة قواعد البيانات:</p><h3 dir="rtl">هيكلية ونوع البيانات المحتفظ بها:</h3><p dir="rtl">تتطلب قواعد البيانات العلائقيّة SQL هيكلة ذات خصائص محدّدة للحفاظ على البيانات، على خلاف قواعد بيانات NoSQL التي تسمح بعمليات انسياب حُرّ (free-flow operations).</p><h3 dir="rtl">الاستعلام:<strong> </strong></h3><p dir="rtl">وبغضّ النظر عن تراخيصها، تستخدم كلّ قواعد البيانات العلائقيّة معيار SQL إلى حدّ ما، ولهذا يمكن الاستعلام فيها بلغة SQL (أي Structured Query Language). أما قواعد بيانات NoSQL فلا تستخدم طريقة محدّدة للعمل على البيانات التي تديرها.</p><h3 dir="rtl">التحجيم: </h3><p dir="rtl">يمكن تحجيم كلي الحلين عموديًّا (أي بزيادة موارد النظام). لكن لكون حلول NoSQL تطبيقات أحدث (وأبسط)، فهذا يجعلها تقدّم وسائل أسهل بكثير لتحجيمها أفقيًّا (أي بإنشاء شبكة عنقودية cluster من أجهزة متعدّدة).</p><h3 dir="rtl">المتانة Reliability: </h3><p dir="rtl">عندما يتعلق الأمر بالمتانة والثقة الآمنة بالقَيد المنفّذ، تبقى قواعد بيانات SQL الخيار الأفضل.</p><h3 dir="rtl">الدعم: </h3><p dir="rtl">لأنظمة إدارة قواعد البيانات العلائقيّة تاريخ طويل استمر لعقود من الزمن. إنها شائعة جدًّا، ومن السهل إيجاد دعم سواء مجانيّ أو مدفوع. إذا حدثت مشكلة، فمن الأسهل حلّها عليها من قواعد بيانات NoSQL التي شاعت حديثًا، وخاصة إذا كان الحلّ موضع السؤال ذا طبيعة معقّدة (مثل MongoDB).</p><h3 dir="rtl">احتياجات حفظ واستعلام البيانات المعقدة: </h3><p dir="rtl">إنّ قواعد البيانات العلائقيّة بطبيعتها الخيار الأمثل لاحتياجات حفظ البيانات والاستعلامات المعقّدة. إنها أكثر كفاءة وتتفوق في هذا المجال.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/understanding-sql-and-nosql-databases-and-different-database-models">Understanding SQL And NoSQL Databases And Different Database Models</a>  لصاحبه O.S. Tezer.</p>
]]></description><guid isPermaLink="false">71</guid><pubDate>Sat, 04 Jul 2015 12:26:00 +0000</pubDate></item></channel></rss>
