А. В. Брешенков Проектирование баз данных на основе информации табличного вида Допущено в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки диплом

Вид материалаДиплом

Содержание


Упражнения и вопросы для самоконтроля
6. ВЫЯВЛЕНИЕ И ФОРМИРОВАНИЕ СВЯЗЕЙ МЕЖДУ ЗАПОЛНЕННЫМИ ТАБЛИЦАМИ 6.1. Выявление и формирование связей один - к одному
Подобный материал:
1   ...   14   15   16   17   18   19   20   21   ...   28

Упражнения и вопросы для самоконтроля




  1. Сформулируйте задачу назначения ключевых полей в заполненных реляционных таблицах.



  1. Опишите алгоритм назначения ключевых полей в заполненных реляционных таблицах.
  2. Как реализовать данный алгоритм на основе визуального анализа таблиц и существующих средств СУБД?



6. ВЫЯВЛЕНИЕ И ФОРМИРОВАНИЕ СВЯЗЕЙ МЕЖДУ ЗАПОЛНЕННЫМИ ТАБЛИЦАМИ




6.1. Выявление и формирование связей один - к одному




Каждая таблица может быть связана с несколькими другими таблицами. Причем эти связи могут быть различных типов. Но каждая связь объединяет две таблицы, поэтому оправданно для разработки алгоритмов выявления связей между таблицами использовать два отношения. В связи с этим рассматриваются два отношения R1 и R2.

R1 = (A1, …, Ai, …, An)

R2 = (B1, …, Bj, …, B k),

где A1, …, Ai, …, An - множество атрибутов R1;

B1, …, Bj, …, B k - множество атрибутов R2;

В общем виде отношения R1 и R2 представлены в табл. 6.1.1 и табл. 6.1.2.


Т а б л и ц а 6.1.1 Т а б л и ц а 6.1.2

A1

A2



An




B1

B2



B k

a11

a12



a1n

b11

b12



b1k

a21

a22



a2n

b21

b22



b2k


















am1

am2



amn

bq1

bq2



bqk


A1 – атрибут с первичными ключами отношения R1.

B1 – атрибут с первичными ключами отношения R2.

Z (A i) = (a1i, … , a2i, … , ami ) – множество значений атрибута Аi;

Z (Bj) = (b1j, … , b2j, … , bqj) – множество значений атрибута Bj;

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

Формализованное условие наличия связи один - к одному выглядит следующим образом.

Пусть m ≥ q и для каждого bpj найдется такое ari, причем только одно, что bpj = ari;

p = 1,q; j = 1,k;

r = 1,m; i = 1,n.

Тогда между отношениями А и В имеется связь 1:1.

И наоборот.

Пусть q ≥ m и для каждого ari найдется такое bpj, причем только одно, что ari = bpj;

p = 1,q; j = 1,k;

r = 1,m; i = 1,n;

Тогда между отношениями А и В имеется связь 1:1.

Формальные условия наличия связи один - к одному выглядят следующим образом.

( bpj) (Z (Bj)  bpj) (Eari) (Z (Ai)  ari) (bpj = ari)  ( Eati)(Z(Ai)  ati) (bpj = ati),

p = 1,q; j = 1,k;

r = 1,m; i = 1,n;

t = 1,m;

q ≥ m.

(ari) (Z (Ai)  ari) (Ebpj) (Z (Bj)  bpj) (ari = bpj)  ( Ebtj )(Z(Bj)  btj) (ari = btj),

p = 1,q; j = 1,k;

r = 1,m; i = 1,n;

t = 1,q;

m ≥ q.

Другими словами для каждого значения ключевого атрибута одного отношения найдется равное ему одно и только одно значение ключевого атрибута другого отношения.

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


CNT = 0

IF q >= m THEN

GOTO П1

ELSE

GOTO П2

END IF

П1: FOR j = 1 TO k

FOR p = 1 TO q

CNT = 0

FOR i = 1 TO n

FOR r = 1 TO m

IF bpj = ari THEN

CNT = CNT + 1

JZ = j

IZ = i

END IF

FOR i1 = i + 1 TO n

IF bpj = ari1 THEN GOTO П4

NEXT i1

NEXT r

NEXT i

NEXT p

NEXT j

IF CNT = q THEN

GOTO П3

ELSE

GOTO П4

END IF

П2: FOR i = 1 TO n

FOR r = 1 TO m

CNT = 0

FOR j = 1 TO k

FOR p = 1 TO q

IF ari = bpj THEN

СNT = СNT +1

JZ = j

IZ = i

END IF

FOR j1 = j + 1 TO n

IF ari = bpj1 THEN GOTO П4

NEXT i1

NEXT p

NEXT j

NEXT r

NEXT i

IF CNT = m THEN

GOTO П3

ELSE

GOTO П4

END IF

П3: PRINT (' Обнаружены связи 1:1, столбцы ',IZ,JZ)

EXIT

П4: PRINT (' Cвязей 1:1 не обнаружено ')


Поясним работу алгоритма.

В П1 перебираются все столбцы и строки отношения “А”, а также все столбцы и строки отношения “В”. Перед выбором очередного столбца для подсчета совпадений значений атрибутов в очередных столбцах счетчик совпадений обнуляется. Если обнаружено совпадение значений атрибутов, то счетчик совпадений увеличивается на 1, и запоминаются позиции соответствующих столбцов. Кроме того, проверяются оставшиеся строки отношения ”А”. Если обнаружилось повторное совпадение, то связи один - к одному нет. П2 аналогичен П1. Только отношения меняются местами.

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

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

В качестве иллюстрации таблиц со связями 1:1 сформированы табл. 6.1.3 и 6.1.4.


Т а б л и ц а 6.1.3

№ путевки

Санаторий

Тип номера

М192

Сокол

Люкс

А282

Авангард

Двухместный

С508

Дружба

Одноместный



Т а б л и ц а 6.1.4

№ путевки

Ф.И.О.

Год рождения

С508

Иванов

1938

М192

Петров

1950



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

Выполним анализ, каким образом можно выявить связь один - к одному посредством стандартных средств СУБД.

На рис. 6.1.1 приведена таблица “Санатории” в режиме Просмотра.




Рис. 6.1.1. Таблица “Санатории” в режиме Просмотра


На рис. 6.1.2 приведена таблица “Отдыхающие” в режиме Просмотра.




Рис. 6.1.2. Таблица “Отдыхающие” в режиме Просмотра


В данном случае нетрудно предположить, что таблицы связаны между собой посредством полей ”№ путевки” связью один - к одному. Действительно, имена полей совпадают, значения полей совпадают. К сожалению, это не всегда очевидно. Поэтому нужна проверка данного предположения.

Для этого на схеме данных организуем связь этих таблиц по полю ”№ путевки”. Такого рода связь представлена с помощью схемы данных на рис. 6.1.3.




Рис. 6.1.3. Связь между двумя таблицами


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

Исходный бланк такого запроса представлен на рис. 6.1.4.




Рис. 6.1.4. Бланк запроса, построенного на базе двух таблиц


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

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




Рис. 6.1.5. Форма с параметрами объединения


Если использовать второй параметр объединения (левого объединения) и выполнить запрос, сформируется результат, представленный на рис 6.1.6.



Рис 6.1.6. Результат левого объединения таблиц


Если использовать третий параметр объединения (правого объединения) и выполнить запрос, сформируется результат, представленный на рис 6.1.7.




Рис 6.1.7. Результат правого объединения таблиц


Из результатов выполнения запроса видно, что число выведенных записей совпадает с числом записей таблицы “Отдыхающие”.

Результаты, представленные на рис. 6.1.6 и рис. 6.1.7 свидетельствуют о том, что действительно имеет место связь между таблицами типа один - к одному.

В некоторых СУБД отсутствует возможность формирования запроса по образцу, как в Microsoft Access. В этом случае можно воспользоваться следующей SQL-командой:


SELECT Санатории.[№ путевки], Санатории.Санаторий, Санатории.[Тип номера], Отдыхающие.[№ путевки], Отдыхающие.[Ф И О], Отдыхающие.[Год рождения]

FROM Санатории RIGHT JOIN Отдыхающие ON Санатории.[№ путевки] = Отдыхающие.[№ путевки];

В данном случае представлено правое объединение таблиц (конструкция “RIGHT JOIN”). Результат выполнения этого запроса представлен на предыдущем рисунке (рис 6.1.7). В правом объединении таблиц вместо конструкции “RIGHT JOIN” используется конструкция “LEFT JOIN”.

Следует обратить внимание, что в различных СУБД используются различные нотации языка SQL, но в большинстве случаев принципиальных различий нет.