Files
databases/report.tex
2024-10-08 14:53:52 +03:00

236 lines
12 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass[a4paper, final]{article}
%\usepackage{literat} % Нормальные шрифты
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
\usepackage{tabularx}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry}
\usepackage{ragged2e} %для растягивания по ширине
\usepackage{setspace} %для межстрочного интервала
\usepackage{moreverb} %для работы с листингами
\usepackage{indentfirst} % для абзацного отступа
\usepackage{moreverb} %для печати в листинге исходного кода программ
\usepackage{pdfpages} %для вставки других pdf файлов
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{afterpage}
\usepackage{longtable}
\usepackage{float}
% \usepackage[paper=A4,DIV=12]{typearea}
\usepackage{pdflscape}
% \usepackage{lscape}
\usepackage{array}
\usepackage{multirow}
\renewcommand\verbatimtabsize{4\relax}
\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге
\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице
\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы
\usepackage{listings} %листинги
\usepackage{xcolor} % цвета
\usepackage{hyperref}% для гиперссылок
\usepackage{enumitem} %для перечислений
\newcommand{\specialcell}[2][l]{%
\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях
\hypersetup{colorlinks,
allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)
% подгружаемые языки — подробнее в документации listings (это всё для листингов)
\lstloadlanguages{ SQL}
% включаем кириллицу и добавляем кое−какие опции
\lstset{tabsize=2,
breaklines,
basicstyle=\footnotesize,
columns=fullflexible,
flexiblecolumns,
numbers=left,
numberstyle={\footnotesize},
keywordstyle=\color{blue},
inputencoding=cp1251,
extendedchars=true
}
\lstdefinelanguage{MyC}{
language=SQL,
% ndkeywordstyle=\color{darkgray}\bfseries,
% identifierstyle=\color{black},
% morecomment=[n]{/**}{*/},
% commentstyle=\color{blue}\ttfamily,
% stringstyle=\color{red}\ttfamily,
% morestring=[b]",
% showstringspaces=false,
% morecomment=[l][\color{gray}]{//},
keepspaces=true,
escapechar=\%,
texcl=true
}
\textheight=24cm % высота текста
\textwidth=16cm % ширина текста
\oddsidemargin=0pt % отступ от левого края
\topmargin=-1.5cm % отступ от верхнего края
\parindent=24pt % абзацный отступ
\parskip=5pt % интервал между абзацами
\tolerance=2000 % терпимость к "жидким" строкам
\flushbottom % выравнивание высоты страниц
% Настройка листингов
\lstset{
language=SQL,
extendedchars=\true,
inputencoding=utf8,
keepspaces=true,
% captionpos=b,
}
\begin{document} % начало документа
% НАЧАЛО ТИТУЛЬНОГО ЛИСТА
\begin{center}
\hfill \break
\hfill \break
\normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\
федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]}
\normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt]
\normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt]
\normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\
\hfill \break
\hfill \break
\hfill \break
\hfill \break
\large{Отчет по лабораторным работам}\\
\large{<<Теоретические основы баз данных>>}\\
\hfill \break
% \hfill \break
\hfill \break
\end{center}
\small{
\begin{tabular}{lrrl}
\!\!\!Студент, & \hspace{2cm} & & \\
\!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\
\!\!\!Преподаватель & \hspace{2cm} & \underline{\hspace{3cm}} & Попов С. Г. \\\\
&&\hspace{4cm}
\end{tabular}
\begin{flushright}
<<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2024г.
\end{flushright}
}
\hfill \break
% \hfill \break
\begin{center} \small{Санкт-Петербург, 2024} \end{center}
\thispagestyle{empty} % выключаем отображение номера для этой страницы
% КОНЕЦ ТИТУЛЬНОГО ЛИСТА
\newpage
\tableofcontents
\newpage
\section*{Введение}
\addcontentsline{toc}{section}{Введение}
В данном отчёте описан результат выполнения лабораторных работ, расширяющих функциональные возможности базы данных для проведения соревнований по стрельбе из лука, которая была разработана в течение предыдущего семестрового курса «Теоретические основы баз данных».
В ходе выполнения лабораторных работ изучены и реализованы в СУБД: представление, событийная модель (триггеры), права доступа, процедуры, функции и транзакции.
\newpage
\section {Постановка задачи}
В ходе прохождения данного курса необходимо выполнить пять лабораторных работ.
\begin{enumerate}
\item Создать представление, инкапсулирующее запрос. Написать запрос, использующий в себе представление.
\item Написать триггеры, автоматизирующие сбор статистической информации о количестве соревнований, в которых участвовал каждый судья.
\item Создать двух пользователей. Первый должен иметь доступ только на просмотр представления из первого задания. Второй также должен уметь редактировать таблицы, участвующие в запросе представления.
\end{enumerate}
\newpage
\section {Лабораторные работы}
\subsection{Работа 1: Создание представлений}
\textbf{Задача:} Разработать представление для хранения запроса внутри СУБД.
\textbf{Формулировка задачи:} Посчитать для каждого спортсмена число заявок и число серий. Представление выдает только идентификатор спортсмена, число его заявок на соревнования и число серий выстрелов. Использовать представление в другом запросе.
Сделано представление sportsman\_requests\_series\_count, которое хранит запрос, выполняющий поставленную задачу. В представлении участвуют таблицы \texttt{sportsman}, \texttt{participant\_request} и \texttt{shot\_series}. Код запроса для создания представления представлен в листинге~\ref{lst:view1}.
\begin{figure}[h]
\centering
\includegraphics[width=0.4\linewidth]{img/view_result.png}
\caption{Первые десять записей в представлении \texttt{sportsman\_requests\_series\_count}.}
\label{fig:view}
\end{figure}
\begin{lstlisting}[mathescape=true, language=SQL, caption={Запрос для создания представления \texttt{sportsman\_requests\_series\_count}.}, label={lst:view1}]
create view
sportsman_requests_series_count as
select
s.id_sportsman,
count(distinct pr.id_participant_request) as pr_count,
count(ss.id_shot_series) as ss_count
from
sportsman as s
left join participant_request as pr
on s.id_sportsman = pr.id_sportsman
left join shot_series as ss
on pr.id_participant_request = ss.id_participant_request
group by
s.id_sportsman;
\end{lstlisting}
Получившееся представление представлено на Рис.~\ref{fig:view}.
Также был составлен пример запроса, в котором используется представление \texttt{sportsman\_requests\_series\_count}, его код представлен в листинге~\ref{lst:view2}. В этом запросе выбираются 10 самых активных с точки зрения участия в соревнованиях спортсменов из клуба <<ЛК Парадокс Лучника>>. К исходному представлению также добавляются дополнительные столбцы с данными спортсмена из таблицы \texttt{sportsman}. Результат выполнения этого запроса представлен на Рис.~\ref{fig:view_query}.
\begin{lstlisting}[mathescape=true, language=SQL, caption={Код примера запроса, в котором используется представление \texttt{sportsman\_requests\_series\_count}.}, label={lst:view2}]
select
srsc.id_sportsman,
s.name,
s.category,
srsc.pr_count,
srsc.ss_count
from
sportsman_requests_series_count as srsc
join sportsman as s on srsc.id_sportsman = s.id_sportsman
where
s.gender = 'Мужчина'
and s.club = 'ЛК Парадокс Лучника'
order by
srsc.pr_count desc
limit 10;
\end{lstlisting}
\begin{figure}[h]
\centering
\includegraphics[width=1\linewidth]{img/view_query.png}
\caption{Первые десять записей результата выполнения запроса с участием представления \texttt{sportsman\_requests\_series\_count}.}
\label{fig:view_query}
\end{figure}
Созданное представление нельзя обновлять напрямую, а попытки его обновить приведут к ошибке, которая демонстрируется на Рис.~\ref{fig:insert_error}. Изменить данные представления можно только изменив исходные таблицы, которые в нём участвуют.
\begin{figure}[h]
\centering
\includegraphics[width=1\linewidth]{img/insert_error.png}
\caption{Результат попытки изменения данных напрямую через представление \texttt{sportsman\_requests\_series\_count}.}
\label{fig:insert_error}
\end{figure}
\end{document}