Відношення один-ко-багатьом в базі даних виникає, коли кожен запис в таблиці A може мати багато пов'язаних записів в таблиці B, але кожен запис в таблиці B може мати тільки один відповідний запис в таблиці A. Відношення один-ко-багатьом в база даних є найбільш поширеним реляційним дизайном бази даних і лежить в основі хорошого дизайну.
Що якщо Кармен викладає два або більше курсів? У нас є два варіанти з цим дизайном. Ми могли б просто додати його до існуючого запису Кармен, наприклад так:
Наведений вище дизайн, однак, є негнучким і може призвести до проблем пізніше при спробі вставити, редагувати або видалити дані. Це ускладнює пошук даних. Цей дизайн порушує перший принцип нормалізації бази даних, First Normal Form (1NF), який свідчить, що кожна комірка таблиці повинна містити один, окремий фрагмент даних.
Іншою альтернативою дизайну може бути додавання другого запису для Кармен:
Це відповідає 1NF, але все ще поганий дизайн бази даних, тому що він вводить надлишковість і може надміру роздмухувати дуже велику базу даних. Що ще більш важливо, дані можуть стати суперечливими. Наприклад, що якщо ім'я Кармен змінилося? Хтось, який працює з даними, може оновити своє ім'я в одному записі і не зможе оновити його в другому записі. Цей дизайн порушує другу нормальну форму (2NF), яка відповідає 1NF і повинна також уникати надлишковості декількох записів, поділяючи підмножини даних у кілька таблиць і створюючи відносини між ними.
Як створити базу даних з відносинами «один до багатьох»
Щоб реалізувати ставлення «один до багатьох» у таблиці «Викладачі та курси», ми розбиваємо таблиці на дві частини і пов'язуємо їх за допомогою зовнішнього ключа.
Тут ми видалили стовпець «Курс» у таблиці «Вчителя»:
А ось і таблиця курсів. Зверніть увагу, що його зовнішній ключ, Teacher_ID, пов'язує курс з учителем у таблиці Teachers:
Ми розробили відносини між вчителями і таблицею курсів з використанням зовнішнього ключа. Це говорить нам про те, що і Біологія, і математика викладаються Кармен, а Хорхе викладає англійську.
Ми можемо бачити, як цей дизайн дозволяє уникнути будь-яких можливих звільнень, дозволяє окремим вчителям викладати кілька курсів і реалізує відносини один до багатьох.
Бази даних також можуть реалізовувати відносини один-до-одного і відносини багато-ко-багатьом.
