Разработка базы данных "Видеопрокат" и приложения, позволяющие выполнять обработку данных фирмы, страница 4

Для установления связи между отношениями КЛИЕНТ и ДИСК  создадим дополнительное связующее отношение, состоящее из ключевых атрибутов связываемых отношений. Так как нам необходимо знать когда диск был взят клиентом и когда возвращен, а так же стоимость проката  за сутки данного дика в связующее отношение помимо ключевых атрибутов добавим еще три дополнительных атрибута: дату открытия; дату закрытия и код стоимости, а так же комментарии к сделке. Надо отметить что наверно логичнее было бы хранить стоимость проката за сутки конкретного диска в сущности ДИСК, но тогда при изменении цены проката данного диска,  мы бы не смогли определить по какой цене раннее сдавался этот диск.

ПРОКАТ (Код операции, Паспорт, Код диска, Дата открытия, Дата закрытия, Код стоимости, Коментарии).

Теперь отношение КЛИЕНТ можно связать с отношением ПРОКАТ связью 1:М по атрибуту Паспорт. Отношение ДИСК можно связать с отношением ПРОКАТ также связью 1:М по атрибуту Код диска.

Пусть, например, Дорохин С.А с номером и серией паспорта 6201334567 брал в прокат диски ВАЛЛ·И, Город ангелов, Звездный путь с кодами 2, 4, 5 – 18 и19 мая 2009г., и вернул диск с кодом 2 – 19 мая, а Судницын Д.А. с номером паспорта 2106770554  взял диск звездный путь с кодом 6 – 19 мая и вернул его 23 мая. Тогда сущность ПРОКАТ будет иметь вид:

ПРОКАТ

Код операции

Паспорт

Код диска

Дата Открытия

Дата закрытия

Код стоимости

Коментарии

5

6201334567

2

18.05.2009

19.05.2009

30,00

12

6201334567

4

19.05.2009

30,00

13

6201334567

5

19.05.2009

30,00

25

2106770554

6

19.05.2009

23.05.2009

30,00

Для установления связи М:М между отношениями ДИСК и ПОСТАВЩИК создадим связующее отношение ПОКУПКА.

В предметной области связь между этими объектами наполнена дополнительным смыслом. Важно знать ни только Поставщика который поставил данный диск но и стоимость по которой он был куплен и дату покупки. Поэтому в связующее отношение помимо ключевых атрибутов добавим два дополнительных атрибута Стоимость и Дата покупки.

ПОКУПКА (Код покупки, Код диска, Код поставщика, Стоимость, Дата покупки)

Отношения ДИСК и ПОСТАВЩИК можно связать с отношением ПОКУПКА связью типа 1:М.

Отношение ПОКУПКИ будет заполняться по мере совершения каждой покупки.

ПОКУПКИ

Код диска

Код поставщика

Стоимость

Дата покупки

1

1

300,00

10.10.2008

2

2

250,00

15.02.2009

3

1

280,00

10.10.2008

6

3

320,00

16.02.2009

8

2

240,00

15.12.2008

Для устранения связи между объектами Фильм и Актер создадим дополнительное связующее отношение ФИЛЬМ_АКТЕР (Название фильма, ФИ ). Теперь  объект ФИЛЬМ можно связать  с отношением  ФИЛЬМ_АКТЕР связью 1:М  по атрибуту название фильма. Объект АКТЕР можно связать с отношением  ФИЛЬМ_АКТЕР связью 1:М  по атрибуту ФИ актера.

Пусть, например, в фильме Форсаж2 в главных ролях снимались следующие актеры: Вин Дизель, Пол Уокер, Хью Джекмен. В фильме ВАЛЛИ снимались Вин Дизель и Николас Кейдж. Тогда отношение ФИЛЬМ_АКТЕР будет иметь вид

Название фильма

ФИ

Форсаж2

Вин Дизель

Форсаж2

Пол Уокер

Форсаж2

Хью Джекмен

ВАЛЛИ

Вин Дизель

ВАЛЛИ

Николас Кейдж

Теперь можно построить схему БД.



3.4. Текущее состояние БД

Таблица ДИСК:

Таблица ФИЛЬМ:

Таблица АКТЕР:

Таблица Фильм_актер:

Таблица ПОСТАВЩИК:

Таблица ПОКУПКА:

Таблица КЛИЕНТ:

Таблица ПРОКАТ:

Таблица СТОИМОСТЬ:

4. Запросы к БД

4.1. Запросы к БД

В системе возможны различные запросы пользователей на поиск информации в БД.

Рассмотрим ряд запросов, запишем их вид на языке SQL, и приведем

Запрос 1. 

Вывести список дисков которые в данный момент находятся в стенах видеопроката.  Список этих дисков будет состоять из тех дисков, которые возвращены и находятся в наличии, а также тех дисков  которые ни разу не выдавались и находятся в наличии. Для реализации этого запроса необходимо использовать объединение двух запросов «_Диски_в_наличии_которые_ни_разу_не_выдавлись» и «_Возврвщеные _диски»

«_Диски_в_наличии_которые_ни_разу_не_выдавлись»:

SELECT ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Год, ФИЛЬМ.Жанр, ФИЛЬМ.Режиссер, ФИЛЬМ.Продолжительность, ДИСК.Звук

FROM (ФИЛЬМ INNER JOIN ДИСК ON (ФИЛЬМ.КодФильма = ДИСК.КодФильма) AND (ФИЛЬМ.КодФильма = ДИСК.КодФильма)) LEFT JOIN ПРОКАТ ON ДИСК.КодДиска = ПРОКАТ.КодДиска

WHERE ((ПРОКАТ.КодДиска) Is Null) AND ((ДИСК.Наличие)=True);

«_Возврвщеные _диски»

SELECT ДИСК.КодДиска, ФИЛЬМ.Название, ФИЛЬМ.Год, ФИЛЬМ.Жанр, ФИЛЬМ.Режиссер, ФИЛЬМ.Продолжительность, ДИСК.Звук, ДИСК.Наличие, Last(ПРОКАТ.ДатаЗакрытия) AS [Last-ДатаЗакрытия]

FROM ФИЛЬМ INNER JOIN (ДИСК INNER JOIN ПРОКАТ ON (ДИСК.КодДиска = ПРОКАТ.КодДиска) AND (ДИСК.КодДиска = ПРОКАТ.КодДиска)) ON (ФИЛЬМ.КодФильма = ДИСК.КодФильма) AND (ФИЛЬМ.КодФильма = ДИСК.КодФильма)