Проектирование схемы данных

ВВЕДЕНИЕ

В результате проектирования информационной системы проектной организации должны быть получены база данных и прикладная программа, обеспечивающая интерфейс между пользователем и базой данных. В процессе выполнения работы необходимо решить следующие задачи:

· Спроектировать схему данных;

· Согласно полученной схеме, создать необходимые таблицы, предварительно определив тип данных каждого их поля;

· Реализовать указанные в задании запросы;

· Создать представления, имеющие смысл для данной предметной области;

· Создать триггеры и ограничения целостности для поддержания целостности данных в базе данных;


-

ПРОЕКТИРОВАНИЕ ИНФОРМАЦИОННОЙ СИСТЕМЫ ПРЕДСТАВИТЕЛЬСТВА ТУРИСТИЧЕСКОЙ ФИРМЫ В ЗАРУБЕЖНОЙ СТРАНЕ

Проектирование схемы данных

Рис 1.1 – Диаграмма базы данных

Рассмотрим полученные таблицы:

Таблица Описание
airplane_race Таблица, которая хранит данные о рейсах самолетов
excurs Таблица экскурсий, содержащая список всех возможных экскурсий
excurs_agency Таблица, хранит в себе список доступных экскурсионных агентств, позволяя избежать избыточности и аномалии обновлений
excurs_summary Является связующей между таблицами excurs и excurs_agency, а также имеет связь с таблицей tourists.
hotels Таблица, служит для хранения информации об отелях.
income_category Таблица, является справочником категорий расходов, позволяет избежать избыточности и аномалии обновлений
income_summary Таблица, служит для хранения информации одоходах представительства
outcome_summary Таблица, служит для хранения информации о расходах представительства
tourist Таблица, служит для хранения информации о туристе
tours Являетсясвязующейдлятаблицtourist, type_tourist, hotels, airplanes_race
type_tourist Является справочником для двух возможных категорий туристов

Рис1.2 – Описаниетаблиц

 

Таблицы:

airplane_race:

· _id - ПервичныйключБД

· name – Атрибут, служащий для хранения наименования рейса

· cost – Стоимость перелета рейсом.

excurs:

· _id - Первичный ключ БД

· name - Атрибут, служащий для хранения наименования экскурсий.

· cost – Стоимость экскурсии

 

 

excurs_agency:

· _id - ПервичныйключБД

· name - Атрибут, служащий для хранения наименования агентств

· multiplyCost – коэффициент стоимости экскурсии у агентства

excurs_summary:

· _id - Первичный ключ БД

· tourist_id – Внешний ключ, служит для связи с таблицей tourists

· excurs_id - Внешний ключ, служит для свези с таблицей excurs

· agency_id – Внешний ключ, служит для свези с таблицей excurs_agency

· date – Атрибут, который хранит дату проведения экскурсии

hotels:

· _id - Первичный ключ БД

· name - Атрибут, служащий для хранения наименования отелей

· cost – Стоимость размещения в отеле

income_category:

· _id - ПервичныйключБД

· name - Атрибут, служащий для хранения наименования категорий расходов

income_summary:

· _id - ПервичныйключБД

· income_id – Внешний ключ, служит для свези с таблицей income_category

· total - Атрибут, служащий для хранения суммы дохода

· date – Атрибут, служащий для хранения даты поступления дохода

· tour_id – Внешний ключ, служит для свези с таблицей type_tourist

outcome_summary:

· _id - ПервичныйключБД

· outcome_id – Внешний ключ, служит для свези с таблицей income_category

· total - Атрибут, служащий для хранения суммы дохода

· date – Атрибут, служащий для хранения даты поступления расхода

· tour_id – Внешний ключ, служит для свези с таблицей type_tourist

tourist:

· _id - Первичный ключ БД

· fio – Атрибут, служащий для хранения ФИО туриста

· passport - Атрибут, служащий для хранения паспортных данных туриста

· sex - Атрибут, служащий для хранения пола туриста

· birthday - Атрибут, служащий для хранения даты рождения туриста

· hasVisa - Атрибут, служащий для хранения информации о наличии визы

 

tours:

· _id - Первичный ключ БД

· tourist_id- Первичный ключ БД для связи с таблицей tourist

· type_tourist_id- Первичный ключ БД для связи с таблицей type_tourist

· hotel_id- Первичный ключ БД для связи с таблицей hotels

· start_race_id- Первичный ключ БД для связи с таблицей airplanes_race, и обозначает рейс, которым турист пребывает в страну

· end_race_id- Первичный ключ БД для связи с таблицей airplanes_race, и обозначает рейс, которым турист убывает из страны

· start_day - Атрибут, служащий для хранения даты начала тура

· end_date - Атрибут, служащий для хранения даты окончания тура

type_tourist:

· _id - ПервичныйключБД

· name - Атрибут, служащий для хранения наименования категорий туристов


 

Создание запросов

 

1) Сформировать список туристов для таможни в целом и по указанной категории.

SELECT tourist.fio, tourist.passport

FROM tourist INNERJOINtours

ON tours.tourist_id = tourist._id

WHERE type_tourist_id = 2

 

Рис 1.3Результат запроса

 

2) Сформировать списки на расселение по указанным гостиницам в целом и указанной категории.

SELECT tourist.fio, tours.hotel_room_n, tours.start_day, end_date, hotels.name

FROM tourist INNERJOINtours

ON tourist._id = tours.tourist_id INNERJOINhotels

ON tours.hotel_id = hotels._id

WHERE hotels._id = 1 AND tours.type_tourist_id = 1

 

Рис 1.4Результат запроса

 

3) Получить количество туристов, побывавших в стране за определенный период в целом и по определенной категории.

SELECT tourist.fio ASФИО,COUNT(tourist.fio)AS [Количествопосещений]

FROM tourist INNER JOIN tours

ON tourist._id = tours.tourist_id JOIN type_tourist

ON tours.type_tourist_id = type_tourist._id

WHERE(type_tourist_id = 1)AND((start_day BETWEEN'2015-05-01'AND'2015-05-31')

AND(end_date BETWEEN'2015-01-01'AND'2015-09-09'))

GROUP BY tourist.fio

Рис 1.5Результат запроса

 

4) Получить сведения о конкретном туристе: сколько раз был в стране, даты прилета/отлета, в каких гостиницах останавливался, какие экскурсии и в каких агентствах заказывал.

SELECT fio, start_day, end_date, hotels.name

FROM tourist INNERJOINtours

ON tourist._id = tours.tourist_id INNERJOIN

ON tours.hotel_id = hotels._id

WHERE tourist_id = 1

 

Рис 1.6Результатзапроса

 

SELECTfio, excurs.name, excurs_agency.name

FROM tourist INNERJOINexcurs_summary

ON tourist._id = excurs_summary.tourist_id INNERJOIN

ON excurs_summary.excurs_id = excurs._id INNERJOINexcurs_agency

ON excurs_summary.agency_id = excurs_agency._id

WHERE excurs_summary.tourist_id = 1

 

Рис 1.7Результат запроса

5) Получить список гостиниц, в которых производится расселение туристов, с указанием количества занимаемых номеров и проживавших в них человек за определенный период.

SELECThotels.name,COUNT(tourist_id)AS [Кол. проживающих],COUNT(DISTINCT

hotel_room_n)AS [Кол. зан. номеров]

FROM hotels INNERJOINtours

ON hotels._id = tours.hotel_id

WHERE tours.start_day BETWEEN'01.01.2001'AND'01.01.2016'

GROUPBY hotels.name

Рис 1.8Результат запроса

6) Получить общее количество туристов, заказавших экскурсии за определенный период.

SELECT COUNT(DISTINCT tourist_id)

FROM excurs_summary

WHEREDATEBETWEEN'01.05.2015'AND'01.01.2016'

7) Выбрать самые популярные экскурсии и самые качественные экскурсионные агентства.

SELECT name,COUNT(name)as [Количествозаказов]

FROM excurs INNERJOINexcurs_summary

ON excurs_summary.excurs_id = excurs._id

GROUPBY name

ORDERBY [Количествозаказов] DESC

Рис 1.9 Результатзапроса

SELECT name,COUNT(name)AS [Количествозаказов]

FROM excurs_agency INNERJOINexcurs_summary

ON excurs_summary.agency_id = excurs_agency._id

GROUPBY name

ORDERBY [Количествозаказов] DESC

Рис 1.10Результат запроса

8) Получить данные о загрузке указанного рейса самолета на определенную дату: количество мест.

 

SELECTname,COUNT(name)AS [Загруженностьрейсанадень]

FROM airplanes_race INNERJOINtours

ON airplanes_race._id = tours.start_race_id OR airplanes_race._id = tours.end_race_id

WHERE (start_day ='2015-05-11'OR end_date ='2015-05-11')AND airplanes_race._id = 2

GROUPBY name

 

Рис 1.11Результат запроса

9) Получить полный финансовый отчет в целом и для определенной категории туристов.

SELECT income_category.name,SUM(outcome_summary.total)AS [Расходы],

SUM(income_summary.total)AS [Доходы]

FROM outcome_summary INNER JOIN income_category ON income_category._id

outcome_summary.outcome_idINNER JOIN income_summary ON income_category._id

income_summary.income_id

WHERE outcome_summary.tour_id = 2 OR income_summary.tour_id = 2

GROUP BY income_category.name

Рис 1.12Результат запроса

10) Получить данные о расходах и доходах за определенный период: обслуживание самолета, гостиница, экскурсии, визы, расходы представительства и т.п.

SELECT name,SUM(DISCTINCT outcome_summary.total)AS [Расходы],SUM(DISTINCT

income_summary.total)AS [Доходы]

FROM outcome_summary INNER JOIN income_category ON income_category._id

outcome_summary.outcome_idINNER JOIN income_summary ON income_category._id = income_summary.income_id

WHERE outcome_summary.DATEBETWEEN'01.01.2007'AND'01.12.2015'

OR income_summary.DATEBETWEEN'01.01.2007'AND'01.12.2015'

GROUP BY name

Рис 1.13Результат запроса

11) Вычислить рентабельность представительства (соотношение доходов и расходов).

SELECT SUM(DISCTINCT outcome_summary.total)AS [Расходы],SUM(DISTINCT

income_summary.total)AS [Доходы]

FROM outcome_summary INNER JOIN income_category ON income_category._id =

outcome_summary.outcome_idINNER JOIN income_summary ON income_category._id =

income_summary.income_id

WHERE outcome_summary.DATEBETWEEN'01.01.2007'AND'01.12.2015'

OR income_summary.DATEBETWEEN'01.01.2007'AND'01.12.2015'

 

Рис 1.14Результат запроса

12) Получить сведения о туристах указанного рейса: список группы, гостиницы

 

SELECT tourist.fio AS [Списокрейса]

FROM tourist INNERJOIN tours

ON tours.tourist_id = tourist._id INNERJOINairplanes_race

ON airplanes_race._id = tours.start_race_id OR airplanes_race._id = tours.end_race_id

WHERE airplanes_race._id = 1

GROUPBY fio

Рис 1.15Результат запроса

SELECT name as [Списокгостиниц]

FROM hotels INNERJOIN tours

ON tours.hotel_id = hotels._id

WHERE tours.end_race_id = 1 OR tours.start_race_id = 1

GROUPBY name

Планы запросов

· Получить список гостиниц, в которых производится расселение туристов, с указанием количества занимаемых номеров и проживавших в них человек за определенный период.

SELECT hotels.name,COUNT(tourist_id)AS [Кол. проживающих],COUNT(DISTINCT

hotel_room_n)AS [Кол. зан. номеров]

FROM hotels INNERJOINtours

ON hotels._id = tours.hotel_id

WHERE tours.start_day BETWEEN'01.01.2001'AND'01.01.2016'

GROUPBY hotels.name

Рисунок 1.16 План запроса

1) Сканирование кластерного индекса всей таблицы tours, выходные столбцы hotel_id, hotel_room_n.

2) Просмотр определенного диапазона строк кластеризованного индекса таблицы hotels.

3) Происходит вложенный цикл по таблицам hotels и tours.

4) Сортировка данных ввода таблицы hotels.

5) Статистическое выражение потока, считает число строк на входе(Duration) и возвращает результат подсчёта.

6) Вычисляет новые значения по имеющимся в строке значениям.

7) Сортировка данных ввода таблицы hotels.

8) Статистическое выражение потока, считает число строк на входе(Duration) и возвращает результат подсчёта.

9) Вычисляет новые значения по имеющимся в строке значениям.

10) Соединение таблиц слиянием (INNER JOIN).

11) Вычисляет новые значения по имеющимся в строке значениям.

12) Добавление к результатам запроса.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: