WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |

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

Составной первичный ключ – ключ, состоящий из нескольких столбцов.

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

Внешний (вторичный) ключ – столбец, значения которого должны совпадать с первичным ключом некоторой таблицы. Иными словами, для внешнего ключа доменом является множество значений первичного ключа. Внешний ключ не может принимать значения, не содержащиеся в первичном ключе.

Единственно возможное исключение – значение Null (пусто), при котором внешний ключ ни на что не ссылается. Поддержание целостности ключей является задачей СУБД.

Допустимой является ситуация, когда содержащийся в таблице внешний ключ ссылается на первичный ключ той же самой таблицы. Пример: запись с информацией о сотруднике, размещенная в таблице «Сотрудник», имеет атрибут «Начальник», ссылающийся на другую запись в той же самой таблице.

Внешний ключ может быть (или не быть) частью составного первичного ключа в своей таблице.

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

ИмяТаблицы(Поле1, Поле2, Поле3, Поле4, …).

Имена полей, входящих в первичный ключ таблицы, подчеркивают. Такая форма описания удобны при анализе структуры таблицы, без учета связей – например, при проведении нормализации.

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

Домены атрибутов должны быть приведены в соответствие с имеющимися в СУБД типами данных. Некоторые СУБД позволяют разработчику формировать собственные домены (типы данных).

Определенные для сущностей уникальные идентификаторы становятся первичными ключами таблиц.

Связи между таблицами вида «один-ко-многим» (одной записи главной таблицы может соответствовать несколько записей в связанной) строятся добавлением в связанные таблицы внешних ключей, ссылающихся на первичные ключи главных таблиц.

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

Каждая связь вида «многие-ко-многим» должна быть преобразованы в две связи «один-ко-многим».

2.3. Нормализация Процесс нормализации – приведение структуры базы данных в соответствие с некоторым набором формальных правил.

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

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

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

Нормальные формы пронумерованы и имеют вложенную взаимосвязь.

Это означает, что, если отношение соответствует некоторой нормальной форме, оно также соответствует нормальным формам с меньшими номерами.

Первая нормальная форма (1НФ). Таблица соответствует 1НФ, если в ней отсутствуют повторяющиеся группы.

Повторяющаяся группа – столбец, имеющий несколько значений в каждой строке. Повторяющиеся группы в реляционной модели соответствуют многозначным атрибутам в модели «сущность-связь». Пример многозначного атрибута рассматривался выше. Решение проблемы – создание новой таблицы (сущности) для хранения экземпляров из повторяющейся группы.

Вторая нормальная форма (2НФ). Таблица соответствует 2НФ, если она соответствует 1НФ и все атрибуты, не входящие в первичный ключ, связаны с ним полной функциональной зависимостью.

Атрибут B функционально зависит от атрибута A той же таблицы, если в любой заданный момент времени для каждого из различных значений поля А обязательно существует только одно из различных значений поля В (иначе говоря, если известно A, можно однозначно установить B).

Пример 2.6. Наличие функциональной зависимости. Пусть имеется следующая таблица:

Персона(Номер, Фамилия, Имя, Отчество, ДатаРождения) Очевидно, что существует функциональная зависимость атрибутов:

Номер Фамилия, Имя, Отчество, ДатаРождения Полная функциональная зависимость: все атрибуты зависят от составного ключа и не зависят ни от какой его части.

Пример 2.7. Нарушение условия 2НФ. Дана таблица:

Кафедра(КодИнститута, КодКафедры, Название, Телефон, Адрес) Здесь составной ключ - «КодИнститута, КодКафедры» (поле «КодКафедры» идентифицирует кафедру внутри института).

Имеет место функциональная зависимость:

КодИнститута, КодКафедры Название, Телефон, Адрес Для каждой кафедры указывается адрес. Однако, скорее всего, адрес на самом деле зависит только от кода института (т.е. от части ключа).

Для исправления ситуации адрес должен стать атрибутом института. Если же институт имеет несколько площадок (корпусов), у каждой из которых собственный адрес, можно ввести новую сущность (таблицу) «Корпус» и для каждой кафедры указывать корпус, в котором она размещается.

Третья нормальная форма (3НФ). Таблица соответствует 3НФ, если она соответствует 2НФ и не существует транзитивных зависимостей.

Если A B и B C, то A C (C зависит от A транзитивно).

Пример 2.8. Нарушение условий 3НФ.

Кафедра(КодКафедры, Название, Телефон, Корпус, Адрес) В отличие от примера 2.7, первичный ключ состоит только из одного атрибута. Следовательно, все неключевые атрибуты связаны с ним полной функциональной зависимостью (условие 2NF соблюдено). Однако здесь адрес также не на своем месте, как и в предыдущем случае. Можно выделить две зависимости:

КодКафедры Название, Телефон, Корпус Корпус Адрес Адрес определяется корпусом, в котором размещается кафедра. Следовательно, имеет место транзитивная зависимость:

КодКафедры Корпус Адрес Другие нормальные формы.

• Нормальная форма Бойса-Кодда (НФБК) [8 – 13]. Устраняет некоторые недостатки третьей нормальной формы, принимая к рассмотрению различные потенциальные ключи (столбцы или группы столбцов, которые могли бы выступить в роли первичного ключа).

• Четвертая нормальная форма (4НФ) [8, 9, 11 – 13]. Выявляет многозначные зависимости. Многозначной зависимостью называется ситуация, когда одному и тому же значению из некоторого столбца A соответствует несколько значений в столбце B и несколько значений в столбце C, при этом значения в столбцах B и C не связаны между собой.

• Пятая нормальная форма (5НФ) [8, 11, 13]. Рассматривает более сложные случаи многозначных зависимостей.

• Доменно-ключевая нормальная форма (ДКНФ) [12]. Определяет необходимое и достаточное условие отсутствия аномалий. Поскольку в настоящее время не известен алгоритм преобразования таблиц к этой форме, она не представляет большого практического интереса для разработчиков.

Приведенные сведения о процессе нормализации неполны, за подробностями можно обратиться к литературе ([8 – 13]). Однако для разработки большинства реляционных проектов обычно бывает достаточно первых трех нормальных форм.

Приложение 1. Справочные сведения Ниже приведены некоторые сведения, которые могут быть полезны при составлении запросов в Access. За более подробной информацией следует обращаться к источникам [2 – 4].

Таблица П.1.1. Типы данных Access Название Описание Текстовое поле. Может иметь размер не более 255 симChar волов.

Текст большого размера (может вместить более 1 млрд.

Text, Memo символов).

Логический тип. Может принимать одно из двух значеLogical ний: True или False.

Byte Целое в диапазоне от 0 до 255.

Short Целое в диапазоне от -32768 до +32767.

Integer, Int, Длинное целое (в диапазоне от -2147483648 до Long 2147483647).

Число с плавающей точкой одинарной точности. Может Single принимать значения в диапазоне от -3.4x1038 до 3.4x1038.

Число с плавающей точкой двойной точности. Может Double, принимать значения в диапазоне от -1.8x10308 до Number 1.8x10308.

Date, Time, Дата и время.

DateTime Используется для обозначения денежных сумм. ЗапоCurrency минаются 11 знаков слева от десятичной точки и 4 знака справа от десятичной точки.

Counter Длинные целые с автоматическим приращением.

OLE-объекты, созданные в других программах с исOLEObject пользованием протокола OLE. Размер – до 2 Гбайт.

Любой двоичный объект размером до 2 Гбайт. Этот тип Binary может быть использован, например, для хранения двоичных файлов.

Таблица П.1.2. Некоторые групповые операции Имя операции Описание Sum Вычисляет сумму полей в группе.

Avg Вычисляет среднее значение для полей группы.

Min Находит наименьшее значение в группе.

Max Находит наибольшее значение в группе.

Подсчитывает количество элементов в группе. В качеCount стве аргумента можно использовать «*».

First Возвращает первое значение из группы Last Возвращает последнее значение из группы Таблица П.1.3. Функции обработки текста Функция Описание Left(строка, n) Возвращает n левых символов строки.

Right(строка, n) Возвращает n правых символов строки.

Mid(строка, n1, Возвращает n2 символов строки, начиная с позиции n2) n1.

InStr(строка1, Номер позиции, с которой строка2 входит в стрострока2) ка1.

Ltrim(строка) Удаляет пробелы из начала строки.

Rtrim(строка) Удаляет пробелы из конца строки.

Trim(строка) Удаляет пробелы из начала и конца строки.

Таблица П.1.4. Функции обработки даты и времени Функция Описание Date() Возвращает текущую дату.

Now() Возвращает текущую дату и время.

Определяет разницу между датами. Аргумент DateDiff(интервал, да«интервал» определяет способ представления та1, дата2) разницы:

“yyyy” – год, “q” – квартал, “m” – месяц, “y” – день года, “d” – день, “w” – неделя, “h” – час, “n” – минута, “s” – секунда.

DateAdd(интервал, Будущая дата, отстоящая от указанной на зачисло, дата) данное число интервалов.

Возвращает число - значение года для указанYear(дата) ной даты.

Возвращает число - значение месяца для укаMonth(дата) занной даты.

Возвращает число - значение дня для указанной Day(дата) даты.

Таблица П.1.5. Функции преобразования Функция Описание Преобразует значение аргумента в текстовую строStr(аргумент) ку Val(строка) Преобразует строку в число Int(число) Возвращает целую часть числа Таблица П.1.6. Операции Операция Описание + Сложение, конкатенация строк - Вычитание * Умножение / Деление = Равно <> Не равно > Больше < Меньше >= Больше или равно <= Меньше или равно AND Логическое «И» OR Логическое «ИЛИ» NOT Логическое отрицание операция ANY Проверка на соответствие условию любого элеменподзапрос та из подзапроса операция ALL Проверка на соответствие условию всех элементов подзапрос из подзапроса Проверка на существование в подзапросе хотя бы EXISTS подзапрос одного элемента аргумент IS NULL Является ли аргумент пустым значением аргумент IS NOT Является ли аргумент непустым значением NULL аргументBETWEEN аргу- Находится ли значение аргумента «аргумент1» мемент2 AND аргу- жду значениями «аргумент2» и «аргумент3» ментПроверка совпадения аргумента с образцом. В образце может присутствовать символ «%», обознааргумент LIKE чающий любое количество любых символов. Наобразец пример, выражение ’Access’ LIKE ’A%s’ должно возвращать значение «True» (истина) Приложение 2. Практические задания Задание 1. Создание запросов на языке SQL (часть 1, знакомство) Цель задания: Освоить составление запросов на языке SQL при создании объектов базы данных. Используется разработанная ранее база данных «Журналы».

Последовательность действий:

1. Запустите Microsoft Access и откройте базу данных «Журналы».

2. Создайте запрос с именем «Самый простой запрос», который вычисляет значение выражения «2+2» и выдает текущее время, не используя при этом таблицы или другие запросы базы данных.

• Щелкните по ярлыку «Создание запроса в режиме конструктора».

• Закройте диалоговое окно «Добавление таблиц».

• Перейдите в режим SQL ( ).

• В окне редактирования введите текст запроса «SELECT 2+2, NOW();».

• Перейдите в режим просмотра результатов работы запроса. Обратите внимание, что названия столбцов сформированы автоматически.

• Перейдите в режим конструктора ( ). Обратите внимание, какие имена присвоил конструктор столбцам запроса.

• Перейдите в режим SQL и назначьте столбцам новые имена: «ДваПлюсДва» и «ДатаИВремя» соответственно.

• Просмотрите результат работы запроса.

• Закройте окно запроса, сохранив его под именем «Самый простой запрос».

3. Создайте в режиме конструктора и модифицируйте в режиме SQL запрос «Журналы с кодами клиентов», выводящий список журналов и коды клиентов, которые на них подписаны.

• Запустите конструктор для создания нового запроса.

• Добавьте в запрос таблицы «Журнал» и «Подписка».

• Перенесите в бланк запроса имена полей «Название» и «Клиент».

• Просмотрите результат работы запроса.

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

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

• Перейдите в режим SQL.

• Замените в предложении «FROM» ключевые слова «INNER JOIN» на «LEFT JOIN».

• Просмотрите результат работы запроса.

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

• Перейдите в режим конструктора. Обратите внимание на то, что в конструкторе способ объединения также изменился.

Линия связи, обозначающая объединение таблиц, теперь снабжена стрелкой на одном конце.

• Для того, чтобы сохранить запрос, не закрывая окна конструктора, нажмите кнопку «Сохранить» на панели инструментов Access. В диалоговом окне введите имя запроса «Журналы с кодами клиентов» и нажмите кнопку «OK».

• Выясните, как изменится SQL – представление запроса, если связь между таблицами будет отсутствовать. Нажмите правой кнопкой мыши на линии связи и в контекстном меню выберите пункт «Удалить».

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

• Перейдите в режим SQL.

Теперь в предложении «FROM» вместо оператора объединения «LEFT JOIN» с условием равенства значений столбцов двух таблиц, используется оператор «запятая», объединяющий записи таблиц безусловно, в виде декартова произведения.

• Закройте окно запроса, при этом откажитесь от сохранения последних изменений.

4. Создайте в режиме SQL запрос «Журналы с количеством клиентов», выводящий список журналов и количество клиентов, которые подписаны на каждый из них.

• Запустите конструктор для создания нового запроса.

• Закройте окно добавления таблиц. Перейдите в режим SQL.

• Введите в окне редактирования запрос следующего вида:

SELECT Журнал.Название, Count(Подписка.Журнал) AS Количество FROM Журнал LEFT JOIN Подписка ON Журнал.КодЖурнала = Подписка.Журнал GROUP BY Журнал.Название ORDER BY Журнал.Название;

• Просмотрите результат работы запроса.

• Просмотрите запрос в режиме конструктора. Найдите соответствие между всеми элементами, размещенными в бланке и области таблиц конструктора запроса, и элементами запроса на языке SQL.

• Закройте окно запроса, сохранив запрос под именем «Журналы с количеством клиентов».

5. В форме «Подписчики - подчиненная» в качестве источника записей используется специальный запрос «Клиенты с кодами журналов». Измените свойства формы таким образом, чтобы вместо внешнего запроса использовался запрос на языке SQL, заданный непосредственно внутри формы.

• Откройте форму «Подписчики - подчиненная» в режиме конструктора.

• Просмотрите свойство «Источник записей» данной формы.

В качестве источника указан запрос «Клиенты с кодами журналов».

Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |






© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.