исунок 2.7 - Построение редуцированного минимального кольцевого покрытия|
month_r, year_r -> arenda, kommunal_yslygi, reklama, vnutr_rashodi month_d, year_d -> viruchka_emploee employeeid -> month_d, year_d month, year -> rashodid, dohodid emloyeeid -> oklad, premia, avans, zarplata productid -> artikulid supplierid -> nameЛевая редукция или перенос в правую часть1. Проверка CF-зависимости: ( data_supply, vremy_postavki; ) -> supplierid2. Проверка CF-зависимости: ( clientid, productid, data_voz, vremy_voz; ) -> employeeid3. Проверка CF-зависимости: ( month_r, year_r; ) -> arenda, kommunal_yslygi, reklama, vnutr_rashodi4. Проверка CF-зависимости: ( month_d, year_d; ) -> viruchka_emploee5. Проверка CF-зависимости: ( employeeid; ) -> month_d, year_d | | | Рисунок 2.8 - Построение редуцированного минимального кольцевого покрытия|
6. Проверка CF-зависимости: ( month, year; ) -> rashodid, dohodid7. Проверка CF-зависимости: ( emloyeeid; ) -> oklad, premia, avans, zarplata8. Проверка CF-зависимости: ( productid; ) -> artikulid9. Проверка CF-зависимости: ( supplierid; ) -> nameПроверка покрытия на праворедуцированность1. Проверка CF-зависимости: ( data_supply, vremy_postavki; ) -> supplierid2. Проверка CF-зависимости: ( clientid, productid, data_voz, vremy_voz; ) -> employeeid3. Проверка CF-зависимости: ( month_r, year_r; ) -> arenda, kommunal_yslygi, reklama, vnutr_rashodi4. Проверка CF-зависимости: ( month_d, year_d; ) -> viruchka_emploee | | | Рисунок 2.9 - Построение редуцированного минимального кольцевого покрытия|
5. Проверка CF-зависимости: ( employeeid; ) -> month_d, year_d6. Проверка CF-зависимости: ( month, year; ) -> rashodid, dohodid7. Проверка CF-зависимости: ( emloyeeid; ) -> oklad, premia, avans, zarplata8. Проверка CF-зависимости: ( productid; ) -> artikulid9. Проверка CF-зависимости: ( supplierid; ) -> nameМинимальное редуцированное кольцевое покрытиеC ( data_supply, vremy_postavki; ) -> supplierid ( clientid, productid, data_voz, vremy_voz; ) -> employeeid ( month_r, year_r; ) -> arenda, kommunal_yslygi, reklama, vnutr_rashodi ( month_d, year_d; ) -> viruchka_emploee ( employeeid; ) -> month_d, year_d ( month, year; ) -> rashodid, dohodid ( emloyeeid; ) -> oklad, premia, avans, zarplata ( productid; ) -> artikulid ( supplierid; ) -> name | | | Рисунок 2.10 - Построение редуцированного минимального кольцевого покрытия|
Естественное характеристическое множествоf(C): data_supply, vremy_postavki -> supplierid clientid, productid, data_voz, vremy_voz -> employeeid month_r, year_r -> arenda, kommunal_yslygi, reklama, vnutr_rashodi month_d, year_d -> viruchka_emploee employeeid -> month_d, year_d month, year -> rashodid, dohodid emloyeeid -> oklad, premia, avans, zarplata productid -> artikulid supplierid -> nameR0 = ( data_supply, vremy_postavki, supplierid ) K0 = { data_supply, vremy_postavki }R1 = ( clientid, productid, data_voz, vremy_voz, employeeid ) K1 = { clientid, productid, data_voz, vremy_voz }R2 = ( month_r, year_r, arenda, kommunal_yslygi, reklama, vnutr_rashodi) K2 = { month_r, year_r }R3 = ( month_d, year_d, viruchka_emploee ) K3 = { month_d, year_d }R4 = ( employeeid, month_d, year_d ) K4 = { employeeid }R5 = ( month, year, rashodid, dohodid ) K5 = { month, year }R6 = ( emloyeeid, oklad, premia, avans, zarplata ) K6 = { emloyeeid }R7 = ( productid, artikulid ) K7 = { productid } R8 = ( supplierid, name ) K8 = { supplierid } | | | Рисунок 2.11 - Построение редуцированного минимального кольцевого покрытия2.5 ER-схема базы данныхВ приложении А приведены схемы базы данных до минимизации и после минимизации. Построение запросов на SQL2.5.1 Запрос на выборку2.5.1.1 Словесная формулировка запросаПеречислить всех клиентов и их паспортные данные, которые приобрели продукцию компании Fuzafungin.2.5.1.2 Текст запроса на языке SQLТекст запроса на языке SQL представлен на рисунке 2.20.|
SELECT clients.name, clients.serial_pas, clients.number_pas, product.name_product, orders.data_zakaza, orders.orderid as Number_Order;FROM ((orders JOIN sotrud s ON orders. clientid = clients. clientid) JOIN product ON orders.productid = product.productid); WHERE (product.name_product = "Fuzafungin") | | |
Рисунок 2.20 - Текст запроса на языке SQL 2.5.1.3 Исходное дерево запросаИсходное дерево для запроса представлено на рисунке 2.21|
q2 q1 product clients orders | | | Рисунок 2.21- Исходное дерево запроса2.6.1.4 Расчет сложности запросаРасчет сложности исходного запроса приведен ниже., (2.1)где - результат естественного соединения таблиц;- таблицы, участвующие в соединении; - псевдонимы, используемые вместо имен таблиц для сокращения записи; - операция естественного соединения., (2.2) (2.3)где - число записей в таблице ; - число записей в таблице С; - число записей в таблице O; - число различных значений в столбце clientid таблицы Clients; - число различных значений в столбце clientid таблицы Orders.,,,., (2.4), (2.5)где - число блоков, записанных в таблице ; - длина одной записи таблицы в блоках; - длина одной записи таблицы в байтах;- размер одного блока.Очевидно, что, (2.6)где - объем в байтах поля ;- объем в байтах поля ;,,...., (2.7) ,,,,. (2.8) .Очевидно, что, (2.9) ,,,... (2.10)где - операция селекции с логической формулой .Формула имеет вид:, (2.11),, (2.12) .Так как операция селекции не изменяет структуру таблицы, то,.Так как операция проекции располагается последней, то ее не учитывают при расчете сложности запроса. Окончательно имеем:, (2.13).2.1 2.2 2.3 2.3.1 2.3.1.1 2.3.1.2 2.3.1.3 2.3.1.4 2.3.1.5 Оптимизированное дерево запросаОптимизированное дерево для запроса представлено на рисунке 2.22|
q3 q2 product clients orders | | | Рисунок 2.22 - Оптимизированное дерево запросаТекст оптимизированного запроса на языке SQLТекст оптимизированного запроса представлен на рисунке 2.23|
SELECT product.productid, product.name_product;FROM product;WHERE (product.name_product = " Fuzafungin ") INTO TABLE kSELECT sotruds...name, sotruds..serial_pas, sotruds...number_pas, orders.data_zakaza, orders.orderid as Number_Order; FROM ((orders JOIN clients ON orders. sotrudid = sotruds. sotrudid) JOIN k ON k.productid = orders.productid); | | | Рисунок 2.232.3.1.6 Расчет сложности оптимизированного запросаРасчет сложности оптимизированного запроса приведен ниже., (2.14)где - операция селекции с логической формулой .Формула имеет вид:, (2.15),,, (2.16).Так как операция селекции не изменяет структуру таблицы, то,., (2.17)где - результат естественного соединения таблиц;- таблицы, участвующие в соединении; - псевдонимы, используемые вместо имен таблиц для сокращения записи; - операция естественного соединения., (2.18) (2.19),,,., (2.20), (2.21)где - число блоков, записанных в таблице ; - длина одной записи таблицы в блоках; - длина одной записи таблицы в байтах;- размер одного блока.Очевидно, что, (2.22)где - объем в байтах поля ;- объем в байтах поля ;,,...., (2.23),,,,, (2.24).Очевидно, что, (2.25),,,...Так как операция проекции располагается последней, то ее не учитывают при расчете сложности запроса. Окончательно имеем:, (2.26)2.5.2 Запрос на деление2.5.2.1 Словесная формулировка запросаВыбрать всех клиентов, которые приобрели все без исключения препараты, перечисленные в отдельном списке - отдельной таблице. 2.5.2.2 Текст запроса на языке SQLТекст запроса представлен на рисунке 2.23|
SELECT COUNT(*);FROM product INTO ARRAY ArSELECT clients.clientid, clients.name;FROM ((clients JOIN orders ON orders.clientid = clients.clientid) JOIN Ar ON orders.productid = Ar.productid);GROUP BY clients.clientid, clients.name; HAVING COUNT(*)=Ar; | | | Рисунок 2.232.5.2.3 Исходное дерево запросаДерево запроса представлено на рисунке 2.24. q2 q1 product clients clients ordersРисунок 2.42.5.2.4 Расчет сложности запросаРасчет сложности исходного запроса приведен ниже. , (2.27) где - результат естественного соединения таблиц; - таблицы, участвующие в соединении; - псевдонимы, используемые вместо имен таблиц для сокращения записи; - операция естественного соединения. , (2.28) (2.29) где - число записей в таблице ; - число записей в таблице С; - число записей в таблице O; - число различных значений в столбце clientid таблицы Clients; - число различных значений в столбце clientid таблицы Orders. , , , . , (2.30) , (2.31) где - число блоков, записанных в таблице ; - длина одной записи таблицы в блоках; - длина одной записи таблицы в байтах; - размер одного блока. Очевидно, что , (2.32) где - объем в байтах поля ; - объем в байтах поля ; , , . . . . , (2.33) , , , , . (2.34) . Очевидно, что , (2.35) , , , . . . (2.36) где - операция проекции из таблицы атрибутов . . . , , . Так как операция группировки является последней, то для нее не производится расчет сложности. Окончательно имеем: , (2.37) 2.5.2.5 птимизированное дерево запросаОптимизированное дерево запроса представлено на рисунке 2.25.|
q2 q1 clients product orders | | | Рисунок 2.252.5.2.6 Текст оптимизированного запроса на языке SQLТекст оптимизированного запроса представлен на рисунке 2.26 |
SELECT COUNT(*); FROM product INTO ARRAY Ar SELECT clients.clientid, clients.name; FROM ((orders JOIN Ar ON orders.productid = Ar.productid) JOIN clients ON orders.clientid = clients.clientid); GROUP BY clients.clientid, clients.name; HAVING COUNT(*)=Ar; | | |
Рисунок 2.26 2.5.2.7 Расчет сложности оптимизированного запросаРасчет сложности оптимизированного запроса приведен ниже.. (2.38),,,, (2.39).Очевидно, что, (2.40),,,... (2.41), (2.42),,.Очевидно, что, (2.43),,,... (2.44)где - операция проекции из таблицы атрибутов ...,,.Так как операция группировки является последней, то для нее не производится расчет сложности.Окончательно имеем:, (2.45)3 Рабочий проект 3.1 Связи таблицСвязи таблиц представлены на рисунке 3.1Рисунок 3.13.2 Внешний вид формыВ состав проекта входит форма Расходы аптеки, которая представлена на рисунке 3.2. Рисунок 3.23.3 Функциональные тесты3.3.1 Тест 1Тест на проверку построения отчета в Excel. Входные данные: запрос на выборку из базы данных.Выходные данные: результирующая таблица.Работа теста приведена на рисунке 3.4.Рисунок 3.4ЗаключениеВ ходе выполнения курсовой работы была достигнута цель работы - проектирование базы данных аптеки.Для достижения цели был решен ряд задач: составление описания предметной области; составление словаря понятий и терминов; построение исходной модели (ER-диаграммы) базы данных; определение функциональных зависимостей; синтез схемы базы данных на основании функциональных зависимостей; построение оптимизированной концептуальной модели; построение запросов на выборку.Библиографический список1. Атре, Ш., Структурный подход к организации баз данных. / [Текст] : Атре, Ш. - М.: Финансы и статистика, 1983. - 320 с.2. Бойко, В.В., Проектирование баз данных информационных систем. / [Текст] : Бойко, В.В., Савинков, В.М., - М.: Финансы и статистика, 1989. - 351 с.3. Гарсия-Молина, Гектор, Ульман, Джеффри, Д., Уидом, Дженнифер Системы баз данных. Полный курс. : Пер. с англ. - М. : Издательский дом “Вильямс”, 2003. - 188 с. : ил. 4. Дейт, К., Руководство по реляционной СУБД DB2. / [Текст] : Дейт, К. - М.: Финансы и статистика, 1988. - 320 с. 5. Джексон, Г., Проектирование реляционных баз данных для использования с микроЭВМ. / [Текст] : Джексон, Г., -М.: Мир, 1991. - 252 с. 6. Кириллов, В.В., Структуризованный язык запросов (SQL). / [Текст] : Кириллов, В.В., - СПб.: ИТМО, 1994. - 80 с. 7. Мартин, Дж., Планирование развития автоматизированных систем. / [Текст] : Мартин, Дж., - М.: Финансы и статистика, 1984. - 196 с. 8. Мейер, М., Теория реляционных баз данных. / [Текст] : Мейер, М.,- М.: Мир, 1987. - 608 с. 9. Тиори, Т., Проектирование структур баз данных. / [Текст] : Тиори, Т., Фрай, Дж., В 2 кн., - М.: Мир, 1985. Кн. 1. - 287 с.: Кн. 2. - 320 с. 10. Ульман, Дж., Базы данных на Паскале. / [Текст] : Ульман, Дж., - М.: Машиностроение, 1990. - 386 с. 11. Хаббард, Дж., Автоматизированное проектирование баз данных. / [Текст] : Хаббард, Дж., - М.: Мир, 1984. - 294 с. 12. Цикритизис, Д., Модели данных. / [Текст] : Цикритизис, Д., Лоховски, Ф., - М.: Финансы и статистика, 1985. - 344 с. Приложение АER - схемы базы данныхНа рисунке А.1 приведен вариант схемы базы данных до минимизации.Рисунок - А.1На рисунке А.2 приведен вариант схемы базы данных после минимизации.Рисунок - А.2Приложение БКод программыКод запроса с созданием отчета в Excel представлен на рисунке Б.1 - Б.2.|
LOCAL objExcel, lnrowSELECT clients.name, clients.serial_pas, clients.number_pas, product.name_product, orders.data_zakaza;FROM clients, orders, product;INTO CURSOR cur_report;WHERE (clients.clientid=orders.clientid) AND (orders.data_zakaza="22/01/05") AND (product.name_product="Acer")objExcel=CreateObject("Excel.Application")WITH objExcel .Visible=.T. .Workbooks.add .Columns[1].ColumnWidth=20 .Columns[2].ColumnWidth=12 .Columns[3].ColumnWidth=10 .Columns[4].ColumnWidth=15 .Columns[5].ColumnWidth=7 | | | Рисунок - Б.1|
.Range("A1:E1").Select WITH .Selection .MergeCells=.t. ENDWITH WITH .ActiveCell .Value = "Клиенты" .Font.Size = 14 ENDWITH lnrow = 2 SELECT cur_report SCAN lnrow = lnrow + 1 .Cells(lnrow,1).value = cur_report.name .Cells(lnrow,2).value = cur_report.serial_pas .Cells(lnrow,3).value = cur_report.number_pas .Cells(lnrow,4).value = cur_report.name_product .Cells(lnrow,5).value = cur_report.data_zakaza ENDSCAN ENDWITH | | | Рисунок - Б.2
Страницы: 1, 2, 3
|