Хелпикс

Главная

Контакты

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





Теперь рассмотрим примеры из заданий по курсовому проекту БД.



Теперь рассмотрим примеры из заданий по курсовому проекту БД.

Пример 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)

)



  

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