|
|||
Теперь рассмотрим примеры из заданий по курсовому проекту БД.Теперь рассмотрим примеры из заданий по курсовому проекту БД. Пример 1. «ИСПОЛНИТЕЛЬ» получил заказ - спроектировать базу данных для «Бюро технической инвентаризации». В результате разговоров с сотрудниками «ЗАКАЗЧИКА» он собрал следующую информацию: О межтабличных связях. Вариант 11. PDF «ИСПОЛНИТЕЛЬ» предложил такую базу данных (некоторые поля таблиц опущены):
То, что в этой диаграмме «не всё в порядке» очевидно следует уже из того, что её таблицы совсем не имеют общих полей, не то что бы общих по наименованию, а общих по смыслу. А потому возникает вопрос – а как же они связываются между собой? Видимо «ИСПОЛНИТЕЛЬ» что-то оставил «у себя в голове», а диаграмма для того и нужна, чтобы устранить двусмысленность проектного описания базы данных, по возможности избегая совсем уж формальных описаний, типа create table и т. д. ¨ Межтабличные связи диаграммы соответствуют естественным нашим представлениям – действительно в каждом «Домовладении» может быть несколько «Сооружений», а в каждом «Сооружении» - несколько «Помещений». С другой стороны, каждое конкретное «Помещение» может входить в состав только одного «Сооружения» и аналогично для «Сооружений» - «Домовладений». ¨ Теперь поговорим о первичных ключах (PRIMARY KEY) таблиц, все поля (возможно составного) первичного ключа перечисляются над внутренней чертой таблицы, а прочие (зависимые от этого ключа) поля – ниже этой черты. v Для таблицы «Домовладение» - Уникальный номер домовладения (Number) представляется естественным первичным ключом. v Для таблицы «Сооружение» - Номер сооружения (Letter), уже совсем не представляется естественным. Скорее всего, сооружения разных домовладений нумеруются независимо, для каждого домовладения – начиная от единицы (например). Если локальный «Номер сооружения» уточнить ключом родителя «Уникальный номер домовладения», то пара «Уникальный номер домовладения, Номер сооружения» - будет естественным первичным ключом таблицы «Сооружение». v Аналогичная ситуация и с предложенным в диаграмме первичным ключом для таблицы «Помещение» - при большом желании, можно конечно перенумеровать все квартиры во всех домах на всех улицах Казани единой сквозной нумерацией, но так не принято – потому что такую нумерацию трудно поддерживать. А потому естественный первичный ключ таблицы «Помещение» - тройка «Уникальный номер домовладения, Номер сооружения, Номер помещения». Отметим, что для описания межтабличных связей этой базы данных первичный ключ таблицы «Помещение» не потребуется. ¨ Теперь поговорим о ключах межтабличных связей (FOREIGN KEY), список полей (возможно составного) ключа межтабличных связей обычно удобно указывать на стрелке межтабличной связи. v «Домовладение» < -> > «Сооружение». Letter – написанное на этой связи, не получается никак вразумительно трактовать. § Такое имя поля объявлено только в таблице «Сооружение», но эта (дочерняя) таблица не может значением этого поля показать на родителя «Домовладение». У этого родителя нет идентифицирующих (уникальных) ключей, подходящих по смыслу на значение поля Letter (Номер сооружения). § Родитель «Домовладение» тем более не может полем Letter показать на «Сооружение» - во-первых, у него нет такого поля, а во-вторых, в конкретном Домовладении много конкретных Сооружений, ему придется их перечислять списком, а полей с таким возможным значением у него тоже не объявлено. В межтабличной связи строки дочерней таблицы должны однозначно показывать на строки родительской, каждая – на одну свою, но некоторые (братья, сестры) могут показывать на одну и туже. А потому, таблица «Сооружение» должна содержать поле «Уникальный номер домовладения моего родителя», значением которого каждая конкретная строка покажет на строку своего конкретного родителя. Если имена полей ключа связи различаются у родительской и дочерней таблиц, то на связи обычно пишут (Уникальный номер домовладения моего родителя) ® (Уникальный номер домовладения), а если эти имена одинаковые – пишут просто (Уникальный номер домовладения), или (Number). v «Сооружение» < -> > «Помещение». Здесь ситуация аналогичная, но надо ещё помнить, что у родителя «Сооружение» составной первичный ключ. Получается на связи надо писать - (Уникальный номер домовладения моего деда, Номер сооружения моего родителя) ® (Уникальный номер домовладения, Номер сооружения), и надо добавить в таблицу «Помещение» поля составного FOREIGN-ключа: Уникальный номер домовладения моего деда, Номер сооружения моего родителя. В итоге получим диаграмму: Обратите внимание, что пометка FK может означать не более чем – это поле входит в состав какого-нибудь FOREIGN-ключа. Попытки расширить смысл этой пометки приводят к двусмысленности (если не расширять синтаксис таких пометок). Ещё более это очевидно (и запутаннее), если у дочерней таблицы несколько родительских. А вот вышеописанные соглашения о надписях – достаточно однозначны, надпись всегда говорит – такой FOREIGN-ключ дочерней таблицы показывает на такой PRIMARY-ключ родительской таблицы. Хотя конечно есть и варианты - на такой же PRIMARY-ключ родительской таблицы, или на такой UNIQ-ключ родительской таблицы... А описание базы данных может быть таким: CREATE TABLE Домовладение ( Number INTEGER NOT NULL PRIMARY KEY, ... )
CREATE TABLE Сооружение ( Number INTEGER NOT NULL REFERENCES Домовладение, Letter INTEGER NOT NULL, ... Этажность INTEGER, PRIMARY KEY(Number, Letter)) CREATE TABLE Помещение ( Number INTEGER, Letter INTEGER, NumberSign INTEGER, ... Этаж INTEGER, FOREIGN KEY(Number, Letter) REFERENCES Сооружение) А может быть например и таким: CREATE TABLE Домовладение ( Number INTEGER NOT NULL PRIMARY KEY, ... ) CREATE TABLE Сооружение ( Уникальный_номер_домовладения_моего_родителя INTEGER NOT NULL REFERENCES Домовладение, Letter INTEGER NOT NULL, ... Этажность INTEGER, PRIMARY KEY (Уникальный_номер_домовладения_моего_родителя, Letter) ) CREATE TABLE Помещение ( Уникальный_номер_домовладения_моего_деда INTEGER, Номер_сооружения_моего_родителя INTEGER, NumberSign INTEGER, ... Этаж INTEGER, FOREIGN KEY (Уникальный_номер_домовладения_моего_деда, Номер_сооружения_моего_родителя) REFERENCES Сооружение (Уникальный_номер_домовладения_моего_родителя, Letter) )
|
|||
|