3. Часто встречающиеся вопросы при проектировании БД.
Posted by rootТипы связей между таблицами
Обычно таблицы связывают, используя три типа связи: один к одному, один ко многим, многие ко многим. Связь устанавливается между двумя полями пары таблиц, называемых ключевыми, или как еще говорят – делают связь по ключу. При этом поля, участвующие в связи, должны иметь один тип данных: числовое – числовое, текстовое – текстовое.
В паре таблиц, участвующих в связи, возможны два варианта свойств этих полей:
- одно поле должно быть уникальным в своей таблице, а другое – нет
- оба поля должны быть уникальными
Чаще всего для создания уникального ключевого поля используют тип «счетчик», так как он автоматически создает уникальный код. В противном случае, если использовать другой тип поля, придется создавать процедуры, генерирующие его уникальное значение.
Один к одному
Такая связь означает, что на одну запись в главной таблице приходится так же одна запись в связанной. Разнесения данных по разным таблицам и связывания их потом такой связью обычно делают, когда хранить все данные в одной таблице по каким то причинам (но не в плане нормализации) не целесообразно. То есть, проще говоря – таблицу просто разделил на две (или больше) и связали их такой связью, например, потому, что количество полей в таблице очень велико и удобнее разбить их на группы и держать в разных таблицах.
Используется такая связь обычно редко. Пример связи один к одному:
Обозначение 1
Код записи
Текст 1
1
Текст 2
2
Текст 3
3
Код записи
Обозначение 2
1
Текст 4
2
Текст 5
3
Текст 6
Как видим, это то же самое, как если бы данные были в одной таблице
Код записи
Обозначение 1
Обозначение 2
1
Текст 1
Текст 4
2
Текст 2
Текст 5
3
Текст 3
Текст 6
При этом, оба ключевых поля в своих таблицах уникальны – это могут быть к примеру поля типа «Счетчик».
Один ко многим
Это самый распространенный тип связи, означающий, что на одну запись в главной таблице приходится множество записей в подчиненной. Для организации этого нужно, чтобы ключевое поле связи в главной таблице было уникальным (например, тип «счетчик»), а соответствующее поле связи в подчиненной – не уникальным, но того же типа (числовое). В результате получаем одну запись в главной таблице и множество записей связанных с ней по ее коду в подчиненной.
Обозначение 1
Код записи
Текст 1
1
Текст 2
2
Текст 3
3
Код связи
Код записи
Обозначение 2
1
1
Текст 4
1
2
Текст 5
1
3
Текст 6
2
4
Текст 7
2
5
Текст 8
2
6
Текст 9
Как видим во второй таблице два ключа:
код записи – внутренний ключ таблицы, уникальный для каждой записи этой таблицы
код связи – внешний ключ для связи с главной таблицей, не уникальный (допускающий повторения).
Таблицы в схеме данных и в запросах связываются по полям: код записи (в главной) и код связи (в подчиненной).
Пример такой связи из реальности: таблица учителя и таблица ученики – один учитель и много учеников.Многие ко многим
Внимательный читатель наверняка скажет: а как быть с вариантом, когда у одного учителя много учеников, и в то же время один и тот же ученик учится у разных преподавателей?
Все верно – и такую связь так и называют: многие ко многим. Но для ее реализации потребуется уже три таблицы: учителя, ученики и коммутирующая таблица.
Смысл третье таблицы – задавать соотношения между ключами первых двух. Представьте железнодорожный узел, где переключаются ветки, перенаправляя поезда с одной дороги на другую. Или Switch, который делает то же самое с компьютерами, подключенными через него в сеть.
ФИО учителя
Код учителя
Иванов
1
Петров
2
Код ученика
ФИО ученика
1
Сидоров
2
Павлов
Код учителя
Код ученика
1
1
1
2
2
1
2
2
Как видим, таблицы учеников и учителей связаны между собой не напрямую, а чрез таблицу - коммутатор, в которой задается, какой код учителя соответствует какому ученику. Такой тип связи очень широко распространен, так как описывает реальные непростые жизненные отношения.