Базы данных лаборатории хлебной базы
Расчет сложности запроса Заключение Список использованных источников Введение В настоящее время базы данных различной архитектуры широко используются в большинстве организаций. База данных (БД) представляет собой организованную структуру, используемую для хранения данных, т. е. любых сведений о явлениях, процессах, действиях и т. д. Редуцированное минимальное кольцевое покрытие На рисунках 16- 24… Читать ещё >
Базы данных лаборатории хлебной базы (реферат, курсовая, диплом, контрольная)
Определения, обозначения и сокращения Введение
1. Техническое задание
1.1 Основания для разработки
1.2 Задание
2. Технический проект
2.1 Неформализованное описание предметной области
2.2 Словарь понятий и терминов
2.3 Структура таблиц базы данных
2.4 Диаграмма сущность-связь для предметной области на логическом уровне
2.5 Ограничения на связи между таблицами базы данных хлебной базы
2.5.1 Функциональные зависимости для сущности groats
2.5.2 Функциональные зависимости для сущности laborants
2.5.3 Функциональные зависимости для сущности silo
2.5.4 Функциональные зависимости для сущности transport
2.5.5 Функциональные зависимости для сущности grain_elevator
2.5.6 Функциональные зависимости для сущности reseivs
2.5.7 Функциональные зависимости для сущности dispatch
2.5.8 Функциональные зависимости для сущности analysis card
2.5.9 Ограничения, накладываемые на связи между сущностями
3. Проектирование оптимальной структуры базы данных методом синтеза
3.1 Исходное множество функциональных зависимостей
3.2 Неизбыточное покрытие множества ФЗ
3.3 Леворедуцированное покрытие множества ФЗ
3.4 Праворедуцированное покрытие множества ФЗ
3.5 Минимальное покрытие
3.6 Редуцированное минимальное кольцевое покрытие
4. Оптимизация запросов к базе данных
4.1 Статистика по таблицам базы данных
4.2 Многотабличный запрос на выборку по условию
4.2.1 Выражение для запроса с использованием реляционной алгебры
4.2.2 Исходное операционное дерево для запроса
4.2.3 Оптимизированное операционное дерево для запроса
4.2.4 Исходный запрос на языке SQL
4.2.5 Оптимизированный запрос на языке SQL
4.2.6 Расчет сложности запроса
4.3 Многотабличный запрос на выборку по условию
4.3.1 Выражение для запроса с использованием реляционной алгебры
4.3.2 Исходное операционное дерево для запроса
4.3.3 Оптимизированное операционное дерево для запроса
4.3.4 Исходный запрос на языке SQL
4.3.5 Оптимизированный запрос на языке SQL
4.3.6 Расчет сложности запроса Заключение Список использованных источников Введение В настоящее время базы данных различной архитектуры широко используются в большинстве организаций. База данных (БД) представляет собой организованную структуру, используемую для хранения данных, т. е. любых сведений о явлениях, процессах, действиях и т. д.
Компьютерные базы данных, компактные, удобные в работе и позволяющие достичь высочайших скоростей обработки информации, стремительно завоевывают популярность.
В зависимости от рода деятельности компании формируются ее требования к используемой базе данных.
1. Техническое задание
1.1 Основания для разработки Необходимо разработать базу данных, реализующую лабораторию хлебной базы. Основанием для разработки послужило задание на курсовую работу по дисциплине «Базы данных» .
1.2 Задание Спроектировать базу данных для лаборатории хлебной базы. Описать предметную область, разработать словарь понятий и терминов, построить систему функциональных зависимостей. Синтезировать схему базы данных на основании функциональных зависимостей (построение неизбыточного покрытия, построение леворедуцированного неизбыточного покрытия, построение праворедуцированного неизбыточного покрытия, построение классов эквивалентностей, построение минимального покрытия). Построить уточненную концептуальную модель в виде ER-диаграммы, запросы предметной области. Записать минимизированные запросы на языке SQL. Рассчитать сложность запросов.
2. Технический проект
2.1 Неформализованное описание предметной области Хлебная база представляет собой предприятие, основу деятельности которого составляет приемка, хранение и транспортировка круп различного вида и сорта. Крупы отличаются по названию, назначению (виду), сорту, году урожая и месту урожая. Крупы распределяются по партиям, каждая из которых включает крупу только определенного вида, сорта, года урожая и места урожая. Партии круп хранятся на элеваторах. Элеватор характеризуется определенным объемом вместимости и состоит из более мелких по объему хранилищ — силосов. В каждом силосе хранится только одна определенная партия крупы. Каждую партию крупы отправляют на анализ в лабораторию. Все виды лабораторных анализов круп осуществляют лаборанты. Каждый лаборант заполняет лабораторную карту для каждой партии крупы, в которой определяется принадлежность ее к сорту и назначению.
2.2 Словарь понятий и терминов В описанной предметной области можно выделить следующие сущности:
Словарь терминов для объектов и элементов данных таблицы «Groats» представлен в таблице 1.
Таблица 1 Крупа — Groats
Наименование | Кратко | Значение | Тип (точность) | |
Название | Name | Овёс | Character | |
Назначение | Needs | Кормовой | Character | |
Сорт | Sort | Int | ||
Год урожая | Year | Int | ||
Место урожая | Place | Курская область | Character | |
Номер партии | Num_part | Int | ||
Словарь терминов для объектов и элементов данных таблицы «Silo» представлен в таблице 2.
Таблица 2 Силос — Silo
Наименование | Кратко | Значение | Тип (точность) | |
Номер | Number_s | Int | ||
Вместимость | Lim_weight_s | Int | ||
Занято | Weight_s | Int | ||
Какой крупой | Name_groat | Ячмень | Character | |
Какого типа | Type_groat | Пивоваренный | Character | |
Номер элеватора | Num_elev | Int | ||
Словарь терминов для объектов и элементов данных таблицы «grain_elevator» представлен в таблице 3.
Таблица 3 Элеватор — grain_elevator
Наименование | Кратко | Значение | Тип (точность) | |
Номер | Number_el | Int | ||
Вместимость | Lim_weight_el | Int | ||
Занято | Weight_el | Int | ||
Словарь терминов для объектов и элементов данных таблицы «Transport» представлен в таблице 4.
Таблица 4 Транспорт — Transport
Наименование | Кратко | Значение | Тип (точность) | |
Номер | Num | Int | ||
Смена | Hours | Int | ||
Вместимость | Lim_weight_c | Int | ||
Словарь терминов для объектов и элементов данных таблицы «Dispatch» представлен в таблице 5.
Таблица 5 Отправка — Dispatch
Наименование | Кратко | Значение | Тип (точность) | |
Номер партии | Num_part | Int | ||
Номер машины | Num_trans | Int | ||
Пункт назначения | Destin | Щигры | Character | |
Смена | Hours | Int | ||
Крупа | Name_groat | Рис | Character | |
Дата | Data | 12.06.2010 | Date | |
Словарь терминов для объектов и элементов данных таблицы «Reseivs» представлен в таблице 6.
Таблица 6 Получение — Reseivs
Наименование | Кратко | Значение | Тип (точность) | |
Номер партии | Num_part | Int | ||
Номер машины | Num_trans | Int | ||
Откуда | From | Черемисиново | Character | |
Смена | Hours | Int | ||
Крупа | Name_groat | Пшеница | Character | |
Дата | Data | 15.07.2010 | Date | |
Номер силоса | Num_sil | Int | ||
Словарь терминов для объектов и элементов данных таблицы «Analysis card» представлен в таблице 7.
Таблица 7 Анализная карточка — Analysis card
Наименование | Кратко | Значение | Тип (точность) | |
Номер карточки | Num_card | Int | ||
Дата анализа | Date_an | 13.08.2010 | Date | |
Название крупы | name_groat | Овёс | Character | |
Смена | Type_groat | Продовольственный | Character | |
Крупа | Year | Int | ||
Дата | Place | Поныри | Character | |
Фамилия лаборанта | Lastname_lab | Меркулова | Character | |
Табельный номер | Tab_num_lab | Int | ||
Словарь терминов для объектов и элементов данных таблицы «Laborants» представлен в таблице 8.
Таблица 8 Лаборанты — Laborants
Наименование | Кратко | Значение | Тип (точность) | |
Табельный номер | Tab_num_lab | Int | ||
Фамилия лаборанта | Lastname_lab | Меркулова | Character | |
Имя | Name | Галина | Character | |
Отчество | Secondname | Павловна | Character | |
Дата рождения | Birth_date | 28.01.1976 | Date | |
Словарь терминов для объектов и элементов данных таблицы «Current_elevator» представлен в таблице 9.
Таблица 9 Текущая заполненность элеваторов — Current_elevator
Наименование | Кратко | Значение | Тип (точность) | |
Дата | Date | 12.01.2010 | Date | |
Занято | Occupied | Int | ||
Номер элеватора | Number_el | Int | ||
2.3 Структура таблиц базы данных Структура таблиц базы данных, включающая в себя поля, их размерность, тип и ключи таблиц, отображена в таблицах 10−25.
Структура таблицы Dispatch представлена в таблицах 10−11.
Таблица 10
Таблица 11 Структура таблицы Dispatch
Название поля | Размер | Тип | |
NUM_PART | Integer | ||
NUM_TRANS | Integer | ||
DESTIN | Character | ||
HOURS | Integer | ||
NAME_GROAT | Character | ||
DATA | Date | ||
Таблица 12 Ключи в таблице Dispatch
Название | Тип | Выражение | |
num_part | Primary | num_part | |
num_trans | Regular | num_trans | |
hourrs | Regular | hours | |
Структура таблицы Silo представлена в таблицах 12−13.
Таблица 13 Структура таблицы Silo
Название поля | Размер | Тип | |
number_s | Integer | ||
lim_weight_s | Integer | ||
weight_s | Integer | ||
name_groat | Character | ||
type_groat | Character | ||
num_elev | Integer | ||
num_part | Integer | ||
Таблица 14 Ключи в таблице Silo
Название | Тип | Выражение | |
num_sil | Primary | number_s | |
num_elev | Candidate | num_elev | |
num_part | Regular | num_part | |
Структура таблицы grain_elevator представлена в таблицах 14−15.
Таблица 15
Таблица 15 Структура таблицы grain_elevator
Название поля | Размер | Тип | |
number_el | Integer | ||
lim_weight_el | Integer | ||
Таблица 16 Ключи в таблице grain_elevator
Название | Тип | Выражение | |
num_el | Primary | number_el | |
Структура таблицы Transport представлена в таблицах 16−17.
Таблица 17 Структура таблицы Transport
Название поля | Размер | Тип | |
num | Integer | ||
hours | Integer | ||
lim_weight_c | Integer | ||
Таблица 18 Ключи в таблице Transport
Название | Тип | Выражение | |
numb | Primary | num | |
Hours | Regular | hours | |
Структура таблицы Receivs представлена в таблицах 18−19.
Таблица 19 Структура таблицы Receivs
Название поля | Размер | Тип | |
num_part | Integer | ||
num_trans | Integer | ||
from | Character | ||
hours | Integer | ||
name_groat | Character | ||
dat | Date | ||
num_sil | Integer | ||
Таблица 20
Таблица 20 Ключи в таблице Receivs
Название | Тип | Выражение | |
num_sil | Regular | num_sil | |
num_part | Primary | num_part | |
num_trans | Regular | num_trans | |
hours | Regular | hours | |
Структура таблицы Groats представлена в таблицах 20−21.
Таблица 21 Структура таблицы Groats
Название поля | Размер | Тип | |
nam | Character | ||
needs | Character | ||
sort | Integer | ||
place | Character | ||
num_part | Integer | ||
Таблица 22 Ключи в таблице Groats
Название | Тип | Выражение | |
num_part | Primary | num_part | |
Структура таблицы Laborants представлена в таблицах 22−23.
Таблица 23 Структура таблицы Laborants
Название поля | Размер | Тип | |
tab_num | Integer | ||
lastname | Character | ||
name | Character | ||
secondname | Character | ||
birth_date | Date | ||
Таблица 24 Ключи в таблице Laborants
Название | Тип | Выражение | |
tab_num | Primary | tab_num | |
Структура таблицы current_elevator представлена в таблицах 24−25.
Таблица 25 Структура таблицы current_elevator
Название поля | Размер | Тип | |
data | Date | ||
occupied | Integer | ||
number_el | Integer | ||
Таблица 26 Ключи в таблице current_elevator
Название | Тип | Выражение | |
data | Primary | data | |
num_el | Regular | number_el | |
2.4 Диаграмма сущность-связь для предметной области на логическом уровне Диаграмма сущность-связь для предметной области базы данных лаборатории хлебной базы, разработанная с помощью ErWIN, показана на рисунке 1.
Рисунок 1 — Диаграмма сущность-связь
2.5 Ограничения на связи между таблицами базы данных хлебной базы
2.5.1 Функциональные зависимости для сущности groats
Нельзя, чтобы одна партия зерна содержала зерно разного вида;
Num_part->nam;
Нельзя, чтобы одна партия зерна содержала зерно разного типа;
Num_part->needs;
Нельзя, чтобы одна партия зерна содержала зерно разного сорта;
Num_part->sort
Нельзя, чтобы одна партия зерна содержала зерно из различных мест сбора урожая;
Num_part->place;
Нельзя, чтобы одна партия зерна содержала зерно разного года сбора урожая;
Num_part->year;
2.5.2 Функциональные зависимости для сущности laborants
У разных лаборантов не может быть один и тот же табельный номер;
Tab_numb->lastname, name, secondname, birthdate
2.5.3 Функциональные зависимости для сущности silo
Нельзя, чтобы в 1 и том же силосе хранилась крупа более чем одного сорта;
Num_sil->sort_groat
Нельзя, чтобы в 1 и том же силосе хранилась крупа более чем 1 назначения;
Num_sil->needs
Нельзя, чтобы в 1 и том же силосе хранилась крупа более чем 1 типа.
Num_sil->type_groat
2.5.4 Функциональные зависимости для сущности transport
Одна и та же машина не может иметь разную предельную вместимость;
Num->lim_weight_c
Одна и та же машина не может работать одновременно в разные смены;
Num->hours
2.5.5 Функциональные зависимости для сущности grain_elevator
Один и тот же элеватор не может иметь различный предельный объем заполнения
Number_el->lim_weight_el
Один и тот же элеватор не может иметь в один и тот же момент времени различный объем фактического заполнения
Number_el-> weight_el
2.5.6
2.5.6 Функциональные зависимости для сущности reseivs
Одна и та же машина не может привозить разные партии зерна;
Num_part->num_trans
Нельзя, чтобы 1 и та же машина привозила в один и тот же день партии крупы разного вида;
Num_part, Num_trans, data->name_groat
Нельзя, чтобы 1 и та же машина привозила в один и тот же день партии крупы из разных мест сбора урожая;
Num_part, Num_trans, data->from
Нельзя, чтобы 1 и та же машина привозила в один и тот же день одну партию крупы в разные смены;
Num_part, Num_trans, data->hours
2.5.7 Функциональные зависимости для сущности dispatch
Одна и та же машина не может увозить разные партии зерна;
Num_part->num_trans
Нельзя, чтобы 1 и та же машина увозила в один и тот же день партии крупы разного вида;
Num_part, Num_trans, data->name_groat
Нельзя, чтобы 1 и та же машина увозила в один и тот же день партии крупы в разные места назначения;
Num_part, Num_trans, data->destin
Нельзя, чтобы 1 и та же машина увозила в один и тот же день одну партию крупы в разные смены;
Num_part, Num_trans, data->hours
2.5.8 Функциональные зависимости для сущности analysis card
Одна и та же анализная карточка не может быть заполнена в разные дни;
Num_card->date_an
Одна и та же анализная карточка не может быть заполнена для разного вида крупы;
Num_card ->name_groat
Одна и та же анализная карточка не может быть заполнена для разного типа крупы;
Num_card ->type_groat
Одна и та же анализная карточка не может быть заполнена для крупы разных лет сбора урожая;
Num_card ->year
Одна и та же анализная карточка не может быть заполнена для крупы из разных мест сбора урожая;
Num_card ->place
Одна и та же анализная карточка не может быть заполнена более чем одним лаборантом в один и тот же день.
Num_card ->tab_nam_lab, lastname_lab
2.5.9 Ограничения, накладываемые на связи между сущностями Разные лаборанты не могут заполнить одну и ту же анализную карточку с одним и тем же номером в один и тот же день.
Num_card-> Tab_num_lab, date_an
Tab_num_lab ->Num_card, date_an
Нельзя, чтобы в 1 и тот же силос привозилась крупа более чем 1 типа;
Number_s->name_groat
Нельзя, чтобы в 1 и тот же силос привозилась крупа более чем 1 вида;
Number_s->needs
Нельзя, чтобы 1 и той же партии зерна соответствовало более 1 анализной карточки;
Num_part->num_card
Нельзя, чтобы разным номерам элеваторов соответствовали один и те же силосы;
Num_el->num_sil
Нельзя, чтобы один силос находился в разных элеваторах;
num_sil -> Num_el
3. Проектирование оптимальной структуры базы данных методом синтеза
3.1 Исходное множество функциональных зависимостей Исходное множество функциональных зависимостей, определяющих взаимосвязи сущностей в базе данных, показано на рисунке 2.
num_part -> nam, needs, sort, place, year
tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_part -> num_trans
num_part, num_trans, data -> name_groat, from, hours
number_s -> name_groat
number_s -> needs
num_part -> num_card
num_el -> num_sil
num_part, num_trans, data -> destin, hours
num_card, date_an -> name_groat, type_groat, year
num_card, date_an -> place, tab_num_lab, lastname_lab
Рисунок 2 — Функциональные зависимости БД лаборатории хлебной базы
3.2 Неизбыточное покрытие множества функциональных зависимостей На рисунках 3−5 представлен ход и результаты построения неизбыточного покрытия множества функциональных зависимостей базы данных лаборатории хлебной базы.
g:
tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place, tab_num_lab, lastname_lab
1. f=g tab_numb -> name, lastname, secondname, birthdate
Проверяем: f |= tab_numb -> name, lastname, secondname, birthdate
[tab_numb]+f = tab_numb
нет=> Множество ФЗ не меняется
2. f=g num_sil -> sort, needs, type
Проверяем: f |= num_sil -> sort, needs, type
[num_sil]+f = num_sil
нет=> Множество ФЗ не меняется
3. f=g num -> lim_weight_c, hours
Проверяем: f |= num -> lim_weight_c, hours
[num]+f = num
нет=> Множество ФЗ не меняется
4. f=g number_el -> lim_weight_el
Проверяем: f |= number_el -> lim_weight_el
[number_el]+f = number_el
нет=> Множество ФЗ не меняется
5. f=g number_el, data -> occupied
Проверяем: f |= number_el, data -> occupied
Рисунок 3 — Построение неизбыточного покрытия множества ФЗ
[number_el, data]+f = number_el, data, lim_weight_el
нет=> Множество ФЗ не меняется
6. f=g num_el -> num_sil
Проверяем: f |= num_el -> num_sil
[num_el]+f = num_el
нет=> Множество ФЗ не меняется
7. f=g num_part -> nam, needs, sort, place, year, num_trans, num_card
Проверяем: f |= num_part -> nam, needs, sort, place, year, num_trans,
num_card
[num_part]+f = num_part
нет=> Множество ФЗ не меняется
8. f=g num_part, data -> name_groat, from, destin, hours
Проверяем: f |= num_part, data -> name_groat, from, destin, hours
[num_part, data]+f = num_part, data, nam, needs, sort, place, year,
num_trans, num_card нет=> Множество ФЗ не меняется
9. f=g number_s -> name_groat, needs
Проверяем: f |= number_s -> name_groat, needs
[number_s]+f = number_s
нет=> Множество ФЗ не меняется
10. f=g num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Проверяем: f |= num_card, date_an -> name_groat, type_groat, year,
place, tab_num_lab, lastname_lab
[num_card, date_an]+f = num_card, date_an
нет=> Множество ФЗ не меняется Рисунок 4 — Построение неизбыточного покрытия множества ФЗ Неизбыточное покрытие:
g:
tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Рисунок 5 — Неизбыточное покрытие множества ФЗ Очевидно, что множество функциональных зависимостей в ходе построения неизбыточного покрытия не изменилось, следовательно, структура базы данных остается прежней.
3.3 Леворедуцированное покрытие множества ФЗ
g: tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
На рисунках 6−8 представлен ход и результаты построения леворедуцированного покрытия множества функциональных зависимостей базы данных лаборатории хлебной базы.
Рисунок 6 — Построение леворедуцированного покрытия множества ФЗ
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
1. number_el, data -> occupied
1.1. number_el, data -> occupied
Проверяем: g |= data -> occupied
нет=> Множество ФЗ не меняется
1.2. number_el, data -> occupied
Проверяем: g |= number_el -> occupied
нет=> Множество ФЗ не меняется
2. num_part, data -> name_groat, from, destin, hours
2.1. num_part, data -> name_groat, from, destin, hours
Проверяем: g |= data -> name_groat, from, destin, hours
нет=> Множество ФЗ не меняется
2.2. num_part, data -> name_groat, from, destin, hours
Проверяем: g |= num_part -> name_groat, from, destin, hours
нет=> Множество ФЗ не меняется.
3. num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
3.1. num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Проверяем: g |= date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
нет=> Множество ФЗ не меняется.
3.2. num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Проверяем: g |= num_card -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab нет=> Множество ФЗ не меняется.
Рисунок 7 — Построение леворедуцированного покрытия множества ФЗ Итог:
g: tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Рисунок 8 — Леворедуцированное покрытие множества ФЗ Очевидно, что множество функциональных зависимостей в ходе построения леворедуцированного покрытия не изменилось, следовательно, структура базы данных остается прежней.
3.4 Праворедуцированное покрытие множества ФЗ На рисунках 9- 13 представлен ход и результаты построения праворедуцированного покрытия множества функциональных зависимостей базы данных лаборатории хлебной базы.
g: tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
Рисунок 9 — Построение праворедуцированного покрытия ФЗ
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
1. tab_numb -> name, lastname, secondname, birthdate
1.1. Если удаляем name
Проверяем: f |= tab_numb -> name
нет=> Множество ФЗ не меняется.
1.2. Если удаляем lastname
Проверяем: f |= tab_numb -> lastname
нет=> Множество ФЗ не меняется.
1.3. Если удаляем secondname
Проверяем: f |= tab_numb -> secondname
нет=> Множество ФЗ не меняется.
1.4. Если удаляем birthdate
Проверяем: f |= tab_numb -> birthdate
нет=> Множество ФЗ не меняется.
2. num_sil -> sort, needs, type
2.1. Если удаляем sort
Проверяем: f |= num_sil -> sort
нет=> Множество ФЗ не меняется.
2.2. Если удаляем needs
Проверяем: f |= num_sil -> needs
нет=> Множество ФЗ не меняется.
2.3. Если удаляем type
Проверяем: f |= num_sil -> type
нет=> Множество ФЗ не меняется.
3. num -> lim_weight_c, hours
3.1. Если удаляем lim_weight_c
Проверяем: f |= num -> lim_weight_c
Рисунок 10 — Построение праворедуцированного покрытия ФЗ нет=> Множество ФЗ не меняется.
3.2. Если удаляем hours
Проверяем: f |= num -> hours
нет=> Множество ФЗ не меняется.
4. number_el -> lim_weight_el
4.1. Если удаляем lim_weight_el
Проверяем: f |= number_el -> lim_weight_el
нет=> Множество ФЗ не меняется.
5. number_el, data -> occupied
5.1. Если удаляем occupied
Проверяем: f |= number_el, data -> occupied
нет=> Множество ФЗ не меняется.
6. Если удаляем -> num_sil
6.1. Если удаляем num_sil
Проверяем: f |= num_el -> num_sil
нет=> Множество ФЗ не меняется.
7. num_part -> nam, needs, sort, place, year, num_trans, num_card
7.1. Если удаляем nam
Проверяем: f |= num_part -> nam
нет=> Множество ФЗ не меняется.
7.2. Если удаляем needs
Проверяем: f |= num_part -> needs
нет=> Множество ФЗ не меняется.
7.3. Если удаляем sort
Проверяем: f |= num_part -> sort
нет=> Множество ФЗ не меняется.
7.4. Если удаляем place
Проверяем: f |= num_part -> place
нет=> Множество ФЗ не меняется.
Рисунок 11 — Построение праворедуцированного покрытия ФЗ
7.5. Если удаляем year
Проверяем: f |= num_part -> year
нет=> Множество ФЗ не меняется.
7.6. Если удаляем num_trans
Проверяем: f |= num_part -> num_trans
нет=> Множество ФЗ не меняется.
7.7. Если удаляем num_card
Проверяем: f |= num_part -> num_card
нет=> Множество ФЗ не меняется.
8. num_part, data -> name_groat, from, destin, hours
8.1. Если удаляем name_groat
Проверяем: f |= num_part, data -> name_groat
нет=> Множество ФЗ не меняется.
8.2. Если удаляем from
Проверяем: f |= num_part, data -> from
нет=> Множество ФЗ не меняется.
8.3. Если удаляем destin
Проверяем: f |= num_part, data -> destin
нет=> Множество ФЗ не меняется.
8.4. Если удаляем hours
Проверяем: f |= num_part, data -> hours
нет=> Множество ФЗ не меняется.
9. number_s -> name_groat, needs
9.1. Если удаляем name_groat
Проверяем: f |= number_s -> name_groat
нет=> Множество ФЗ не меняется.
9.2. Если удаляем needs
Проверяем: f |= number_s -> needs
нет=> Множество ФЗ не меняется.
Рисунок 12 — Построение праворедуцированного покрытия ФЗ
10. num_card, date_an -> name_groat, type_groat, year, place, tab_num_lab, lastname_lab
10.1. Если удаляем name_groat
Проверяем: f |= num_card, date_an -> name_groat
нет=> Множество ФЗ не меняется.
10.2. Если удаляем type_groat
Проверяем: f |= num_card, date_an -> type_groat
нет=> Множество ФЗ не меняется.
10.3. Если удаляем year
Проверяем: f |= num_card, date_an -> year
нет=> Множество ФЗ не меняется.
10.4. Если удаляем place
Проверяем: f |= num_card, date_an -> place
нет=> Множество ФЗ не меняется.
10.5. Если удаляем tab_num_lab
Проверяем: f |= num_card, date_an -> tab_num_lab
нет=> Множество ФЗ не меняется.
Удаление зависимостей вида Х->
Итог: g: tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place, tab_num_lab, lastname_lab
Рисунок 13 — Праворедуцированное покрытие множества ФЗ
3.5 Минимальное покрытие таблица база данные запрос На рисунках 14- 15 представлен ход и результаты построения минимального покрытия множества функциональных зависимостей базы данных лаборатории хлебной базы.
1. Ef (tab_numb):
tab_numb -> name, lastname, secondname, birthdate
2. Ef (num_sil):
num_sil -> sort, needs, type
3. Ef (num):
num -> lim_weight_c, hours
4. Ef (number_el):
number_el -> lim_weight_el
5. Ef (number_el, data):
number_el, data -> occupied
6. Ef (num_el):
num_el -> num_sil
7. Ef (num_part):
num_part -> nam, needs, sort, place, year, num_trans, num_card
8. Ef (num_part, data):
num_part, data -> name_groat, from, destin, hours
9. Ef (number_s):
number_s -> name_groat, needs
10. Ef (num_card, date_an):
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Построение минимального покрытия на основе прямой функциональной определяемости Редуцированное минимальное покрытие
g: tab_numb -> name, lastname, secondname, birthdate
Рисунок 14 — Построение минимального покрытия множества ФЗ
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Рисунок 15 — Минимальное покрытие множества ФЗ
3.6
3.6 Редуцированное минимальное кольцевое покрытие На рисунках 16- 24 представлен ход и результаты построения минимального редуцированного кольцевого покрытия множества функциональных зависимостей базы данных лаборатории хлебной базы.
Минимальное кольцевое покрытие
(tab_numb;) -> name, lastname, secondname, birthdate
(num_sil;) -> sort, needs, type
(num;) -> lim_weight_c, hours
(number_el;) -> lim_weight_el
(number_el, data;) -> occupied
(num_el;) -> num_sil
(num_part;) -> nam, needs, sort, place, year, num_trans, num_card
(num_part, data;) -> name_groat, from, destin, hours
(number_s;) -> name_groat, needs
(num_card, date_an;) -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab.
Рисунок 16 — Построение минимального кольцевого покрытия множества ФЗ Получение кольцевого минимального редуцированого покрытия Естественное характеристическое множество для кольцевого покрытия.
f (C): tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Левая редукция или перенос в правую часть
1. Проверка CF-зависимости:
(tab_numb;) -> name, lastname, secondname, birthdate
1.1. Сформированная CF-зависимость:
() -> name, lastname, secondname, birthdate, tab_numb
Характеристические множества не эквивалентны
2. Проверка CF-зависимости:
(num_sil;) -> sort, needs, type
2.1. Сформированная CFзависимость:
() -> sort, needs, type, num_sil
Характеристические множества не эквивалентны
3. Проверка CF-зависимости:
(num;) -> lim_weight_c, hours
3.1. Сформированная CFзависимость:
() -> lim_weight_c, hours, num
Рисунок 17 — Построение редуцированного минимального кольцевого покрытия множества ФЗ Характеристические множества не эквивалентны
4. Проверка CF-зависимости:
(number_el;) -> lim_weight_el
4.1. Сформированная CFзависимость:
() -> lim_weight_el, number_el
Характеристические множества не эквивалентны
5. Проверка CF-зависимости:
(number_el, data;) -> occupied
5.1. Сформированная CFзависимость:
(data;) -> occupied, number_el
Характеристические множества не эквивалентны
5.2. Сформированная CFзависимость:
(number_el;) -> occupied, data
Характеристические множества не эквивалентны
6. Проверка CF-зависимости:
(num_el;) -> num_sil
6.1. Сформированная CFзависимость:
() -> num_sil, num_el
Характеристические множества не эквивалентны
7. Проверка CF-зависимости:
(num_part;) -> nam, needs, sort, place, year, num_trans, num_card
7.1. Сформированная CFзависимость:
() -> nam, needs, sort, place, year, num_trans, num_card, num_part
Характеристические множества не эквивалентны
8. Проверка CF-зависимости:
(num_part, data;) -> name_groat, from, destin, hours
8.1. Сформированная CFзависимость:
(data;) -> name_groat, from, destin, hours, num_part
Рисунок 18 — Построение редуцированного минимального кольцевого покрытия множества ФЗ
Характеристические множества не эквивалентны
8.2. Сформированная CFзависимость:
(num_part;) -> name_groat, from, destin, hours, data
Характеристические множества не эквивалентны
9. Проверка CF-зависимости:
(number_s;) -> name_groat, needs
9.1. Сформированная CFзависимость:
() -> name_groat, needs, number_s
Характеристические множества не эквивалентны
10. Проверка CF-зависимости:
(num_card, date_an;) -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
10.1. Сформированная CFзависимость:
(date_an;) -> name_groat, type_groat, year, place, tab_num_lab,
lastname_lab, num_card
Характеристические множества не эквивалентны
10.2. Сформированная CFзависимость:
(num_card;) -> name_groat, type_groat, year, place, tab_num_lab,
lastname_lab, date_an
Характеристические множества не эквивалентны Проверка покрытия на праворедуцированность
1. Проверка CF-зависимости:
(tab_numb;) -> name, lastname, secondname, birthdate
2.1. Сформированная CFзависимость:
(tab_numb;) -> lastname, secondname, birthdate
Характеристические множества не эквивалентны
2.2. Сформированная CFзависимость:
(tab_numb;) -> name, secondname, birthdate
Рисунок 19 — Построение редуцированного минимального кольцевого покрытия множества ФЗ
Характеристические множества не эквивалентны
2.3. Сформированная CFзависимость:
(tab_numb;) -> name, lastname, birthdate
Характеристические множества не эквивалентны
2.4. Сформированная CFзависимость:
(tab_numb;) -> name, lastname, secondname
Характеристические множества не эквивалентны
2. Проверка CF-зависимости:
(num_sil;) -> sort, needs, type
3.1. Сформированная CFзависимость:
(num_sil;) -> needs, type
Характеристические множества не эквивалентны
3.2. Сформированная CFзависимость:
(num_sil;) -> sort, type
Характеристические множества не эквивалентны
3.3. Сформированная CFзависимость:
(num_sil;) -> sort, needs
Характеристические множества не эквивалентны
3. Проверка CF-зависимости:
(num;) -> lim_weight_c, hours
4.1. Сформированная CFзависимость:
(num;) -> hours
Характеристические множества не эквивалентны
4.2. Проверка CF-зависимости:
(num;) -> lim_weight_c
Характеристические множества не эквивалентны
4. Проверка CF-зависимости:
(number_el;) -> lim_weight_el
5.1. Сформированная CFзависимость:
Рисунок 20 — Построение редуцированного минимального кольцевого покрытия множества ФЗ
(number_el;)
Характеристические множества не эквивалентны
5. Проверка CF-зависимости:
(number_el, data;) -> occupied
6.1. Сформированная CFзависимость:
(number_el, data;)
Характеристические множества не эквивалентны
6. Проверка CF-зависимости:
(num_el;) -> num_sil
7.1. Сформированная CFзависимость:
(num_el;)
Характеристические множества не эквивалентны
7. Проверка CFзависимости:
(num_part;) -> nam, needs, sort, place, year, num_trans, num_card
8.1. Сформированная CFзависимость:
(num_part;) -> needs, sort, place, year, num_trans, num_card
Характеристические множества не эквивалентны
8.2. Сформированная CFзависимость:
(num_part;) -> nam, sort, place, year, num_trans, num_card
Характеристические множества не эквивалентны
8.3. Сформированная CFзависимость:
(num_part;) -> nam, needs, place, year, num_trans, num_card
Характеристические множества не эквивалентны
8.4. Сформированная CFзависимость:
(num_part;) -> nam, needs, sort, year, num_trans, num_card
Характеристические множества не эквивалентны
8.5. Сформированная CFзависимость:
(num_part;) -> nam, needs, sort, place, num_trans, num_card
Характеристические множества не эквивалентны Рисунок 21 — Построение редуцированного минимального кольцевого покрытия множества ФЗ
8.6. Сформированная CFзависимость:
(num_part;) -> nam, needs, sort, place, year, num_card
Характеристические множества не эквивалентны
8.7. Сформированная CFзависимость:
(num_part;) -> nam, needs, sort, place, year, num_trans
Характеристические множества не эквивалентны
8. Проверка CFзависимости:
(num_part, data;) -> name_groat, from, destin, hours
9.1. Сформированная CFзависимость:
(num_part, data;) -> from, destin, hours
Характеристические множества не эквивалентны
9.2. Сформированная CFзависимость:
(num_part, data;) -> name_groat, destin, hours
Характеристические множества не эквивалентны
9.3. Сформированная CFзависимость:
(num_part, data;) -> name_groat, from, hours
Характеристические множества не эквивалентны
9.4. Сформированная CFзависимость:
(num_part, data;) -> name_groat, from, destin
Характеристические множества не эквивалентны
9. Проверка CFзависимости:
(number_s;) -> name_groat, needs
10.1. Сформированная CFзависимость:
(number_s;) -> needs
Характеристические множества не эквивалентны
10.2. Сформированная CFзависимость:
(number_s;) -> name_groat
Характеристические множества не эквивалентны
10. Проверка CFзависимости:
Рисунок 22 — Построение редуцированного минимального кольцевого покрытия множества ФЗ
(num_card, date_an;) -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
11.1. Сформированная CFзависимость:
(num_card, date_an;) -> type_groat, year, place, tab_num_lab,
lastname_lab
Характеристические множества не эквивалентны
11.2. Сформированная CFзависимость:
(num_card, date_an;) -> name_groat, year, place, tab_num_lab,
lastname_lab
Характеристические множества не эквивалентны
11.3. Сформированная CFзависимость:
(num_card, date_an;) -> name_groat, type_groat, place,
tab_num_lab, lastname_lab
Характеристические множества не эквивалентны
11.4. Сформированная CFзависимость:
(num_card, date_an;) -> name_groat, type_groat, year,
tab_num_lab, lastname_lab
Характеристические множества не эквивалентны
11.5. Сформированная CFзависимость:
(num_card, date_an;) -> name_groat, type_groat, year, place,
lastname_lab
Характеристические множества не эквивалентны
11.6. Сформированная CFзависимость:
(num_card, date_an;) -> name_groat, type_groat, year, place,
tab_num_lab
Характеристические множества не эквивалентны Рисунок 23 — Построение редуцированного минимального кольцевого покрытия множества ФЗ Минимальное редуцированное кольцевое покрытие
C (tab_numb;) -> name, lastname, secondname, birthdate
(num_sil;) -> sort, needs, type
(num;) -> lim_weight_c, hours
(number_el;) -> lim_weight_el
(number_el, data;) -> occupied
(num_el;) -> num_sil
(num_part;) -> nam, needs, sort, place, year, num_trans, num_card
(num_part, data;) -> name_groat, from, destin, hours
(number_s;) -> name_groat, needs
(num_card, date_an;) -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Естественное характеристическое множество
f (C):
tab_numb -> name, lastname, secondname, birthdate
num_sil -> sort, needs, type
num -> lim_weight_c, hours
number_el -> lim_weight_el
number_el, data -> occupied
num_el -> num_sil
num_part -> nam, needs, sort, place, year, num_trans, num_card
num_part, data -> name_groat, from, destin, hours
number_s -> name_groat, needs
num_card, date_an -> name_groat, type_groat, year, place,
tab_num_lab, lastname_lab
Рисунок 24 — Редуцированное минимальное кольцевое покрытие множества ФЗ Таким образом, структура базы данных лаборатории хлебной базы разрабатывалась методом синтеза с помощью построения неизбыточного покрытия, праворедуцированного покрытия, леворедуцированного покрытия, минимального покрытия и редуцированного минимального кольцевого покрытия множества ФЗ. В ходе построения покрытий было установлено, что множества функциональных зависимостей не изменятся, значит, структура базы данных спроектирована достаточно оптимально. На рисунке 25 показаны результирующие таблицы базы данных и их ключи.
R0 = (tab_numb, name, lastname, secondname, birthdate) K0 ={tab_numb}
R1 = (num_sil, sort, needs, type) K1 = { num_sil }
R2 = (num, lim_weight_c, hours) K2 = { num }
R3 = (number_el, lim_weight_el) K3 = { number_el }
R4 = (number_el, data, occupied) K4 = { number_el, data }
R5 = (num_el, num_sil) K5 = { num_el }
R6 = (num_part, nam, needs, sort, place, year, num_trans, num_card)
K6 = { num_part }
R7 = (num_part, data, name_groat, from, destin, hours) K7 = { num_part,
data }
R8 = (number_s, name_groat, needs) K8 = { number_s }
R9 = (num_card, date_an, name_groat, type_groat, year, place,
tab_num_lab, lastname_lab) K9 = { num_card, date_an }
Рисунок 25 — Структура базы данных лаборатории хлебной базы, полученная методом синтеза
4. Оптимизация запросов к базе данных
4.1 Статистика по таблицам базы данных Для иллюстрации статистики по таблицам базы данных лаборатории хлебной базы ниже указаны таблицы базы данных и их поля (в записи жирным отмечены ключевые поля).
— groats (nam, needs, sort, year, place, num_part);
— laborants (tab_num, lastname, name, secondname, birth_date);
— analysis_card (num_card, date_an, lastname_lab, tab_num_lab, num_part_gr, name_groat_an, type_groat_an, place, year);
— transport (num, hours, lim_weight_c);
— grain_elevator (number_el, lim_weight_el);
— current_elev (data, occupied, number_el);
— silo (number_s, lim_weight_s, weight_s, name_groat, type_groat, num_elev, num_part);
— receivs (num_part, num_trans, from, hourrs, name_groat, dat, num_sil);
— dispatch (num_part, num_trans, destin, hourrs, name_groat, data).
Общее число записей в каждой из таблиц:
— T (Groats)=100.
— T (Laborants)=10.
— T (Analysis_card)=100.
— T (Transport)=40.
— T (Grain_elevator)=4.
— T (Current_elev)=50.
— T (Silo)=100.
— T (Receivs)=100.
— T (Dispatch)=100.
a.
4.2 Многотабличный запрос на выборку по условию Найти все партии крупы, полученные начиная с 30−08−10, анализные карточки для которых заполнял лаборант с табельным номером 10.
4.2.1 Выражение для запроса с использованием реляционной алгебры Выражение для запроса с использованием реляционной алгебры показано на рисунке 26.
pr (Groats. nam, needs, sort, year, place, num_part) sel (receivs.dat >{^2010;08−30}
& analysis_card.tab_num_lab=10) (groats/
receivs, analysis. card)
Рисунок 26 — Выражение для запроса с использованием реляционной алгебры
4.2.2 Исходное операционное дерево для запроса Исходное операционное дерево для многотабличного запроса на выборку по условию представлено на рисунке 27.
Рисунок 27 — Исходное операционное дерево запроса
4.2.3 Оптимизированное операционное дерево для запроса Оптимизированное операционное дерево для многотабличного запроса на выборку по условию одной строки представлено на рисунке 28.
Рисунок 28 — Оптимизированное операционное дерево запроса
4.2.4 Исходный запрос на языке SQL
Текст исходного запроса на языке SQL показан на рисунке 29.
SELECT * FROM groats JOIN (reseivs JOIN analysis_card ON reseivs.num_part=analysis_card.num_part_gr) ON groats.num_part=reseivs.num_part ; WHERE (reseivs.dat > {^2010;08−30} AND analysis_card.tab_num_lab=10); INTO CURSOR q Browse | |
Рисунок 29 — Исходный запрос на языке SQL
4.2.5 Оптимизированный запрос на языке SQL
Текст оптимизированного запроса на языке SQL показан на рисунке 30.
SELECT num_part_gr, name_groat_an, type_groat, place, year FROM analysis_card WHERE analysis_card.tab_num_lab=10; INTO CURSOR q1 SELECT num_part, name_groat FROM reseivs WHERE reseivs. dat > {^2010;08−30}; INTO CURSOR q2 SELECT * FROM groats; INTO CURSOR q3 SELECT * FROM t3 INNER JOIN (t2 INNER JOIN t1 ON t1. num_part_gr=t2.num_part) ON t3. num_part=t2.num_part; INTO CURSOR q Browse | |
Рисунок 30 — Оптимизированный запрос на языке SQL
4.2.6 Расчет сложности оптимизированного запроса Рассчитаем сложность оптимизированного запроса. Для подзапроса q21 выпишем статистику по таблицам и произведем расчеты.
Число записей в каждом столбце таблицы analysis_card:
— V (num_part_gr, analysis_card)=100.
— V (name_groat_an, analysis_card)=50.
— V (type_groat, analysis_card)=20.
— V (place, analysis_card)=100.
— V (year, analysis_card)=20.
— V (tab_num_lab, analysis_card)=50.
Длина одной записи в поле каждого из перечисленных типов:
— L (num_part_gr)=4 байтa.
— L (name_groat_an)=30 байт.
— L (type_groat)=30 байт.
— L (place)=40 байт.
— L (year)=4 байтa.
— L (tab_num_lab)=4 байта.
— L (lastname_lab)=40 байт.
— L (date_an)=8 байт.
— L (num_card)=4 байт.
Расчет сложности подзапроса q21отображен на рисунке 31.
T (q21)=T (analysis_card)/V (tab_num_lab, analysis_card)=100/50=2. Vol (q21)=T (q21)*L (q21); L (q21)= L (num_part_gr) + L (name_groat_an) + L (type_groat) + L (place) + L (year) + L (tab_num_lab)+ L (lastname_lab) + L (date_an)+ L (num_card)= =4+30+30+40+4+4+4+40+8+4 = 168 байт. Vol (q21)=2*168=448 байт. | |
Рисунок 31- Сложность подзапроса q21
Для подзапроса q22 выпишем статистику по таблицам и произведем расчеты. Число записей в каждом столбце, необходимом для запроса, из таблицы reseivs:
— V (num_part, reseivs)=100.
— V (name_groat, reseivs)=50.
— V (dat, reseivs)=50.
— V (num_trans, reseivs)=40.
— V (from, reseivs)=100.
— V (hours, reseivs)=2.
— V (num_sil, reseivs)=100.
Длина одной записи в поле каждого из перечисленных типов:
— L (num_part)=4 байтa.
— L (name_groat)=30 байт.
— L (dat) =8 байт.
— L (num_trans) =4 байта.
— L (from) =40 байт.
— L (hours) =4 байта.
— L (num_sil) =4 байта.
Расчет сложности подзапроса показан на рисунке 32.
T (q22)=T (reseivs)*1/3=100*1/3?33. Статистика по запросу: Vol (q22)=T (q22)*L (q22); L (q22)= L (num_part) + L (name_groat) + L (dat) + L (num_trans) + L (from) + +L (hours) + L (num_sil) = 4+30+8+4+40+4+4 = 98 байт. Vol (q22)=33*98= 3234 байта. | |
Рисунок 32 — Сложность подзапроса q22
Для подзапроса q23 статистика по таблице не меняется, поскольку осуществляется операция проекции над результатом подзапроса q22.
T (q23)=T (reseivs)*1/3=100*1/3?33. L (q23)= L (num_part) + L (name_groat) = 4+30= 34 байта. Vol (q23)=33*34= 1122 байта. | |
Рисунок 33 — Сложность подзапроса q23
Для подзапроса q24 статистика по таблице не меняется, поскольку осуществляется операция проекции над результатом подзапроса q21.
T (q24)=T (analysis_card)/V (tab_num_lab, analysis_card)=100/50=2. L (q24)= L (num_part_gr) + L (name_groat_an) + L (type_groat) + L (place) + L (year) =4+30+30+40+4+4= 112 байт. Vol (q24)=2*112=224 байта. | |
Рисунок 34 — Сложность подзапроса q24
Подзапрос q25 — естественное слияние результатов подзапросов q23 и q24. Расчет сложности подзапроса q25 показан на рисунке 35.
T (q25)=T (q23)*T (q24)/max (V (num_part_gr, q23), V (num_part, q24))= =33*2/max (20,25)=3. L (q25)= L (num_part) + L (name_groat) =4+30= 34 байта. Vol (q25)=3*34=102 байта. | |
Рисунок 35 — Сложность подзапроса q25
Подзапрос q26 не меняет статистику подзапроса q25, поскольку это операция проекции. Расчет сложности подзапроса q26 показан на рисунке 36.
T (q26)=T (q25)=3. L (q26)= L (num_part) + L (name_groat) =4+30=34 байта. Vol (q26)=3*34=102 байта. | |
Рисунок 36 — Сложность подзапроса q26
Подзапрос q27 не меняет статистику по таблице groats, поскольку это операция проекции.
Число записей в каждом столбце из таблицы groats:
— V (num_part, groats)=100;
— V (name, groats)=50;
— V (sort, groats)=15;
— V (needs, groats)=20;
— V (place, groats)=100;
— V (year, groats)=20.
Длина одной записи в поле каждого из перечисленных типов:
— L (num_part)=4 байтa;
— L (nam)=30 байт;
— L (needs)=30 байт;
— L (sort)= 4 байтa;
— L (place)=40 байт;
— L (year)=4 байтa.
Расчет сложности подзапроса q27 показан на рисунке 37.
T (q27)=T (groats)=100. Vol (q27)=T (q27)*L (q27); L (q27)= L (num_part) + L (nam)+ L (needs) =4+30+30= 64 байта. Vol (q1)=100*64=6400 байт. | |
Рисунок 37 — Сложность подзапроса q27
Подзапрос q28 — естественное слияние результатов подзапросов q27 и q26. Расчет сложности подзапроса q28 показан на рисунке 38.
T (q28)=T (q27)*T (q26)/max (V (num_part, q26), V (num_part, q27))= =3*100/max (25,100)=3. L (q25)= L (num_part) + L (name_groat) =4+30= 34 байта. Vol (q25)=3*34=102 байта. | |
Рисунок 38 — Сложность подзапроса q28
Сложность всего оптимизированного запроса рассчитывается как сумма сложностей промежуточных подзапросов. Таким образом, она составляет: Vol (q2)=448+3234+1122+224+102+102+6400+102=11 734 байта.
4.3
4.3 Многотабличный запрос на выборку по условию Найти всех лаборантов, работавших с анализами 17 и 10 партий крупы.
4.3.1 Выражение для запроса с использованием реляционной алгебры
pr (laborants.tab_num, lastname, name, secondname, birthdate) sel (analylis_card.num_part = 10 V analylis_card.num_part = 17) (laborants/
analysis_card)
4.3.2 Исходное операционное дерево для запроса Исходное операционное дерево для многотабличного запроса на выборку по условию представлено на рисунке 4.
Рисунок 4. Исходное операционное дерево запроса
4.3.3
4.3.3 Оптимизированное операционное дерево для запроса Оптимизированное операционное дерево для многотабличного запроса на выборку по условию одной строки представлено на рисунке 5.
Рисунок 5. Оптимизированное операционное дерево для запроса
4.3.4 Исходный запрос на языке SQL
SELECT * FROM laborants INNER JOIN analysis_card ON
analysis_card.tab_num_lab=laborants.tab_num ;
WHERE (analysis_card.num_part_gr = 10 OR
analysis_card.num_part_gr = 17);
INTO Cursor q
Browse
4.3.5
4.3.5 Оптимизированный запрос на языке SQL
SELECT * FROM laborants
INTO Cursor q1
Browse
SELECT * FROM analysis_card
WHERE (analysis_card.num_part_gr = 10 OR
analysis_card.num_part_gr = 17);
INTO Cursor q2
Browse
SELECT * FROM q1 INNER JOIN q2 ON
q2.tab_num_lab=q1.tab_num;
INTO Cursor q
Browse
4.3.6 Расчет сложности запроса Для подзапроса q1
Число записей в каждом столбце таблицы laborants:
V (tab_num, laborants)=10;
V (lastname, laborants)=10;
V (name, laborants)=10;
V (secondname, laborants)=10;
V (birth_date, laborants)=10;
Длина одной записи в поле каждого из перечисленных типов:
L (tab_num)=4 байтa;
L (lastname)=40 байт;
L (name)=40 байт;
L (secondname)=40 байт;
L (birth_date)=8 байт.
Сложность запроса:
T (q1)=T (laborants)=10.
Статистика по запросу:
Vol (q1)=T (q1)*L (q1);
L (q1) = L (tab_num) + L (lastname) + L (name) + L (secondname) + +L (birth_date) = 4+40+40+40+8 = 132 байтa.
Vol (q1)=10*132=1320 байт.
Для подзапроса q2
Число записей в каждом столбце, необходимом для запроса, из таблицы analysis_card:
V (num_card, analysis_card)=100;
V (date_an, analysis_card)=40;
V (lastname_lab, analysis_card)=10;
V (tab_num_lab, analysis_card)=10;
V (num_part_gr, analysis_card)=100;
V (name_groat_an, analysis_card)=20;
V (num_part, analysis_card)=100.
Длина одной записи в поле каждого из перечисленных типов:
L (num_part)=4 байтa;
L (name_groat)=30 байт;
L (tab_num_lab)= 4 байтa.
Сложность запроса:
T (q2−1)=T (analysis_card)/V (analysis_card, num_part)=100/100=1.
T (q2−2)= T (analysis_card)/V (analysis_card, num_part)=100/100=1.