Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных Лекции

.pdf
Скачиваний:
63
Добавлен:
15.04.2015
Размер:
318.07 Кб
Скачать

11

первичный ключ составной - П #И#. Отношения связаны между собой через внешний ключ П#. Теперь полученные отношения находятся во 2НФ и в БД можно включать сведения о новых предприятиях даже в том случае, когда они не поставляют никаких изделий.

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

 

 

ПОСТАВЩИК1

 

 

 

ПОСТАВКИ

П#

Имя поставщика

Город

Тариф

 

П#

И#

Кол

 

 

 

 

 

 

П1

И1

300

 

П1

Восход

Тула

10

 

П1

И2

200

 

П2

Заря

Самара

15

 

 

 

П1

И3

200

 

П3

Салют

Тула

10

 

 

 

П2

И1

200

 

 

 

 

 

 

 

 

 

 

 

 

П2

И2

500

 

 

 

 

 

 

П3

И4

80

 

Третья нормальная форма

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

Рассмотрим зависимости между атрибутами отношения ПОСТАВЩИК1.

Каждый из не ключевых атрибутов полностью зависит от первичного ключа П#, но в то же время атрибут Тариф функционально полно зависит только от атрибута Город. Эти атрибуты могут существовать вне зависимости от первичного ключа. Следовательно, это отношение находится не в 3НФ.

В таком отношении также могут возникнуть аномалии включения-удаления. Если потребуется включить в таблицу сведения о новом городе и стоимости перевозок из него, то мы не сможем этого сделать до тех пор, пока в этом городе не появится новый поставщик и не получит свой статус поставщика. До тех пор ему не присвоен код П#, т.е. П# =0 и кортеж, содержащий сведения об этом городе не будет иметь первичного ключа (аномалия включения). Если же предприятие Заря перестанет поставлять нам изделия и потеряет статус поставщика и код П#, то из таблицы придется исключить все сведения о нем, в том числе и те, которые мы хотели бы сохранить, например, стоимость доставки из Самары (аномалия удаления).

Для приведения отношения к 3НФ необходимо выделить в отдельную таблицу не ключевые атрибуты, функционально полно зависящие друг от друга. Таблицу ПОСТАВЩИК1 разделим на две таблицы: ПОСТАВЩИК и ДОСТАВКА.

ПОСТАВЩИК

П#

Имя постащика

Город

 

 

 

П1

Восход

Тула

П2

Заря

Самара

П3

Салют

Тула

 

ДОСТАВКА

Город

 

Тариф

 

 

 

Тула

 

10

Самара

 

15

Теперь эти отношения находятся в 3НФ и в БД можно включать сведения о новых городах и тарифах даже в том случае, когда из этих городов пока не делается никаких поставок. Между полученными отношениями существует связь типа 1:М (на стороне 1 находится отношение ДОСТАВКА). Связь осуществляется через атрибут Город.

12

Таким образом, исходная таблица ПОСТАВКИ2 разделилась на три таблицы: ПОСТАВЩИК, ДОСТАВКА, ПОСТАВКИ. Каждая из таблиц находится в 3НФ. Эти таблицы можно рассматривать в качестве модели данных реляционной БД.

9. Операции на реляционной БД

Для полученной модели данных, состоящей из трех нормализованных отношений, составим запросы, запишем их в виде формул реляционной алгебры (п.6) и получим результаты.

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

Запрос 1.

Сообщить название фирмы-поставщика П1.

Мы получим ответ на этот запрос, если из таблицы ПОСТАВЩИК выделим строку, содержащую сведения об имени поставщика П1. Это можно сделать, выполнив операцию сцепления отношения ПОСТАВЩИК с известной из запроса константой П1 (т.е. выполнив операцию сцепления отношения с одноэлементным множеством {П1}).

ПОСТАВЩИК * {П1} В результате выполнения операции получим новое отношение, состоящее из

единственного кортежа (т.е. таблицу, состоящую из одной строки).

П1

Восход

Тула

 

 

 

Полученная строка содержит лишние сведения. Уточним ответ, применив к вновь полученному отношению операцию проекции на атрибут Имя поставщика. Полученная формула и является формулой запроса.

ПОСТАВЩИК * {П1} [Имя поставщика] В результате будет выделен один столбец. Это и будет ответом на запрос.

Восход

Запрос 2.

В каком количестве поставляются изделия И2?

Искомые сведения находятся в таблице ПОСТАВКИ. Аналогично Запросу 1 применим к отношению ПОСТАВКИ операцию сцепления с известной константой И2, а затем спроектируем полученное отношение на атрибут Кол.

ПОСТАВКИ * {И2} [Кол] Результаты выполнения операций.

П1

И2

200

 

300

П2

И2

500

 

500

Запрос 3.

Сколько изделий И2 поставляет фирма Заря?

В этом запросе известными являются значения двух атрибутов: Имя поставщика - Заря и номер изделия - И2. Известные и искомые данные находятся в двух таблицах: ПОСТАВЩИК и ПОСТАВКИ, поэтому для ответа на запрос необходимо "привязать" сведения из одной таблицы к сведениям из другой таблицы. Это можно сделать, выполнив операцию сцепления отношений по атрибуту П#.

13

Запишем формулу запроса.

ПОСТАВЩИК * {Заря} * ПОСТАВКИ * {И2} [Кол] Определим результаты выполнения каждой из операций.

1.В результате выполнения операции сцепления отношения ПОСТАВЩИК с одноэлементным множеством {Заря} получим новое отношение, содержащее единственный кортеж (т.е. новую таблицу, состоящую из одной строки).

П2

Заря

Самара

 

 

 

2.Вторая операция выполняет сцепление полученного отношения, имеющего арность 3, с отношением ПОСТАВКИ, имеющим также арность 3, по одинаковому значению атрибута П#. В результате получим новое отношение арностью 5. В него войдут все кортежи сцепляемых отношений, у которых значение атрибута П# = П2.

П2

Заря

Самара

И1

200

 

 

 

 

 

П2

Заря

Самара

И2

500

 

 

 

 

 

3.В результате выполнения третьей операции из полученного отношения выберутся строки, в которых значение атрибута И# равно И2.

4.И, наконец, с помощью операции проекции уточним ответ, выделив столбец Кол.

П2

Заря

Самара

И2

500

 

500

Запрос 4

Какие поставщики и по какому тарифу поставляют изделие И2?

Известное данное (номер изделия П2) находится в таблице ПОСТАВКИ, а искомые данные (имя поставщика и тариф) - в таблицах ПОСТАВЩИК и ДОСТАВКА. Поэтому для выработки ответа на запрос необходимо связать данные из трех таблиц.

Из отношения ПОСТАВКИ по номеру поставщика с помощью операции сцепления отношения с одноэлементным множеством {И2} выделим кортежи, содержащие номера поставщиков, поставляющих изделие И2. Затем выполним сцепление полученного отношения с отношением ПОСТАВЩИК по атрибуту П#. Получим отношение, содержащее атрибут с названиями городов, из которых доставляются изделия И2. Операция сцепления полученного отношения с отношением ДОСТАВКА по атрибуту Город сформирует отношение, содержащее атрибуты с искомыми данными. Наконец, выполнив проекцию этого отношения на атрибуты Имя поставщика и Тариф, выделим искомые данные.

Запишем формулу запроса.

 

 

 

 

1

 

2

 

 

 

3

 

4

 

 

 

 

 

ПОСТАВКИ * {И2} * ПОСТАВЩИК * ДОСТАВКА [Имя поставщика, Тариф]

 

 

Определим результаты выполнения каждой операции (все операции в формуле и

получаемые результаты пронумерованы).

 

 

 

 

 

 

 

 

1.

 

 

2.

 

 

 

 

 

 

 

 

 

 

 

 

 

П1

И2

200

 

П1

И2

 

200

 

 

Восход

Тула

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

П2

И2

500

 

П2

И2

 

500

 

 

Заря

Самара

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.

 

 

 

 

 

 

 

 

 

 

 

4.

 

 

 

 

П1

И2

200

Восход

Тула

 

 

10

 

 

Восход

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

П2

И2

500

Заря

Самара

 

15

 

 

Заря

 

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

Можно заметить, что в результате последовательного выполнения нескольких операций сцепления арность отношений растет, т.е. в таблицах увеличивается количество столбцов. Рост объемов промежуточных результатов при выполнении такого запроса на ЭВМ может привести к увеличению времени выполнения каждой следующей операции, и общее время выполнения запроса может оказаться недопустимо большим.

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

1 2 3 4 5 6

ПОСТАВКИ * {И2} [П#] * ПОСТАВЩИК [Имя поставщика, Город] * ДОСТАВКА [Имя

поставщика, Тариф]

 

 

 

 

 

 

 

 

 

 

 

Результаты выполнения операций.

 

 

 

 

1.

 

 

 

2.

3.

 

 

4.

 

 

П1

И2

200

 

 

П1

 

П1

Восход

Тула

 

Восход

Тула

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

П2

И2

500

 

 

П2

 

П2

Заря

Самара

 

Заря

Самара

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.

Восход

Тула

10

Заря

Самара

15

6.

Восход

10

Заря

15

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

10. Языки реляционных БД

10.1. Язык, основанный на реляционной алгебре

Язык данных, основанный на реляционной алгебре, был предложен Коддом. Это теоретический язык, позволяющий манипулировать данными в реляционных БД. Некоторые коммерческие языки БД основаны также на реляционной алгебре. Язык содержит девять операторов. Это операторы для выполнения операций теории множеств над отношениями: объединение, пересечение, произведение, разность отношений, а также операторы для выполнения операций, применимых только к отношениям и др. Это операции сцепления отношения с множеством (ее еще называют выборкой), сцепление двух отношений (или соединение) и операция проекции отношения на его компоненту. При рассмотрении предыдущего параграфа мы могли убедиться в том, что трех последних операций оказывается достаточно для составления разнообразных запросов к БД, связанных с поиском нужных сведений.

Рассмотрим операторы языка, выполняющие эти операции.

SELECT - оператор выборки, выполняет операцию сцепления отношения с множеством. Конструкция предложения SELECT такова:

SELECT (выбрать) <имя таблицы> WHERE (где) <условие> GIVING TEMP (сформировать таблицу, содержащую результат).

JOIN - оператор соединения отношений, выполняет операцию сцепления двух отношений. Конструкция предложения JOIN:

JOIN (соединить) <Имя таблицы> AND (и) <имя таблицы> OVER (по) <имя атрибута, по которому выполняется сцепление> GIVING TEMP (сформировать таблицу, содержащую результат).

15

PROJECT - оператор проекции, выполняет операцию проекции отношения на его компоненты. Конструкция предложения PROJECT:

PROJECT (спроектировать) <имя таблицы> OVER (на) <имена атрибутов> GIVING TEMP (сформировать таблицу, содержащую результат).

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

Составленные ранее запросы запишем с помощью этих операторов. Предложения запросов следуют в том же порядке, в котором следуют операции в записанных ранее формулах.

Запрос 1.

Сообщить название фирмы-поставщика П1

SELECT ПОСТАВЩИК WHERE П# = 'П1' GIVING TEMP1

PROGECT TEMP1 OVER Имя поставщика GIVING RESULT

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

Запрос 2.

В каком количестве поставляются изделия И2?

SELECT ПОСТАВКИ WHERE И# = 'И2' GIVING TEMP1

PROGECT TEMP1 OVER Кол GIVING RESULT

Запрос 3.

Сколько изделий И2 поставляет фирма Заря?

SELECT ПОСТАВЩИК WHERE Имя поставщика = 'Заря' GIVING TEMP1

JOIN TEMP1 AND ПОСТАВКИ OVER П# GIVING TEMP2 SELECT TEMP2 WHERE И# = 'И2' GIVING TEMP3

PROGECT TEMP3 OVER Кол GIVING RESULT

Запрос 4.

Какие поставщики и по какому тарифу поставляют изделия И2?

SELECT ПОСТАВКИ WHERE И# = 'И2' GIVING TEMP1 JOIN TEMP1 AND ПОСТАВЩИК OVER П# GIVING TEMP2

JOIN TEMP2 AND ДОСТАВКА OVER Город GIVING TEMP3 PROGECT TEMP3 OVER Имя поставщика, Тариф GIVING RESULT

Мы рассмотрели лишь 3 оператора языка из 9.

Рассмотренный язык обладает следующей особенностью: это процедурный язык обработки реляционных таблиц. Это означает, что в формуле запроса последовательно перечисляются все операции, которые надо выполнить над отношениями для выработки ответа. Пользователь, работающий с таким языком, должен иметь определенный уровень подготовки. Кроме того, один и тот же результат можно получить, составляя разные варианты запроса (см. п. 9, запрос 4). При этом скорость выполнения запроса и необходимые объемы памяти для хранения промежуточных результатов зависят от того, как именно составлена формула: "лучшим" или "не лучшим" способом. И здесь существенное значение имеет уровень подготовки пользователя, его опыт и навыки.

Замечательным достоинством этого языка является его реляционная полнота. Это означает, что язык позволяет составить любые запросы на манипулирование данными в БД.

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

16

Тремя наиболее важными реляционными языками БД являются: SQL - Structured Query Language (структурированный язык запросов), QBE - Query By Example (запрос по образцу) и QUEL - Query Language (язык запросов). Наибольшее распространение получили первые два.

10.2. Язык SQL - общие сведения

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

Из реляционной алгебры в этот стандарт включены операторы для некоторых операций над множествами, а также операторы, выполняющие над отношениями основные реляционные операции: выборку SELECT, соединение JOIN и проекцию.

10.3. Язык запросов QBE

Язык SQL требует определенных навыков в составлении запросов и не может быть предложен пользователюнепрограммисту для общения с БД. Был разработан простой и наглядный графически-ориентированный язык запросов для пользователей - Query By Example (запрос по образцу), ставший важной частью коммерческих СУБД.

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

Рассмотрим основные возможности QBE, опираясь на первоначально разработанный вариант языка.

Пользователю предоставляются сведения об именах таблиц и именах столбцов, содержащихся в каждой из таблиц. Пользователь может вывести таблицу-образец для любой таблицы БД, указав ее имя. В первом столбце таблицы-образца выводится имя таблицы, за ним следуют имена столбцов. Под каждым именем столбца оставлено пустое пространство, позволяющее пользователю вводить запрос. Проиллюстрируем использование таблицобразцов на примерах, составив на QBE два из ранее рассмотренных запросов.

Запрос 1

Сообщить название фирмы-поставщика П1.

Поскольку известные и искомые данные хранятся в одной таблице ПОСТАВЩИК, нужно вывести образец для этой таблицы.

ПОСТАВЩИК

П#

Имя поставщика

Город

 

 

 

 

 

П1

Р.

 

 

 

 

 

Условием отбора является равенство значения, находящегося в столбце П# базовой таблицы, введенному значению П1.

В столбец П# помещаем условие отбора даных - номер поставщика П1. Для того, чтобы указать, что именно мы хотим вывести, в столбец Имя поставщика помещаем команду Р. (print - распечатать). Пустые столбцы можно удалить. Результат запроса будет представлен в виде так называемой ответной или целевой таблицы, содержащей все строки из базовой таблицы, в которых номер поставщика равен П1.

ПОСТАВЩИК

П#

Имя поставщика

 

 

 

 

П1

Восход

 

 

 

17

Запрос 2

Сколько изделий И2 поставляет фирма Заря?

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

 

ПОСТАВЩИК

П#

Имя поставщика

Город

 

 

 

 

 

 

 

 

 

__П

Заря

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПОСТАВКИ

П#

И#

Кол

 

 

 

 

 

 

 

 

 

__П

И2

Р.

 

 

 

 

 

 

 

 

Ответная таблица будет содержать все необходимые данные, пустые столбцы не выводятся.

Имя поставщика

И#

Кол

 

 

 

Заря

И2

500

 

 

 

В запросе можно указывать более сложные условия отбора, используя операторы сравнения <, >, <=, >=, <>. Условия, указанные в разных строках столбца таблицы-образца, воспринимаются системой как операнды логической операции ИЛИ, а условия, указанные в разных столбцах одной и той же таблицы воспринимаются системой как операнды логической операции И.

Запрос 3

Какие изделия поставляются в количестве 200 или 300 единиц?

 

ПОСТАВКИ

П#

И#

Кол

 

 

 

 

 

 

 

 

 

 

 

 

Р.

200

 

 

 

 

 

 

300

 

 

 

 

 

 

 

 

И#

Кол

 

 

 

 

 

 

 

 

 

 

 

 

И1

300

 

 

 

 

 

И2

200

 

 

 

 

 

И3

200

 

 

 

 

 

И1

200

 

 

 

 

Запрос 4

Какие изделия поставляются поставщиком П2 в количестве 500 единиц.

ПОСТАВКИ

П#

И#

Кол

 

П#

И#

Кол

 

 

 

 

 

 

 

 

 

П2

Р.

500

 

П2

И2

500

 

 

 

 

 

 

 

 

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