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

1 المقدمة


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

1.1. لمن هذه المقالة؟


ستكون هذه المقالة مفيدة لأولئك الذين يرغبون في فهم العلاقات بين جداول قاعدة البيانات. في ذلك ، حاولت أن أقول بلغة واضحة ما هو. من أجل فهم أفضل للموضوع ، أقوم بتبديل المواد النظرية مع أمثلة عملية مقدمة في شكل رسم تخطيطي واستعلام يخلق الجداول التي نحتاجها. أستخدم Microsoft SQL Server DBMS وأكتب استعلامات في T-SQL. يجب أن يعمل الرمز الذي كتبته على DBMSs الأخرى ، حيث أن الاستعلامات عالمية ولا تستخدم تركيبات معينة لـ T-SQL.

1.2. كيف يمكنك تطبيق هذه المعرفة؟


  1. ستصبح عملية إنشاء قواعد البيانات أسهل وأكثر قابلية للفهم بالنسبة لك.
  2. سيساعدك فهم العلاقات بين الجداول على فهم التطبيع بشكل أفضل ، وهو أمر مهم جدًا عند تصميم قاعدة بيانات.
  3. التعامل مع قاعدة بيانات أجنبية سيكون أسهل بكثير.
  4. في المقابلة ، سيكون هذا إضافة جيدة جدًا.

2. شكر وتقدير


تم أخذ نصيحة وانتقاد المؤلفين في الاعتبار. jobgemws، شاغرة، نمر، حمروبا.
شكرا!

3.1. كيف يتم تنظيم الاتصالات؟


يتم إنشاء الروابط باستخدام مفاتيح أجنبية.
المفتاح الخارجي هو سمة أو مجموعة من السمات التي تشير إلى المفتاح الأساسي أو فريد لجدول آخر. بمعنى آخر ، إنه شيء مثل مؤشر إلى صف في جدول آخر.

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


تنقسم الروابط إلى:

  1. الكثير للكثيرين.
  2. واحد لكثير.
    • مع اتصال إلزامي ؛
    • مع اتصال اختياري ؛
  3. واحد لواحد.
    • مع اتصال إلزامي ؛
    • مع اتصال اختياري ؛

دعونا نفكر بالتفصيل في كل منها.

4. كثير إلى كثير


تخيل أننا بحاجة إلى كتابة قاعدة بيانات سيتم تخزينها بواسطة موظف شركة تكنولوجيا المعلومات. في نفس الوقت ، هناك مجموعة قياسية معينة من المنشورات. حيث:

  • قد يكون لدى الموظف وظيفة واحدة أو أكثر. على سبيل المثال ، يمكن أن يكون موظف معين مسؤولًا ومبرمجًا.
  • الموقف قد "يملك" موظف واحد أو أكثر. على سبيل المثال ، المسؤولون هم مجموعة محددة من العمال. وبعبارة أخرى ، ينتمي بعض العمال إلى المسؤولين.

يمثل الموظفون جدول الموظفين (المعرف ، الاسم ، العمر) ، ويتم تمثيل الوظائف بجدول الموضع (المعرف واسم المنصب). كما ترى ، كلا هذين الجدولين مرتبطان وفقًا لقاعدة أطراف بأطراف: لكل موظف وظيفة واحدة أو أكثر (العديد من الوظائف) ، لكل وظيفة موظف واحد أو أكثر (العديد من الموظفين).

4.1. كيف تبني مثل هذه الجداول؟


لدينا بالفعل جدولين يصفان الموظف والمهنة. الآن نحن بحاجة إلى إقامة علاقات بين العديد والعديد. لتنفيذ مثل هذه العلاقة ، نحتاج إلى نوع من الوسيط بين جداول "الموظف" و "المنصب". في حالتنا ، سيكون هناك جدول معين "EmployeesPositions" (العمال والمناصب). يربط جدول الوساطة هذا الموظف والمنصب على النحو التالي:
هوية الموظفالمعرف
11
12
23
33
على اليسار الموظفون (هويتهم) ، على اليمين هم الوظائف (هويتهم). يُشار إلى الموظفين والمناصب في هذا الجدول باستخدام id'shniki.

يمكن مشاهدة هذا الجدول من جانبين:

  1. وبالتالي ، نقول أن الموظف ذو المعرف 1 موجود في الموضع بالمعرف 1. وفي الوقت نفسه ، انتبه إلى حقيقة أنه في هذا الجدول يكون للموظف ذو المعرف 1 وظيفتين: 1 و 2. أي أن كل موظف على اليسار يتوافق مع موقف معين على اليمين.
  2. يمكننا أيضًا أن نقول أن المشاركات ذات المعرف 3 تنتمي إلى المستخدمين بالمعرفين 2 و 3. أي أن كل موظف على اليمين لديه موظف معين على اليسار.

4.2. التنفيذ


رسم بياني


كود T-SQL
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

--   Employee .
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (1, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (2, N'Hilary White', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (3, N'Emily Brown', 22)

create table dbo.Position
(
	PositionId int primary key,
	PositionName nvarchar(64) not null
)

--   Position .
insert into dbo.Position(PositionId, PositionName) values(1, N'IT-director')
insert into dbo.Position(PositionId, PositionName) values(2, N'Programmer')
insert into dbo.Position(PositionId, PositionName) values(3, N'Engineer')

--   EmployeesPositions .
create table dbo.EmployeesPositions
(
	PositionId int foreign key references dbo.Position(PositionId),
	EmployeeId int foreign key references dbo.Employee(EmployeeId),
	primary key(PositionId, EmployeeId)
)

insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 1)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 2)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (2, 3)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (3, 3)


تفسير
foreign key primary key unique .

  • PositionId EmployeesPositions PositionId Position;
  • EmployeeId EmployeesPositions — EmployeeId Employee;


4.3. استنتاج


لتنفيذ علاقات كثير إلى كثير ، نحن بحاجة إلى وسيط بين الجدولين قيد النظر. يجب تخزين مفتاحين أجانب ، أولهما يشير إلى الجدول الأول ، والثاني إلى الثاني.

5. واحد لكثير


هذا هو الاتصال الأكثر شيوعًا بين قواعد البيانات. نحن نعتبره بعد ربط الكثيرين بالكثير للمقارنة.

لنفترض أننا بحاجة إلى تنفيذ قاعدة بيانات معينة تسجل بيانات المستخدم. المستخدم لديه: الاسم واللقب والعمر وأرقام الهواتف. علاوة على ذلك ، يمكن لكل مستخدم الحصول على رقم هاتف واحد أو أكثر (العديد من أرقام الهاتف).

في هذه الحالة ، نلاحظ ما يلي: يمكن للمستخدم الحصول على العديد من أرقام الهاتف ، ولكن لا يمكن القول أن مستخدمًا معينًا ينتمي إلى رقم الهاتف.

بمعنى آخر ، ينتمي الهاتف لمستخدم واحد فقط. يمكن للمستخدم امتلاك هاتف واحد أو أكثر (كثير).

كما نرى ، هذه العلاقة هي علاقة بين الكثير.

5.1. كيف تبني مثل هذه الجداول؟


سيتم تمثيل المستخدمين بجدول "شخص" معين (معرف ، الاسم الأول ، الاسم الأخير ، العمر) ، سيتم تمثيل أرقام الهاتف بجدول "الهاتف". سيبدو هذا:
رقم الهاتفشخصيرقم الهاتف
1511 091-10
2519124-66
31721 972-02
يمثل هذا الجدول ثلاثة أرقام هواتف. في هذه الحالة ، تنتمي أرقام الهواتف ذات المعرف 1 و 2 إلى المستخدم ذي المعرف 5. ولكن الرقم الذي يحمل المعرف 3 ينتمي إلى المستخدم بالمعرف 17.
ملاحظة . إذا كان جدول "الهواتف" يحتوي على سمات أكثر ، فسنضيفها بأمان إلى هذا الجدول.

5.2. لماذا لا نقوم بجدول وسيط هنا؟


هناك حاجة إلى جدول وسيط فقط إذا كانت لدينا علاقة بين أطراف وأطراف. لسبب بسيط يمكننا التفكير فيه من جانبين. مثل جدول EmployeesPositions سابقًا:

  1. لكل موظف عدة مناصب (كثيرة).
  2. كل منصب ينتمي إلى العديد من الموظفين (كثير).

ولكن في حالتنا ، لا يمكننا القول أن كل هاتف لديه عدة مستخدمين - يمكن لمستخدم واحد فقط أن ينتمي إلى رقم هاتف.
الآن اقرأ مرة أخرى المذكرة في نهاية الفقرة 5.1. - ستصبح مفهومة أكثر بالنسبة لك.

5.3. التنفيذ


رسم بياني


كود T-SQL
create table dbo.Person
(
	PersonId int primary key,
	FirstName nvarchar(64) not null,
	LastName nvarchar(64) not null,
	PersonAge int not null
)

insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (5, N'John', N'Doe', 25)
insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (17, N'Izabella', N'MacMillan', 19)

create table dbo.Phone
(
	PhoneId int primary key,
	PersonId int foreign key references dbo.Person(PersonId),
	PhoneNumber varchar(64) not null
)

insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (1, 5, '11 091-10')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (2, 5, '19 124-66')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (3, 17, '21 972-02')


تفسير
Phone . ( Person). , : « ». , id .

6. واحد لواحد


تخيل أنه في العمل تم تكليفك بمهمة كتابة قاعدة بيانات لتسجيل جميع الموظفين للموارد البشرية. وأكد المدير أن الشركة بحاجة إلى معرفة اسم الموظف وعمره ورقم هاتفه فقط. لقد طورت قاعدة بيانات كهذه ووضعت فيها جميع موظفي الشركة البالغ عددهم 1000 موظف. ثم يقول المدير أنه لسبب ما يحتاجون إلى معرفة ما إذا كان الموظف معوقًا أم لا. إن أبسط شيء يتبادر إلى الذهن هو إضافة عمود منطقي جديد إلى جدولك. لكن إدخال قيم 1000 طويل جدًا ، وصحيح أنك ستدخل عددًا أقل بكثير من الخطأ (سيكون 2٪ صحيحًا ، على سبيل المثال).

الحل الأسهل هو إنشاء جدول جديد ، فلنطلق عليه "DisabledEmployee". سيبدو هذا:
DisabledPersonIdهوية الموظف
1159
2722
3937
لكن هذه ليست علاقة رأس برأس. والحقيقة هي أنه في مثل هذا الجدول يمكن إدخال الموظف أكثر من مرة ؛ وبناءً على ذلك ، تلقينا علاقة رأس بأطراف: يمكن تعطيل الموظف عدة مرات. من الضروري التأكد من أنه يمكن إدخال الموظف في الجدول مرة واحدة فقط ، على التوالي ، يمكن تعطيله مرة واحدة فقط. للقيام بذلك ، نحتاج إلى الإشارة إلى أن عمود EmployeeId يمكنه تخزين القيم الفريدة فقط. نحن بحاجة فقط لفرض قيود فريدة على عمود EmloyeeId. يشير هذا التقييد إلى أن السمة يمكن أن تأخذ قيمًا فريدة فقط .

من خلال القيام بذلك ، حصلنا على علاقة واحد لواحد.

المذكرة. لاحظ أنه يمكننا أيضًا فرض قيد رئيسي على السمة EmloyeeId. وهو يختلف عن القيد الفريد فقط في أنه لا يمكن أن يكون فارغًا.

6.1. استنتاج


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

6.2. التنفيذ


رسم بياني


كود T-SQL
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (159, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (722, N'Hilary White', 29)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (937, N'Emily Brown', 19)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (100, N'Frederic Miller', 16)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (99, N'Henry Lorens', 20)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (189, N'Bob Red', 25)

create table dbo.DisabledEmployee
(
	DisabledPersonId int primary key,
	EmployeeId int unique foreign key references dbo.Employee(EmployeeId)
)

insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (1, 159)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (2, 722)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (3, 937)


تفسير
DisabledEmployee EmployeeId, . EmployeeId Employee. , unique, , . , .

7. الاتصالات الإلزامية والاختيارية


يمكن تقسيم العلاقات إلى إلزامية واختيارية.

7.1. واحد لكثير


  1. واحد لكثير مع اتصال إلزامي:
    العديد من الجنود ينتمون إلى فوج واحد. مقاتل واحد ينتمي إلى فوج واحد فقط. يرجى ملاحظة أن أي جندي ينتمي بالضرورة إلى فوج واحد ، والفوج لا يمكن أن يوجد بدون جنود.
  2. واحد لكثير مع اتصال اختياري:
    يعيش جميع الناس على كوكب الأرض. الجميع يعيش فقط على الأرض. علاوة على ذلك ، يمكن أن يوجد كوكب بدون الإنسانية. وبالتالي ، فإن العثور علينا على الأرض أمر اختياري

يمكن اعتبار نفس العلاقة إلزامية واختيارية. تأمل هذا المثال:
يمكن أن تنجب أم بيولوجية العديد من الأطفال. الطفل لديه أم بيولوجية واحدة فقط.
أ) ليس لدى المرأة بالضرورة أطفالها. وفقا لذلك ، التواصل اختياري.
ب) أن يكون للطفل بالضرورة أم بيولوجية واحدة - في هذه الحالة ، يلزم الاتصال.

7.2. واحد لواحد


  1. واحد لواحد مع اتصال إلزامي:
    يجب أن يكون لدى مواطن واحد في دولة معينة جواز سفر واحد فقط لذلك البلد. جواز سفر واحد لديه حامل واحد فقط.
  2. واحد لواحد مع ارتباط اختياري:
    يمكن لدولة واحدة أن يكون لها دستور واحد فقط. دستور واحد ينتمي إلى دولة واحدة فقط. لكن الدستور غير ملزم. قد تمتلك الدولة أو لا تمتلكها ، على سبيل المثال ، إسرائيل وبريطانيا العظمى.

يمكن اعتبار نفس الاتصال إلزاميًا واختياريًا:
يمكن لشخص واحد أن يكون لديه جواز سفر واحد فقط. جواز سفر واحد لديه مالك واحد فقط.
أ) وجود جواز سفر اختياري - لا يجوز للمواطن الحصول عليه. هذا رابط اختياري.
ب) يجب أن يكون لجواز السفر مالك واحد فقط. في هذه الحالة ، هذا اتصال إلزامي بالفعل.

7.3. الكثير للكثيرين


أي علاقة بأطراف كثيرة اختيارية. على سبيل المثال:
يمكن للشخص الاستثمار في أسهم شركات مختلفة (كثيرة). بعض المستثمرين في الشركة هم أشخاص معينون (كثيرون).
أ) لا يجوز للشخص استثمار أمواله في الأسهم على الإطلاق.
ب) لا أحد يستطيع شراء أسهم الشركة.

8. كيف تقرأ الرسوم البيانية؟


أعلاه ، قدمت رسومات بيانية للجداول التي أنشأناها. ولكن من أجل فهمها ، تحتاج إلى معرفة كيفية "قراءتها". سوف نفهم ذلك باستخدام مثال الرسم البياني من الفقرة 5.3.



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

  1. بالقرب من الطاولة ، يوجد مفتاح ذهبي. يدل على كلمة "واحد".
  2. توجد علامة اللانهاية بالقرب من طاولة الهاتف. يدل على كلمة "كثير".

9. الملخص


  1. الصلات هي:
    • الكثير للكثيرين.
    • واحد لكثير.
      1) بالتواصل الإلزامي ؛
      2) برابط اختياري.
    • واحد لواحد.
      1) بالتواصل الإلزامي ؛
      2) برابط اختياري.
  2. يتم تنظيم الاتصالات باستخدام مفاتيح أجنبية.
  3. المفتاح الخارجي هو سمة أو مجموعة من السمات التي تشير إلى المفتاح الأساسي أو فريد لجدول آخر. بمعنى آخر ، إنه شيء مثل مؤشر إلى صف في جدول آخر.

10. الأهداف


لتحسين استيعاب المواد ، أقترح عليك حل المشكلات التالية:

  1. : id, , , , . , , , .
  2. : id, , , . , .
  3. : , , ,
    • : id, , .
    • : id, .

    , — . , .
  4. 6.2. - , DisabledEmployee.

All Articles