База данный "Хозяйственный учет футбольного клуба"
Рисунок 2.3 - Исходное множество функционаьных зависимостей
В ходе построения неизбыточнго покрытия множество функциональных зависимостей не изменилось.
2.4.2 Построение леворедуцированного покрытия
В ходе построения леворедуцированного покрытия множество функциональных зависимостей не изменилось.
2.4.3 Построение праворедуцированного покрытия
В ходе построения праворедуцированного покрытия множество функциональных зависимостей не изменилось.
2.4.4 Построение классов эквивалентности
Этапы построения классов эквивалентности представлены на рисунке 2.8.
1. Ef( sp, np ):
sp, np -> Fam, Im, Otch, pol, dateborn, datevidachi, kemvidan, country, city, street, numstreet, numflat, dolgnost
Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat -> sp, np
sp, np -> num_room
2. Ef( sp_pl, np_pl ):
sp_pl, np_pl -> date, rost, ves, staff, number, status
date, staff, number, status -> sp_pl, np_pl
3. Ef( num_p ):
num_p -> square, naznachenie
4. Ef( num_room ):
num_room -> room
5. Ef( num_zal ):
num_zal -> type_zal
num_zal -> num_p
6. Ef( code_obj ):
code_obj -> kol, date, balance
7. Ef( code_inv ):
code_inv -> firm_inv, model_inv; code_inv -> code_obj
8. Ef( code_tec ):
code_tec -> firm_tec, model_tec; code_tec -> code_obj
9. Ef( code_meb ):
code_meb -> firm_meb, dlina, width, height, color; code_meb -> code_obj
10. Ef( inv_number_INV ):
inv_number_INV -> code_inv
11. Ef( inv_number_TEC ):
15. Ef( inv_number_MEB_out ):
inv_number_MEB_out -> inv_number_MEB
inv_number_MEB_out -> date_out_meb
16. Ef( inv_number_INV, date_IinZal ):
inv_number_INV, date_IinZal -> num_zal
17. Ef( inv_number_TEC, date_TecInP ):
inv_number_TEC, date_TecInP -> num_р
18. Ef( inv_number_MEB, date_MebInP ):
inv_number_MEB, date_MebInP -> num_р
19. Ef( code_balls ):
code_balls -> material
code_balls -> code_inv
20. Ef( code_gate ):
code_gate -> height_gate, shirina, kind
code_gate -> code_inv
21. Ef( code_trenager ):
code_trenager -> type
code_trenager -> code_inv
22. Ef( code_TV ):
code_TV -> diagonal, screen
code_TV -> code_tec
23. Ef( code_refreg ):
code_refreg -> height_ref, widht_ref, depht_ref, sum_sq_polok, com_volume, user_volume
code_refreg -> code_tec
24. Ef( code_vacuum ):
code_vacuum -> moshnost_v
code_vacuum -> code_tec
25. Ef( code_bed ):
code_bed -> type_bed
code_bed -> code_meb
26. Ef( code_table ):
code_table -> type_table, material_table
code_table -> code_meb
27. Ef( code_shkaf ):
code_shkaf -> type_shkaf
code_shkaf -> code_meb
Рисунок 2.4 - Этапы построения классов эквивалентности
2.4.5 Построение минимального покрытия на основе прямой функциональной определяемости
Этапы построения минимального покрытия на основе прямой функциональной определяемости представлены на рисунке 2.5.
2. Проверка: f \ Ef(sp, np) |= sp, np -> sp, np?
Да => заменяем sp, np -> Fam, Im, Otch, pol, dateborn, datevidachi,
kemvidan, country, city, street, numstreet, numflat, dolgnost и sp, np ->
num_room на sp, np -> Fam, Im, Otch, pol, dateborn, datevidachi,
kemvidan, country, city, street, numstreet, numflat, dolgnost, num_room.
5. Проверка: f \ Ef(num_zal) |= num_zal -> num_zal?
Да => заменяем num_zal -> type_zal и num_zal -> num_p на num_zal ->
type_zal, num_p.
6. Проверка: f \ Ef(code_inv) |= code_inv -> code_inv?
Да => заменяем code_inv -> firm_inv, model_inv и code_inv -> code_obj
на code_inv -> firm_inv, model_inv, code_obj.
7. Проверка: f \ Ef(code_tec) |= code_tec -> code_tec?
Да => заменяем code_tec -> firm_tec, model_tec и code_tec ->
code_obj на code_tec -> firm_tec, model_tec, code_obj.
8. Проверка: f \ Ef(code_meb) |= code_meb -> code_meb?
Да => заменяем code_meb -> firm_meb, dlina, width, height, color и
code_meb -> code_obj на code_meb -> firm_meb, dlina, width, height,
color, code_obj.
9. Проверка: f \ Ef(inv_number_INV_out) |= inv_number_INV_out ->
inv_number_INV_out?
Да => заменяем inv_number_INV_out -> inv_number_INV и
inv_number_INV_out -> date_out_inv на inv_number_INV_out ->
inv_number_INV, date_out_inv.
10. Проверка: f \ Ef(inv_number_TEC_out) |= inv_number_TEC_out ->
inv_number_TEC_out?
Да => заменяем inv_number_TEC_out -> inv_number_TEC и
inv_number_TEC_out -> date_out_tec на inv_number_TEC_out ->
inv_number_TEC, date_out_tec.
11. Проверка: f \ Ef(inv_number_MEB_out) |= inv_number_MEB_out ->
inv_number_MEB_out?
Да => заменяем inv_number_MEB_out -> inv_number_MEB и
inv_number_MEB_out -> date_out_meb на inv_number_MEB_out ->
inv_number_MEB, date_out_meb.
12. Проверка: f \ Ef(code_balls) |= code_balls -> code_balls?
Да => заменяем code_balls -> material и code_balls -> code_inv на
code_balls -> material, code_inv.
13. Проверка: f \ Ef(code_gate) |= code_gate -> code_gate?
Да => заменяем code_gate -> height_gate, shirina, kind и code_gate ->
code_inv на code_gate -> height_gate, shirina, kind, code_inv.
Рисунок 2.5 - Этапы построения минимального покрытия на основе прямой функциональной определяемости
Редуцированное минимальное покрытие представлено на рисунке 2.6
Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat
> sp, np
sp_pl, np_pl
> date, rost, ves, staff, number, status
date, staff, number, status
> sp_pl, np_pl
num_p
> square, naznachenie
num_room
> room
code_obj
> kol, date, balance
inv_number_INV
> code_inv
inv_number_TEC
> code_tec
inv_number_MEB
> code_meb
inv_number_INV, date_IinZal
> num_zal
inv_number_TEC, date_TecInP
> num_р
inv_number_MEB, date_MebInP
> num_р
sp, np
> Fam, Im, Otch, pol, dateborn, datevidachi, kemvidan, country, city, street, numstreet, numflat, dolgnost, num_room
num_zal
> type_zal, num_p
code_inv
> firm_inv, model_inv, code_obj
code_tec
> firm_tec, model_tec, code_obj
code_meb
> firm_meb, dlina, width, height, color, code_obj
inv_number_INV_out
> inv_number_INV, date_out_inv
inv_number_TEC_out
> inv_number_TEC, date_out_tec
inv_number_MEB_out
> inv_number_MEB, date_out_meb
code_balls
> material, code_inv
code_gate
> height_gate, shirina, kind, code_inv
code_trenager
> type, code_inv
code_TV
> diagonal, screen, code_tec
code_refreg
> height_ref, widht_ref, depht_ref, sum_sq_polok, com_volume, user_volume, code_tec
code_vacuum
> moshnost_v, code_tec
code_bed
> type_bed, code_meb
code_table
> type_table, material_table, code_meb
code_shkaf
> type_shkaf, code_meb
Рисунок 2.6 - Редуцированное минимальное покрытие
2.4.6 Построение редуцированного минимального кольцевого покрытия
Определение CF-зависимостей по классам эквивалентности. Построение кольцевого покрытия
Минимальное кольцевое покрытие представлено на рисунке 2.7
( sp, np; Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat; )
-> pol, datevidachi, kemvidan, dolgnost, num_room
( sp_pl, np_pl; date, staff, number, status; ) -> rost, ves
( num_p; ) -> square, naznachenie
( num_room; ) -> room
( num_zal; ) -> type_zal, num_p
( code_obj; ) -> kol, date, balance
( code_inv; ) -> firm_inv, model_inv, code_obj
( code_tec; ) -> firm_tec, model_tec, code_obj
( code_meb; ) -> firm_meb, dlina, width, height, color, code_obj
( inv_number_INV; ) -> code_inv
( inv_number_TEC; ) -> code_tec
( inv_number_MEB; ) -> code_meb
( inv_number_INV_out; ) -> inv_number_INV, date_out_inv
( inv_number_TEC, _out; )
( inv_number_MEB_out; ) -> inv_number_MEB, date_out_meb
( inv_number_TEC_out; ) -> date_out_tec
( inv_number_INV, date_IinZal; ) -> num_zal
( inv_number_TEC, date_TecInP; ) -> num_р
( inv_number_MEB, date_MebInP; ) -> num_р
( code_balls; ) -> material, code_inv
( code_gate; ) -> height_gate, shirina, kind, code_inv
( code_trenager; ) -> type, code_inv
( code_TV; ) -> diagonal, screen, code_tec
( code_refreg; ) -> height_ref, widht_ref, depht_ref, sum_sq_polok,
com_volume, user_volume, code_tec
( code_vacuum; ) -> moshnost_v, code_tec
( code_bed; ) -> type_bed, code_meb
( code_table; ) -> type_table, material_table, code_meb
( code_shkaf; ) -> type_shkaf, code_meb
Рисунок 2.7 - Минимальное кольцевое покрытие
Получение кольцевого минимального редуцированного покрытия
Естественное характеристическое множество для кольцевого покрытия представлено на рисунке 2.8.
f(C):
sp, np -> Fam, Im, Otch, dateborn, country, city, street, numstreet,
numflat
Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat -> sp,
np
Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat -> pol,
datevidachi, kemvidan, dolgnost, num_room
sp_pl, np_pl -> date, staff, number, status
date, staff, number, status -> sp_pl, np_pl
date, staff, number, status -> rost, ves
code_tec -> firm_tec, model_tec, code_obj
code_meb -> firm_meb, dlina, width, height, color, code_obj
inv_number_INV -> code_inv
inv_number_TEC -> code_tec
inv_number_MEB -> code_meb
inv_number_INV_out -> inv_number_INV, date_out_inv
inv_number_MEB_out -> inv_number_MEB, date_out_meb
inv_number_TEC_out -> date_out_tec
inv_number_INV, date_IinZal -> num_zal
inv_number_TEC, date_TecInP -> num_р
inv_number_MEB, date_MebInP -> num_р
code_balls -> material, code_inv
code_gate -> height_gate, shirina, kind, code_inv
code_trenager -> type, code_inv
code_TV -> diagonal, screen, code_tec
code_refreg -> height_ref, widht_ref, depht_ref, sum_sq_polok,
com_volume, user_volume, code_tec
code_vacuum -> moshnost_v, code_tec
code_bed -> type_bed, code_meb
code_table -> type_table, material_table, code_meb
code_shkaf -> type_shkaf, code_meb
Рисунок 2.8 - Естественное характеристическое множество для кольцевого покрытия
Минимальное редуцированное кольцевое покрытие представлено на рисунке 2.9.
( sp, np; Fam, Im, Otch, dateborn, country, city, street, numstreet,
numflat; ) -> pol, datevidachi, kemvidan, dolgnost, num_room
( sp_pl, np_pl; date, staff, number, status; ) -> rost, ves
( num_p; ) -> square, naznachenie
( num_room; ) -> room
( num_zal; ) -> type_zal, num_p
( code_obj; ) -> kol, date, balance
( code_inv; ) -> firm_inv, model_inv, code_obj
( code_tec; ) -> firm_tec, model_tec, code_obj
( code_meb; ) -> firm_meb, dlina, width, height, color, code_obj
( inv_number_INV; ) -> code_inv
( inv_number_TEC; ) -> code_tec
( inv_number_MEB; ) -> code_meb
( inv_number_INV_out; ) -> inv_number_INV, date_out_inv
( inv_number_TEC, _out; )
( inv_number_MEB_out; ) -> inv_number_MEB, date_out_meb
( inv_number_TEC_out; ) -> date_out_tec
( inv_number_INV, date_IinZal; ) -> num_zal
( inv_number_TEC, date_TecInP; ) -> num_р
( inv_number_MEB, date_MebInP; ) -> num_р
( code_balls; ) -> material, code_inv
( code_gate; ) -> height_gate, shirina, kind, code_inv
( code_trenager; ) -> type, code_inv
( code_TV; ) -> diagonal, screen, code_tec
( code_refreg; ) -> height_ref, widht_ref, depht_ref, sum_sq_polok,
com_volume, user_volume, code_tec
( code_vacuum; ) -> moshnost_v, code_tec
( code_bed; ) -> type_bed, code_meb
( code_table; ) -> type_table, material_table, code_meb
( code_shkaf; ) -> type_shkaf, code_meb
Рисунок 2.9 - Минимальное редуцированное кольцевое покрытие
Естественное характеристическое множество представлено на рисунке 2.10.
R0 = ( sp, np; Fam, Im, Otch, dateborn, country, city, street, numstreet,
numflat, pol, datevidachi, kemvidan, dolgnost, num_room ) K0 = { sp, np; Fam, Im, Otch, dateborn, country, city, street, numstreet, numflat }
R1 = ( sp_pl, np_pl; date, staff, number, status, rost, ves ) K1 = { sp_pl, np_pl; date, staff, number, status }
R2 = ( num_p, square, naznachenie ) K2 = { num_p }
R3 = ( num_room, room ) K3 = { num_room }
R4 = ( num_zal, type_zal, num_p ) K4 = { num_zal }
R5 = ( code_obj, kol, date, balance ) K5 = { code_obj }
R6 = ( code_inv, firm_inv, model_inv, code_obj ) K6 = { code_inv }
R7 = ( code_tec, firm_tec, model_tec, code_obj ) K7 = { code_tec }
R8 = ( code_meb, firm_meb, dlina, width, height, color, code_obj ) K8 = { code_meb }
R9 = ( inv_number_INV, code_inv ) K9 = { inv_number_INV }
R10 = ( inv_number_TEC, code_tec ) K10 = { inv_number_TEC }
R11 = ( inv_number_MEB, code_meb ) K11 = { inv_number_MEB }
R12 = ( inv_number_INV_out, inv_number_INV, date_out_inv ) K12 = { inv_number_INV_out }
R13 = ( inv_number_TEC, _out ) K13 = { inv_number_TEC, _out }
R14 = ( inv_number_MEB_out, inv_number_MEB, date_out_meb ) K14 = {inv_number_MEB_out }
R15 = ( inv_number_TEC_out, date_out_tec ) K15 = { inv_number_TEC_out }
R16 = ( inv_number_INV, date_IinZal, num_zal ) K16 = { inv_number_INV, date_IinZal }
R17 = ( inv_number_TEC, date_TecInP, num_р ) K17 = { inv_number_TEC, date_TecInP }
R18 = ( inv_number_MEB, date_MebInP, num_р ) K18 = { inv_number_MEB, date_MebInP }
R19 = ( code_balls, material, code_inv ) K19 = { code_balls }
R20 = ( code_gate, height_gate, shirina, kind, code_inv ) K20 = { code_gate }
R21 = ( code_trenager, type, code_inv ) K21 = { code_trenager }
R22 = ( code_TV, diagonal, screen, code_tec ) K22 = { code_TV }
R23 = ( code_refreg, height_ref, widht_ref, depht_ref, sum_sq_polok,
com_volume, user_volume, code_tec ) K23 = { code_refreg }
R24 = ( code_vacuum, moshnost_v, code_tec ) K24 = { code_vacuum }
R25 = ( code_bed, type_bed, code_meb ) K25 = { code_bed }
R26 = ( code_table, type_table, material_table, code_meb ) K26 = { code_table }
R27 = ( code_shkaf, type_shkaf, code_meb ) K27 = { code_shkaf }
Рисунок 2.10 - Естественное характеристическое множество
2.5 Концептуальная модель
Исходная концептуальная модель базы данных представлена на рисунке 2.15.
Рисунок 2.15 - Концептуальная модель (ER-диаграмма) базы данных
После проведения всех этапов минимизации концептуальная модель не изменилась.
2.6 Построение запросов
2.6.1 Построение первого запроса
2.6.1.1 Исходный запрос
Первый запрос формулируется следующим образом: «Вывести коды партий футбольных ворот типа «юниорские», которые производятся фирмой Star, относятся к модели K325, поступили не раньше 2007 года и находятся в спортивных залах «Общей физической подготовки» ».
Текст первого запроса на языке SQL представлен на рисунке 2.16.
Риунок 2.16 - Текст первого запроса на языке SQL
Исходное операционное дерево для первого запроса представлено на рисунке 2.17.
Рисунок 2.17 - Исходное операционное дерево для первого запроса
Оценка стоимости исходного запроса представлена на рисунке 2.18.
Рисунок 2.18 - Оценка стоимости исходного запроса
2.6.1.2 Минимизированный запрос
Текст минимизированного первого запроса на SQL представлен на рисунке 2.19.
SELECT code_obj from gate WHERE gate.kind="Стандартные"
INTO CURSOR C1
SELECT code_obj FROM inventar WHERE
(ALLTRIM(inventar.firm)="Mizuno" AND
ALLTRIM(inventar.model)="K235") INTO CURSOR C2
SELECT code_obj from arrival_object WHERE
((arrival_object.date)>={^2007-01-01}) INTO CURSOR d5
SELECT * FROM c1 INNER JOIN c2 ON c1.code_obj=c2.code_obj
INTO CURSOR C3
SELECT * FROM c3 INNER JOIN d5 ON d5.code_obj=c3.code_obj_a
INTO CURSOR C6
SELECT code_obj_a,inv_number from invnum_inv INNER JOIN C6
ON ALLTRIM(code_obj_a)==ALLTRIM(invnum_inv.code_obj)
INTO CURSOR C7
SELECT code_obj_a,num_p from inv_in_zal INNER JOIN C7 ON inv_in_zal.inv_number=c7.inv_number INTO CURSOR C9
SELECT num_p from zal WHERE
ALLTRIM(zal.type_zal)="Общей физической подготовки"
INTO CURSOR C10
SELECT DISTINCT code_obj_a from C9 INNER JOIN C10
ON C9.num_p=C10.num_p
Рисунок 2.19 - Текст минимизированного первого запроса
Минимизированное операционное дерево для первого запроса представлено на рисунке 2.20.
Рисунок 2.20 - Операционное дерево для минимизированного первого запроса
Оценка стоимости минимизированного запроса представлена на рисунке 2.21.
Рисунок 2.21- Оценка стоимости минимизированного первого запроса
2.6.2 Построение второго запроса
Словесная формулировка запроса следующая: «Вывести номера спортивных залов, в которых хранится инвентарь, принадлежащий обеим партиям: 522715, 413998».
Текст запроса на языке SQL представлен на рисунке 2.22.
SELECT num_p FROM zal WHERE ALLTRIM(zal.type_zal)=''
INTO CURSOR CR1
SELECT num_p,code_del FROM del,CR1 INTO CURSOR CR4
SELECT CR1.num_p,inv_number FROM CR1 INNER JOIN inv_in_zal
ON CR1.num_p==inv_in_zal.num_p INTO CURSOR CR2
SELECT num_p,code_obj FROM CR2 INNER JOIN invnum_inv
ON (invnum_inv.inv_number==CR2.inv_number) DISTINCT
INTO CURSOR CR3
SELECT DISTINCT num_p from CR4 WHERE NOT EXISTS
(SELECT CR3.num_p FROM CR3 WHERE (CR4.num_p==CR3.num_p
AND CR4.code_del==CR3.code_obj))into CURSOR CR5
SELECT CR1.num_p,CR5.num_p FROM CR1 LEFT JOIN CR5 ON
CR1.num_p=CR5.num_p INTO CURSOR CR6
SELECT DISTINCT num_p FROM CR1 WHERE NOT EXISTS (Select CR6.num_p_b from CR6 WHERE CR1.num_p=CR6.num_p_b)
Страницы: 1 , 2, 3