Отношението "един към много" в базата данни се получава, когато всеки запис в таблица А може да има много свързани записи в таблица Б, но всеки запис в таблица Б може да има само един съответен запис в таблица А. Връзката "едно към много" в базата данни е най-разпространеният дизайн на релационни бази данни и е в основата на добрия дизайн.
Помислете за връзката между учител и курсовете, които преподават. Учителят може да преподава няколко курса, но курсът няма да има същата връзка с учителя.
Следователно, за всеки запис в таблицата "Учители" може да има много записи в таблицата "Курсове". Това е връзка "един към много": един учител на няколко курса.
Защо установяването на връзка "един към много" е важно
За да представлявате връзка "един към много", трябва да имате поне две таблици. Да видим защо.
Вероятно създадохме таблица "Учители", в която искахме да запишем името и курсовете, които преподавахме. Можем да го проектираме така:
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 |
Разработихме връзка между таблицата "Учители и курсове" с помощта на чужд ключ.
Това ни казва, че както Биология, така и Математика се преподава от Кармен и че Хорхе преподава английски.
Можем да видим как този проект избягва всякакви възможни съкращения, позволява на отделните учители да преподават няколко курса и изпълнява взаимоотношения един към много.
Базите данни могат да осъществят и взаимоотношения "един към един" и "много към много".