
- •Федеральное агенство связи государственное образовательное учреждение
- •Задание на проектирование
- •Описание предметной области
- •Создание логической и физической модели
- •Проверка средствами Validator
- •Доказательство решенности задач Прямое проектирование в субд Oracle
- •Работа sql-запросов
- •Обратное проектирование
- •Заключение
Описание предметной области
Номер каждого животного уникален в пределах БД
Номер каждого сотрудника уникален в пределах БД
Каждый сотрудник может работать с одним или несколькими животными, или не работать с животными
Каждый вид животного питается только одним типом корма в сезон
Один поставщик может поставлять один или несколько типов корма.
Клетки животных имеют индексы 1x и 2x, которые не располагаются рядом, в такие клетки рекомендуется поселять животных, которые несовместимы друг с другом (например, хищников и их добычу).
Создание логической и физической модели
База данных состоит из нескольких сущностей-таблиц:
Должность – содержит информацию о категориях сотрудников, зарплате категорий, а также о доступе конкретных категорий к клеткам животных
Сотрудники – информация о самих сотрудниках, включая номер должности
Животные – включает в себя информацию о конкретном животном, его вид, пол, возраст, вес и т.п.
Потомство – информация о потомстве пары особей
Вид животного – по аналогии с должностью, содержит информацию о категориях животных.
Корма – содержит информацию о поставщике, типе корма, его имеющемся количестве.
Также имеются вспомогательные сущности, которые образовались в ходе нормализации. Логическая и физическая модели представлены ниже.
Логическая
модель:
Физическая
модель, с указанными типами данных:
Так как несколько сотрудников могут ухаживать за несколькими животными, необходимо реализовать связь «многие-ко-многим», для этого создается ассоциативная таблица «Раб_с_жив» средствами ERwin.
Также в таблице «Потомство» необходимо учесть, что номера животных-родителей не должны совпадать. Например, пользователь БД может по ошибке указать, что отец лисенка также является одновременно его матерью. Для этого необходимо прописать ограничение в таблице.
Проверка средствами Validator
Изначально проверка в этой программе выдала довольно много ошибок, но они были только двух типов: не определён альтернативный ключ таблицы, и отсутствует индекс в таблице.
Обе эти ошибки устраняются добавлением альтернативного ключа и индекса соответственно. В результате добиваемся отсутствия ошибок.
Доказательство решенности задач Прямое проектирование в субд Oracle
Необходимо произвести прямое проектирование в СУБД Oracle, но для этого сначала необходимо устранить ошибки проектирования
В результате добиваемся отсутствия ошибок
Также необходимо проверить работу ограничения в таблице «Потомство»
Как видно, нельзя выставить одинаковое значение в столбцы «Ном_жив» и «Ном_пары»
Работа sql-запросов
Получить список и общее число служащих зоопарка, либо служащих данной
категории полностью, по стажу работы в зоопарке, по половому признаку, возрасту, размеру заработной платы.
select таб_ном, фамилия, пол, должн.зп, стаж_лет from сотр
join должн on сотр.ном_долж=должн.ном_долж;
Получить перечень и общее число зоопарков, с которыми был произведен обмен животными в целом или животными только указанного вида.
select назв_зооп, животные.ном_жив, передача, дата_обм from зооп_обм
join животные on зооп_обм.ном_жив=животные.ном_жив;
Получить список и общее число служащих зоопарка, имеющих доступ к указанному виду животных либо к конкретной особи.
select сотр.таб_ном, фамилия, животные.ном_жив from сотр
join раб_с_жив on сотр.таб_ном=раб_с_жив.таб_ном
join животные on животные.ном_жив=раб_с_жив.ном_жив order by таб_ном;
Получить перечень и общее число всех животных в зоопарке либо животных указанного вида, живших в указанной клетке все время пребывания в зоопарке, по половому признаку, возрасту, весу, росту.
select животные.ном_жив, кличка, клетки_жив.номер_кл, пол_жив, возр_жив,
вес_жив, рост_жив, дата_поступ
from животные join клетки_жив on животные.ном_жив=клетки_жив.ном_жив
where номер_кл=11;
Получить перечень и общее число нуждающихся в теплом помещении на зиму, полностью животных только указанного вида или указанного возраста.
select животные.ном_жив, кличка, вид_жив.назв_вида from животные
join вид_жив on вид_жив.ном_вида=животные.ном_вида
join тепл_пом on вид_жив.ном_вида=тепл_пом.ном_вида
where тепл_пом.тепл_пом='Да';
Получить перечень и общее число животных, которым поставлена указанная прививка, либо переболевших некоторой болезнью, по длительности пребывания в зоопарке, половому признаку, возрасту, признаку наличия и количеству потомства.
select животные.ном_жив, кличка, привив.наим_пр, пол_жив, возр_жив, дата_поступ, (select count(потомство.ном_жив) from потомство where потомство.ном_жив=животные.ном_жив) as "Кол-во потомства" from животные
join привив on привив.ном_жив=животные.ном_жив where lower(привив.наим_пр) like '%бешенств%';
Получить перечень всех животных, совместимых с указанным видом, либо только тех животных, которых необходимо переселить, или тех, которые нуждаются в теплом помещении.
select животные.ном_жив, кличка from животные
join тепл_пом on животные.ном_вида=тепл_пом.ном_вида
where
тепл_пом.тепл_пом='Да';
Получить перечень и общее число поставщиков кормов полностью, либо поставляющих только определенный корм, поставлявших в указанный период, по количеству поставляемого корма, цене, датам поставок.
select поставщики.ном_пост, назв_орг, типы_корм.назв_типа, дата_пост from поставщики
join корма on корма.ном_пост=поставщики.ном_пост
join типы_корм on типы_корм.ном_типа=корма.ном_типа where типы_корм.ном_типа=1 and
дата_пост>'19-ФЕВ-08';
Получить перечень и объем кормов, производимых зоопарком полностью, либо только тех кормов, в поставках которых зоопарк не нуждается (обеспечивает себя сам).
select типы_корм.назв_типа, поставщики.назв_орг from поставщики
join корма on корма.ном_пост=поставщики.ном_пост
join типы_корм on корма.ном_типа=типы_корм.ном_типа
where поставщики.ном_пост=1;
Получить перечень и общее число животных полностью, либо указанного вида, которым необходим определенный тип кормов, в указанном сезоне, возрасте или круглый год.
select животные.ном_жив, кличка from животные
join кормление on кормление.ном_вида=животные.ном_вида
join сезоны on кормление.ном_сез=сезоны.ном_сез
join типы_корм on типы_корм.ном_типа=кормление.ном_типа
where lower(назв_сез) like '%лето%' and lower(назв_типа) like '%живой%';