А. В. Брешенков Проектирование баз данных на основе информации табличного вида Допущено в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки диплом
Вид материала | Диплом |
СодержаниеУпражнения и вопросы для самоконтроля 6. ВЫЯВЛЕНИЕ И ФОРМИРОВАНИЕ СВЯЗЕЙ МЕЖДУ ЗАПОЛНЕННЫМИ ТАБЛИЦАМИ 6.1. Выявление и формирование связей один - к одному |
- Учебное пособие Допущено Министерством образования Российской Федерации в качестве, 2582.59kb.
- Д. В. Андреев Программирование микроконтроллеров mcs-51, 2064.3kb.
- И. В. Борискина, А. А. Плотников, А. В. Захаров проектирование современных оконных, 1699.55kb.
- «История нового времени», 4001.1kb.
- Учебное пособие. 3-е изд., испр и доп, 125.38kb.
- М. В. Ломоносова Хрестоматия по истории государства и права зарубежных стран, 11295.75kb.
- В. В. Крупица Личность Коллектив Стиль отношений (социально-психологический аспект), 4876.34kb.
- И. М. Синяева, В. М. Маслова, В. В. Синяев сфера, 5230.77kb.
- И. К. Корнеев информационная безопасность и защита информации учебное пособие, 7667.6kb.
- Курслекций допущено умо по образованию в области социальной работы в качестве учебного, 2178.14kb.
Упражнения и вопросы для самоконтроля
- Сформулируйте задачу назначения ключевых полей в заполненных реляционных таблицах.
- Опишите алгоритм назначения ключевых полей в заполненных реляционных таблицах.
- Как реализовать данный алгоритм на основе визуального анализа таблиц и существующих средств СУБД?
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, но в большинстве случаев принципиальных различий нет.