Хелпикс

Главная

Контакты

Случайная статья





О межтабличных связях и нормализации.



Как показывают занятия по курсовому проекту БД, слишком у многих слишком много недоразумений с оформлением межтабличных связей, а это предвещает массовые серьёзные проблемы по одному из обязательных вопросов экзамена (привести БД к 3НФ, нарисовать для неё ER-диаграмму и описать её на SQL).

Для начала рассмотрим небольшой бытовой пример. Имеем две таблицы «Преподаватели по курсовому проекту по базам данных» и «Студенты».

¨ Прежде всего, разберемся в связи между этими таблицами, она такая:

потому что:

§ каждый студент прикрепляется к одному преподавателю,

§ а к каждому преподавателю прикрепляется обычно несколько студентов.

Отметим, что в такой связи (один ко многим):

§ Таблица «Преподаватели» - называется родительской,

§ а таблица «Студенты» - дочерней.

А также отметим, что межтабличная связь описывается при дочерней таблице.

¨ Преподавателя (будем считать) можно идентифицировать фамилией, объявим ФИОП – первичным ключом в таблице «Преподаватели». А студента – тоже (будем считать, можно идентифицировать) фамилией, ФИОС – объявим первичным ключом в таблице «Студенты».

¨ Теперь рассмотрим эту связь в бытовом представлении таблиц (как документов):

Преподаватели               Студенты

ФИОП ...     ФИОС ... ФИОПКП
Самитов   ·   Студ1    
Преп1     Студ2    
...       ...    
...       ...    
...       ...    
...       ...    

Подчеркнутые поля входят в состав (одного, но возможно составного) первичного ключа таблицы.

§ Я (преподаватель) не могу показать на всех своих студентов, их много, понадобится список студентов – по одной колонке в таблице «Преподаватели» на каждого (моего) студента...

§ А каждый студент может показать на своего преподавателя (по курсовому проекту БД) – для этого достаточно объявить одно поле ФИОПКП в таблице «Студенты». Это поле в этой (дочерней) таблице и будем использовать, как поле (простого) FOREIGN-ключа, показывающего на (простой) PRIMARY-ключ (родительской) таблицы «Преподаватели».


 

ФИОП ...     ФИОС ... ФИОПКП
Самитов       Студ1    
Преп1     Студ2   Самитов
...       ...   ·Самитов
...       ...   Самитов
...       ...    
...       ...    

Итого:

CREATE TABLE Преподаватели (

ФИОП CHAR(20) NOT NULL PRIMARY KEY, ... )

CREATE TABLE Студенты (

ФИОС CHAR(20) NOT NULL PRIMARY KEY,

ФИОПКП CHAR(20) REFERENCES Преподаватели,

 ... )

Причем, PRIMARY KEY таблицы «Студенты» не используется в рассмотренной межтабличной связи, и в этом примере нет необходимости объявлять PRIMARY KEY для таблицы «Студенты» (она ни для кого не является родительской, на неё никто не показывает однозначно). Но для других целей этот первичный ключ может оказаться полезным или даже необходимым. Например нехорошо, если в таблице «Студенты» начнут появляться однофамильцы. Объявленный PRIMARY KEY не допустит такого, а значит предупредит, что фамилию однофамильцев необходимо уточнить, например инициалами имени-отчества).



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.