
- •А.В. Брешенков
- •Проектирование баз данных на основе информации табличного вида
- •1. Анализ проблемы проектирования реляционных баз данных на основе использования информации табличного вида 8
- •5. Назначение ключевых полей 142
- •6. Выявление и формирование связей между заполненными таблицами 157
- •7. Объединение таблиц 190
- •8. Разработка и исследование модели методики проектирования реляционных баз данных на основе использования информации табличного вида 220
- •Предисловие
- •Глава 5 посвящена методу назначения ключевых полей в заполненных нереляционных таблицах.
- •1. Анализ проблемы проектирования реляционных баз данных на основе использования информации табличного вида
- •1.1. Понятие информации табличного вида
- •1.2. Мотивы преобразования информации табличного вида в файлы реляционных баз данных
- •1.3. Основные требования к средствам преобразования информации табличного вида в реляционные таблицы
- •1.4. Задачи объединения и разбиения реляционных таблиц
- •1.5. Задачи нормализации реляционных таблиц
- •1.6. Преобразование реляционных нормализованных таблиц в файлы бд
- •1.7. Вопросы преобразования электронных таблиц
- •Упражнения и вопросы для самоконтроля
- •2. Постановка задачи проектирования реляционных баз данных на основе использования информации табличного вида
- •2.1. Укрупненная модель реляционной базы данных
- •2.2. Укрупненная модель информации табличного вида
- •2.3. Задачи преобразования заполненных нереляционных таблиц в реляционные таблицы Преобразование нереляционных таблиц в реляционные таблицы
- •Нормализация заполненных таблиц
- •Назначение ключевых полей для заполненных таблиц
- •Выявление и формирование связей между заполненными реляционными таблицами
- •Упражнения и вопросы для самоконтроля
- •3. Преобразование нереляционных таблиц в реляционные таблицы
- •3.1. Приведение значений атрибутов заполненных таблиц к одному типу
- •3.2. Исключение дублирования записей
- •Упражнения и вопросы для самоконтроля
- •4. Нормализация заполненных реляционных таблиц.
- •4.1. Проблемы нормализации
- •4.2. Модели информации табличного вида и реляционных таблиц.
- •4.2.1. Модель информации табличного вида
- •4.2.2. Модель реляционной таблицы
- •4.3. Преобразование заполненных таблиц к первой нормальной форме
- •4.3.1. Избавление от сложных атрибутов
- •4.3.2. Исключение подзаголовков расположенных внутри таблицы
- •4.3.3. Нормализация заполненных таблиц с подзаголовками в первом столбце.
- •4.4. Преобразование заполненных таблиц ко второй нормальной форме
- •4.5. Преобразование заполненных таблиц к третьей нормальной форме
- •Избавление от функциональной зависимости.
- •4.6. Преобразование заполненных таблиц к четвертой нормальной форме.
- •Упражнения и вопросы для самоконтроля
- •5. Назначение ключевых полей
- •5.1. Задача назначения ключевых полей в заполненных реляционных таблицах
- •5.2. Алгоритмы назначения ключевых полей в заполненных реляционных таблицах
- •Упражнения и вопросы для самоконтроля
- •6. Выявление и формирование связей между заполненными таблицами
- •6.1. Выявление и формирование связей один - к одному
- •6.2. Выявление и формирование связей один - ко многим
- •6.3. Выявление и формирование связей многие - ко многим.
- •Формирование 3-й таблицы для реализации многозначных связей.
- •Упражнения и вопросы для самоконтроля
- •7. Объединение таблиц
- •7.1. Проблемы объединения таблиц
- •Исходные таблицы по своей природе удовлетворяют требованиям совместимости, а по форме – нет.
- •Исходные таблицы удовлетворяют требованиям совместимости, результирующую таблицу необходимо обновлять.
- •Исходные таблицы частично удовлетворяют требованиям совместимости.
- •7.2. Объединение и обновление совместимых таблиц
- •7.3. Объединение таблиц, частично удовлетворяющих требованиям совместимости
- •Упражнения и вопросы для самоконтроля
- •8. Разработка и исследование модели методики проектирования реляционных баз данных на основе использования информации табличного вида
- •8.1. Постановка задачи разработки модели методики
- •8.2. Операторная модель преобразования информации табличного вида к реляционным базам данных
- •8.3. Исследование методики преобразования информации табличного вида в реляционные базы данных
- •8.4. Исследование динамических свойств функционирования системы.
- •8.5. Исследование временных свойств системы.
- •Упражнения и вопросы для самоконтроля
- •Список литературы
Упражнения и вопросы для самоконтроля
Сформулируйте задачу назначения ключевых полей в заполненных реляционных таблицах.
Опишите алгоритм назначения ключевых полей в заполненных реляционных таблицах.
Как реализовать данный алгоритм на основе визуального анализа таблиц и существующих средств СУБД?
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, но в большинстве случаев принципиальных различий нет.