Распределенные базы данных. Лабораторный практикум
.pdf
ЛАБОРАТОРНАЯ РАБОТА№6
5.Создайте триггер, который при вставке новой записи в таб- лицу «Штрафы» проверяет, находится ли уже точно такая же запись в таблице. В случае повторения выведите сообщение об ошибке.
6.Создайтепредставление(View) наосноветаблицы«Нарушения», отображающее водителей и их общую сумму штрафов. Напи- шите триггер (INSTEAD OF), который при вставке новой запи- си в созданное представление (INSERT INTO my_view) вставляет данные в таблицу «Нарушения». Проверьте, как при этом изме- нилисьданные в представлении.
21
ЛАБОРАТОРНАЯ РАБОТА № 7
Триггеры
Триггеры – лучшее средство для обеспечения низкоуровневой целостности данных. Однако они работают медленнее ограничений. Триггеры позволяют:
•делать каскадные изменения зависимых таблиц в базе данных, обеспечивая более комплексную целостность данных, чем огра- ничение CHECK;
•выводить сообщения об ошибках;
•сравнивать состояние данных до и после изменения.
Создает триггеры только владелец базы данных. Это ограничение позволяет избежать случайного изменения структуры таблиц, спосо- бов связи с нимидругих объектов. Триггер представляетсобой весьма полезное и вто же время опасное средство.
Так, принеправильнойлогикеегоработыможнолегкоуничтожить целую базу данных, поэтому триггеры необходимо очень тщательно отлаживать.
В отличие от обычной подпрограммы, триггер выполняется неяв- но в каждом случае возникновения триггерного события, к тому же он не имеет аргументов [4].
Задание
1.Использовать базу данных «Аэропорт» из лабораторной ра- боты № 3.
2.Сформировать SQL запросы.
Запросы
1.Создайте триггер, который запрещает увольнять (DELETE) со- трудников в выходной день. При удалении сотрудника его дан- ные идата увольнениядолжны сохраняться в соответствующей таблице.
2.Создайте триггер, который при отмене рейса (DELETE) удаля- ет данные также из таблицы «Билеты на рейсы», а у пассажи- ров указанного рейса в поле номер рейса появляется значение «Отменен».
3.Создайте триггер, который при добавлении пассажира прове- ряет, существует ли подобный рейс и есть ли еще свободные
22
ЛАБОРАТОРНАЯ РАБОТА№7
места на нем. Если мест нет, то выведите соответствующее со- общение об ошибке. Если пассажир добавлен на рейс, то коли- чество билетов в продаже должно уменьшиться.
4.Создайте триггер, который не позволяет возвращать билеты на рейсы, которые были в прошлом. Если билет вернуть мож- но, то поместите записьо возврате в соответствующуютаблицу с указанием данных о рейсе и о пассажире, а также сумме воз- врата: если до даты вылета больше 30 дней или рейс был отме- нен, то возвращается полная стоимость, если больше недели – 50%, в остальных случаях – 25% от стоимости билета. Количе- ство свободных билетов на рейс должно увеличиться в случае успешного возврата.
5.Создайте триггер, который позволяет обновлять информацию отипе воздушного суднатолько для предстоящих рейсов.
23
ЛАБОРАТОРНАЯ РАБОТА № 8
Работа с SQLite с помощью C++
SQLite – это реляционная база данных, запросы к которой можно осуществлять при помощи языка запросов SQL. База данных не под- держивает все особенности SQL и уступает в функциональности дру- гим развитым СУБД, но вполне подходит для хранения и извлечения информации.
Классические СУБД, такие как MySQL (а также MS SQL, Oracle, PostgreSQL), состоят из отдельного сервера, поддерживающего рабо- ту базы данных и прослушивающего определенный порт на предмет обращения клиентов. В качестве клиента может выступать расшире- ние PHP, реализующего интерфейс, с помощью которого осуществля- ются запросы к базе. Движок SQLite и интерфейс к ней реализованы в одной библиотеке, что увеличивает скорость выполнения запросов. Такой сервер часто называют встроенным [5].
Подключение библиотеки sqlite31
Для работы с SQLite необходима библиотека sqlite3. Если библио- тека sqlite3 не установлена, то скачайте с сайта SQLite (см. сноску 1)
и подключите в проект файлы: sqlite3.h, sqlite3.c, sqlite3ext.h.
Для работы в XCode (Mac OS) скачивать библиотеку не требуется, необходимотолько подключить ее в настройках проекта:
проект->targets->build phases->link binary->libsqlite3.0.tbd
Общее описания задания
1.Использовать базу данных Chinook2.
2.Выполнить задания с помощью С++ и SQL.
БазаданныхChinook (рис. 3) – этоучебнаяБД, описывающаяБДму- зыкального магазина.
БД Chinook содержит 11 таблиц:
•employees – содержит личную информацию о сотрудниках, такую как Id сотрудника, фамилия и имя и др.;
•customers – содержит информацию о покупателях;
1How to compile SQLite. URL: https://www.sqlite.org/howtocompile.html (дата обраще- ния: 03.12.2022).
2SQLite Sample Database. URL: https://www.sqlitetutorial.net/sqlite-sample-database/ (дата обращения: 03.12.2022).
24
ЛАБОРАТОРНАЯ РАБОТА№8
Рис. 3. Структура базы данных Chinook
25
П. Д. КУЛПЕППЕР, Е. Е. КОВАЛЕВ. РАСПРЕДЕЛЕННЫЕ БАЗЫ ДАННЫХ. ЛАБОРАТОРНЫЙ ПРАКТИКУМ
•invoices – содержит заголовочную информацию об инвойсе: по- купатель, дата покупки, адрес выставления счета;
•invoice_items – содержит подробную информацию о покупке;
•artists – содержит информацию об исполнителях;
•albums – содержит информацию об альбомах: название и испол- нитель;
•media_types – содержитформаты ауодиозаписей, например mpeg;
•genres – содержит музыкальный жанр (рок, джаз ит. п.);
•tracks – содержит информация о песне: название, альбом, автор, длительность ит. п.;
•playlists – содержит названия плейлистов;
•playlist_track – содержит информацию, какие песни входят в ка- кие плейлисты.
Задания
1.Спомощьюбиблиотекиsqlite3 загрузитеБДChinook. Выполните тестовый запрос и выведите в консоль какую-нибудь таблицу из этой БД.
2.Сформируйте отчетдля указанного покупателя:
a)напишитезапрос, которыйполучаетдляуказанногопокупа- теля (по Customerid) список всех инвойсов;
b)запишите в файл адрес покупателя в формате (проверяйте
на NULL, чтобы избежать ошибок при выводе):
PostalCode
Country, State, City
Address
c)ниже по центру запишите обращение в формате:
To: FirstName LastName Phone
d)далее с начала строки запишитеданные о покупках пользова- телявформате: InvoiceDate (толькодата, безвремени): Total
e)проведите черту под строчками из пункта d и выведите об-
щую сумму покупок.
ПримерфайладляпокупателясCustomerID=1 представленнарис. 4.
3.Доработайте предыдущую программу таким образом, чтобы пользовательмогвводитьимя и фамилию покупателя, по кото- рому нужно сформироватьотчет. Если указанного человека нет в БД, выведите соответствующее сообщение в консоль.
26
ЛАБОРАТОРНАЯ РАБОТА№8
Рис. 4. Пример отчета для покупателя
4.Модифицируйтепрограммутакимобразом, чтобыавтоматиче- скипечаталисьотчетыповсемпокупателямвотдельнойпапке. В результате должен получиться список файлов, оформленных, как в задании 2:
Aaron Mitchell.txt
Alexandre Rocha.txt
Astrid Gruber.txt
Bjørn Hansen.txt
Camille Bernard.txt
ит. д.
27
ЛАБОРАТОРНАЯ РАБОТА № 9
Работа с SQLite с помощью C++, работа с таблицами, содержащими большой объем информации
Задания
1.СоздайтебазуданныхTestbigdata спомощьюпрограммынаC++.
2.Создайте таблицу, в которой будет содержаться информация о рейтинге фильмов. Для данной лабораторной работы доста- точно двух полей: Id и рейтинг фильма.
3.Внесите в созданную таблицу 104 строк: сгенерируйте случайные числасоднимзнакомпослезапятойот0 до10 вкачестверейтинга.
4.Напишите запрос, который позволяетвычислитьсредний, мак- симальный и минимальный рейтинг фильмов.
5.Выполните этот запрос в DB Browser for SQLite 5 раз. Вычислите среднее время (в миллисекундах) выполнения запроса.
6.Теперь выполните этот запрос с помощью программы на C++: чтобы правильно вычислить среднее время выполнения за- проса, необходимо сделать цикл, внутри которого выполняет- ся данный запрос. Посчитайте общее время (в миллисекундах) выполнения и вычислите среднее. Для этого задания можно воспользоваться библиотекой chrono3.
7.Подобным образом посчитайте, сколько в среднем выполняет- ся запрос, если втаблице будет 105 и 106 строк.
8.Заполните следующую таблицу (табл. 3) и сделайте вывод, как объем данных влияет на скорость выполнения запросов:
|
|
|
Таблица 3 |
Сравнение скорости выполнения запросов |
|||
|
|
|
|
Количествострок |
|
Времявыполнения, мс |
|
С++ |
|
DB Browser for SQLite |
|
|
|
||
104 |
|
|
|
105 |
|
|
|
106 |
|
|
|
9.В отчете должен быть код с созданием БД и таблицы, заполне- нием таблицы данными и вычислением среднего времени вы- полнения запроса, атакже заполненнаятаблица из пункта 8.
3<chrono>. URL: https://learn.microsoft.com/en-us/cpp/standard-library/chrono?view=msvc-170 (датаобращения: 03.12.2022).
28
ЛАБОРАТОРНАЯ РАБОТА № 10
Работа с SQLite с помощью C++
Задания
1.Используйте базу данных Chinook (см. лабораторную ра- боту № 8).
2.Предположим, что это база используется компанией, кото- рая занимается продажей музыкальных треков и альбомов. В основном треки продают по отдельности онлайн, но также пользователи (любители CD-дисков) могут заказать альбом на диске.
3.Для учета количества альбомов на дисках, которые есть в на- личии, создайте новую таблицу в базе данных Chinook. В таб- лице должны содержаться Id альбома и количество альбомов в магазине.
4.Заполните таблицу данными с помощью C++: случайным обра- зом выберите 20–30 альбомов (без повторений) и случайным образом заполните столбец, в котором указывается количество альбомов в магазине.
5.Создайтедополнительнуютаблицу, в которой будутсодержать- ся сведения о тех альбомах, которые необходимо заказать до- полнительно в магазин в количестве 5 штук. Эту таблицу пока что заполнять нетребуется.
6.Создайте триггер, который будет вносить данные в таблицу из пункта 5 в случае, если в магазине в наличии остается мень- ше 2 единиц какого-либо альбома.
7.К сожалению, магазин может заказывать альбомы, только если в заказе будет не менее 5 альбомов. Поэтому напишите триг- гер, который будет отслеживать это условие и делать «заказ» альбомов. В результате таблица с заказами должна очищаться, а в таблице из пункта 3 должны обновляться данные о количе- стве альбомов.
8.Напишите программу, которая имитирует работу магазина. Сделайте небольшое меню, в котором пользователь может вы- брать альбом для покупки, оплатить или уйти.
Общие правила:
•стоимость альбома формируется из общей стоимости всех тре- ков, входящих в данный альбом, плюс наценка 150%;
29
П. Д. КУЛПЕППЕР, Е. Е. КОВАЛЕВ. РАСПРЕДЕЛЕННЫЕ БАЗЫ ДАННЫХ. ЛАБОРАТОРНЫЙ ПРАКТИКУМ
•если выбран альбом, которого нет в наличии (в таблице из пункта 3 количество равно 0), то должно выводиться соот- ветствующее сообщение, например «Выбранного альбома нет в наличии»;
•если выбранный альбом отсутствует в таблице из пункта 3, выведите сообщение «Данный альбом нельзя приобрести на диске»;
•если пользователь оплачивает покупку, то в БД должны проис- ходить соответствующие изменения втаблицах.
30
