Связи между таблицами

Связи между таблицами отражают связи между объектами описываемой предметной области. По канонам теории реляционных баз данных эти связи должны осуществляться только на основе значений общих столбцов.

Замечание.

Согласно нулевому правилу, сформулированному Е.Ф. Коддом любая система управления реляционной базой данных, должна управлять этой базой данных, опираясь только на ее реляционные свойства.  Из этого правила и вытекает принцип  осуществления связей между таблицами.

И так механизм реализации связей между таблицами основан на совпадающих столбцах. В зависимости от того, как множество записей одной таблицы отображается во множество записей другой таблицы можно выделить четыре типа связей. Можно, таким образом,  говорить о классификации по способу отображения. 

Один к одному

Данный вид связи предполагает,  что каждая запись в обеих таблицах  может быть связана не более чем с одной записью в другой таблице. Важно отметить, что не все записи обеих таблиц  могут участвовать в связи. Если, однако, вы имеете случай, когда в таблицах все строки связаны, то есть серьезный повод подумать об объединении обеих таблиц.  Скорее всего, разъединение было искусственным.  Такое объединение называется композицией.  Заметим, что такая операция является обратимой – мы сохраняем всю информацию, имея которую можно проделать и обратную операцию (декомпозицию), и возвратить нашу базу в исходное состояние.  

Рассмотрим следующий пример. На Рис. 1.2 представлены две, связанных друг с другом таблицы.  В Таблице A  (см. рис.1.2) хранятся фамилии (поле FAM), имена (поле IMJA) и отчества (поле OTCH) некоторых людей.  В правой таблице (Таблица B) представлены индивидуальные номера тех же людей: индивидуальный номер налогоплательщика (поле INN), номер паспорта (поле N_PASPORT), страховой номер  (поле N_STRAH). Очевидно, и не требует доказательств, что связь между этими двумя таблицами  относится к типу связи «один к одному». Предположив, что в левой таблице (Таблица A) содержится информация только о совершеннолетних гражданах России, мы получим, что каждая запись левой таблицы связана с одной записью таблицы B. Мы имеем как раз тот случай, о котором мы говорили выше, при котором обе таблицы могут быть легко объединены.  Если бы в левой таблице были записи, не имеющие связанных с ними записей в правой таблице, то в результате объединения мы получили бы не совсем удобную для работы таблицу. В такой таблице в некоторых строках поля INN, N_PASPORT, N_STRAH не были бы заполнены (не плохое, впрочем, применение для  значения NULL).

Связь между таблицами A и B осуществляется по столбцу (IDD). Данный столбец не имеет никакого отношения к рассматриваемой предметной области, но является первичным ключом, т.е. уникален для обеих таблиц.  Все выглядит так,  будто мы присваиваем человеку еще один идентификатор, правда, без его ведома  и лишь в нашей базе данных. Обратите внимание, как на рисунке мы обозначили связь «один к одному» - . Данный знак симметричен и подчеркивает формальное равноправие обоих участвующих в связи таблиц.

Еще одним важным моментом, при рассмотрении связи между таблицами, является вопрос о равноправии таблиц.  На данный вопрос можно ответить только исходя из конкретной предметной области. В рассматриваемом случае налицо иерархичность связи. Действительно, по смыслу левая таблица определяет  человека, а правая лишь некоторые его идентификаторы.

Замечание.

Конечно, в последнем утверждении с формальной точки зрения имеется некоторая натянутость, но я  апеллирую в данном случае к  традиционному представлению о человеке, в котором его имя является частью его «Я».

Рис. 1.2. Пример связи «один к одному»

И так в нашем примере связь осуществлялась на основе общего первичного ключа. Но представим себе, что записи одной из таблиц, участвующих в связи «один к одному», могут  не быть связанными с записями другой таблицы. Связь на основе общего первичного ключа в данном случае не возможна. В таких ситуациях связь можно осуществить на основе первичного ключа той таблицы, в которой имеются свободные от связи строки. Во второй таблице связь будет основываться на внешнем ключе (Foreign Key), значение которого будет совпадать со значениями первичного ключа. Главной в этой парной связи будет первая таблица, т.е. таблица, чей первичный ключ участвует в связи.

Особо следует выделить случай, когда в связи  «один к одному» допускается участие не всех записей обеих таблиц.  Осуществляя связь на основе первичного ключа одной из таблиц, мы получим ситуацию, когда некоторым значения внешнего ключа второй таблицы должны быть равны  NULL.  Если исключить  возможность использования NULL для значений внешнего ключа, то для реализации связи  потребуется добавить третью таблицу, состоящую из первичных ключей первой и второй таблицы.

 

Hosted by uCoz