Отношения "един към много" в база данни

Отношението "един към много" в базата данни се получава, когато всеки запис в таблица А може да има много свързани записи в таблица Б, но всеки запис в таблица Б може да има само един съответен запис в таблица А. Връзката "едно към много" в базата данни е най-разпространеният дизайн на релационни бази данни и е в основата на добрия дизайн.

Помислете за връзката между учител и курсовете, които преподават. Учителят може да преподава няколко курса, но курсът няма да има същата връзка с учителя.

Следователно, за всеки запис в таблицата "Учители" може да има много записи в таблицата "Курсове". Това е връзка "един към много": един учител на няколко курса.

Защо установяването на връзка "един към много" е важно

За да представлявате връзка "един към много", трябва да имате поне две таблици. Да видим защо.

Вероятно създадохме таблица "Учители", в която искахме да запишем името и курсовете, които преподавахме. Можем да го проектираме така:

Учители и курсове
Teacher_ID TEACHER_NAME курс
Teacher_001 Кармен Биология
Teacher_002 вероника Math
Teacher_003 Хорхе Английски

Ами ако Кармен учи две или повече курсове? Имаме две възможности с този дизайн. Можем просто да го добавим към съществуващия запис на Кармен, както следва:

Учители и курсове
Teacher_ID Учителка курс
Teacher_001 Кармен Биология, Математика
Teacher_002 вероника Math
Teacher_003 Хорхе Английски

Дизайнът по-горе обаче е негъвкав и може да доведе до проблеми по-късно, когато се опитвате да вмъквате, редактирате или изтривате данни.

Това затруднява търсенето на данни. Този проект нарушава първия принцип на нормализиране на базата данни, First Normal Form (1NF) , който гласи, че всяка клетка на таблицата трябва да съдържа отделно отделно количество данни.

Друга алтернатива може да бъде просто да добавите втори запис за Carmen:

Учители и курсове
Учителят _ID Учителка курс
Teacher_001 Кармен Биология
Teacher_001 Кармен Math
Teacher_002 вероника Math
Teacher_003 Хорхе Английски

Това се придържа към 1NF, но все още е слаб дизайн на базата данни, тъй като той въвежда съкращения и може да издуха много голяма база данни ненужно. По-важното е, че данните могат да станат непоследователни. Например, какво ще стане, ако името на Кармен се промени? Някой, който работи с данните, може да актуализира името си в един запис и да не го актуализира във втория запис. Този проект нарушава втората нормална форма (2NF), която се придържа към 1NF и също трябва да избягва съкращенията на множество записи, като разделя подмножествата данни на множество таблици и създава взаимоотношения между тях.

Как да създадем база данни с отношения от един към много

За да приложим връзка "един към много" в таблицата "Учители и курсове", разделяме масите на две и ги свързваме с чужд ключ .

Тук премахнахме графата "Курс" в таблицата "Учители":

учители
Учителят _ID Учителка
Teacher_001 Кармен
Teacher_002 вероника
Teacher_003 Хорхе

И тук е таблицата за курсове. Обърнете внимание, че неговият чужд ключ, Teacher_ID, свързва курс с учител в таблицата "Учители":

курсове
Course_ID COURSE_NAME Teacher_ID
Course_001 Биология Teacher_001
Course_002 Math Teacher_001
Course_003 Английски Teacher_003

Разработихме връзка между таблицата "Учители и курсове" с помощта на чужд ключ.

Това ни казва, че както Биология, така и Математика се преподава от Кармен и че Хорхе преподава английски.

Можем да видим как този проект избягва всякакви възможни съкращения, позволява на отделните учители да преподават няколко курса и изпълнява взаимоотношения един към много.

Базите данни могат да осъществят и взаимоотношения "един към един" и "много към много".