├── LICENSE ├── README.md ├── exam ├── covid.md ├── exam.md ├── fast.md ├── practice.md └── theory.md ├── git.md ├── img ├── answer.png ├── auto.jpg ├── code_review.png ├── conversation.png ├── field_properties.png ├── film1.png ├── film2.png ├── fork.png ├── issues.png ├── my_prs.png ├── preforking.png ├── privat_repo.png ├── pullrequest1.png ├── pullrequest2.png ├── rel1.png ├── rel2.png ├── relationship_properties.png ├── request.png ├── safemodewb.png ├── secondconndbf.png ├── secondconnwb.png ├── sotr1.png ├── sotr2.png ├── stud1.png ├── stud2.png ├── table_properties.png ├── transbuttonsdbf.png ├── transbuttonswb.png ├── transmenudbf.png ├── transmenuwb.png └── workflow.png ├── labs ├── lab1.md ├── lab2.md ├── lab3.md ├── lab4.md ├── lab5.md └── lab6.md ├── practices ├── practice1.md └── practice2.md └── tests ├── test1.md ├── test2.md └── test4.md /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Курс Базы данных 2 | ### весенний семестр 2025 года, ГУАП, кафедра 44 3 | 4 | 10 | 11 | ## Содержание теоретического курса 12 | 13 | * [Введение в реляционные базы данных](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture1) 14 | * [Реляционная алгебра](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture2) 15 | * [Теория нормализации](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture3) 16 | * [SQL](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture4) 17 | * [Обработка транзакций](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture5) 18 | 19 | ----- 20 | 21 | ## Содержание лабораторного курса 22 | 23 | __Важно__ 24 | 25 | Для лабораторных работ предусмотрена сдача на GitHub. Для доступа к репозиториям лабораторных работ требуется быть членом организации `db-course` и выполнить ЛР0. См. [инструкции](https://github.com/db-course/syllabus/blob/master/git.md). 26 | 27 | Лабораторный курс по дисциплине включает 6 лабораторных работ. 28 | 29 | 1. [Инфологическое моделирование предметной области](https://github.com/db-course/syllabus/blob/master/labs/lab1.md) 30 | 1. [Создание базы данных в СУБД Microsoft Access](https://github.com/db-course/syllabus/blob/master/labs/lab2.md) 31 | 1. [Создание базы данных в СУБД SQLite](https://github.com/db-course/syllabus/blob/master/labs/lab3.md) 32 | 1. [Создание представлений на основании запросов на выборку в СУБД SQLite. Запросы на модификацию и удаление данных в СУБД SQLite](https://github.com/db-course/syllabus/blob/master/labs/lab4.md) 33 | 1. [Создание триггеров в СУБД SQLite](https://github.com/db-course/syllabus/blob/master/labs/lab5.md) 34 | 35 | 36 | ----- 37 | 38 | ## Содержание практического курса 39 | 40 | Практический курс по дисциплине включает 2 практических работы... 41 | 42 | 1. [Реляционная алгебра](https://github.com/db-course/syllabus/blob/master/practices/practice1.md) 43 | 1. [SQL](https://github.com/db-course/syllabus/blob/master/practices/practice2.md) 44 | 45 | ...и 2 контрольных работы. 46 | 47 | 1. [Теория нормализации I](https://github.com/db-course/syllabus/blob/master/tests/test1.md) 48 | 1. [Теория нормализации II](https://github.com/db-course/syllabus/blob/master/tests/test2.md) 49 | 50 | 51 | 64 | -------------------------------------------------------------------------------- /exam/covid.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | # Дистанционная аттестация июнь 2020 4 | 5 | ## Требования к допуску к экзамену 6 | 7 | В практическом курсе предусмотрено 6 лабораторных работ (из них одна является необязательной) и 3 контрольных работы. Если сложить количество ЛР и КР, мы получаем 8 баллов. В зависимости от количества выполненных работ, студент обладает тем или иным количеством баллов. На основании этого определяется его группа. 8 | 9 | * 8 баллов - I группа 10 | * 7 баллов - II группа 11 | * 5-6 баллов - III группа 12 | 13 | Студенты, имеющие 4 балла и менее, допускаются к сдаче экзамена с понижением оценки на 3 балла. 14 | 15 | ## Проведение экзамена 16 | 17 | В день экзамена преподаватель организует со студентами чат и начинает сессию в Zoom. 18 | 19 | Студенты сдают экзамен по списку, совпадающему со списком группы в личном кабинете (лексикографически упорядоченным). На каждого студента (групп __I__, __II__, __III__) отводится период времени в 20 минут. Соответственно, можно вычислить время начала и окончания экзаменовки каждого студента. Если в графике экзаменовок произошли сдвиги, преподаватель уведомляет об этом студентов в чате. 20 | 21 | В чате студенты, желающие отвечать на вопросы теоретического этапа, могут запросить у преподавателя вопросы для подготовки. Сделать это можно за 20 минут до начала своего времени экзаменования. 22 | 23 | Экзамен для каждого студента делится на 3 этапа: быстрый, практический и теоретический. 24 | 25 | Студент присоединяется к конференции в Zoom, включает веб-камеру и получает от преподавателя ссылку на Google-документ, в котором будут выполняться задания. 26 | 27 | ### 1. Быстрый этап 28 | 29 | * Преподаватель последовательно заносит студенту в документ случайные 3 вопроса из [этого списка](https://github.com/db-course/syllabus/blob/master/exam/fast.md). 30 | * Ответ должен быть предоставлен устно в течение 10 секунд без возможности пользоваться чем-либо. 31 | * При правильном ответе на 2 или 3 вопроса этап считается пройденным. 32 | * Студенты __I__ группы после прохождения данного этапа получают "хорошо" или по желанию переходят ко второму этапу. 33 | * Студенты __II__ группы после прохождения данного этапа получают "удовлетворительно" или по желанию переходят ко второму этапу. 34 | * Студенты __III__ группы после прохождения данного этапа переходят ко второму этапу. 35 | * Если студент отвечает менее чем на 2 вопроса, этап считается непройденным, и студент перманентно переводится в более низкую группу, после чего может попытаться пройти этап еще раз. Студенты __III__ группы в случае непрохождения этапа отправляются на переэкзаменовку. 36 | 37 | ### 2. Практический этап 38 | 39 | * Преподаватель представляет для решения несложный SQL-запрос из категории предлагавшихся на контрольной работе, занося его в документ. 40 | * На решение задания дается 5 минут. 41 | * Решение должно производиться в том же документе и сопровождаться комментариями. Веб-камера должна быть включена. 42 | * Студенты __I__ группы после прохождения данного этапа получают "отлично". 43 | * Студенты __II__ группы после прохождения данного этапа получают "хорошо" или по желанию переходят к следующему этапу. 44 | * Студенты __III__ группы после прохождения данного этапа получают "удовлетворительно" или по желанию переходят к следующему этапу. 45 | 46 | ### 3. Теоретический этап 47 | 48 | * Студент заранее получает от преподавателя 2 теоретических вопроса из [этого списка](https://github.com/db-course/syllabus/blob/master/exam/theory.md). 49 | * Студенты __II__ группы отвечают на один из двух вопросов по своему выбору. 50 | * Студенты __III__ группы отвечают на оба вопроса. 51 | * Студент не читает текст и не излагает вопрос от себя. Прохождение этапа представляет собой ответы на вопросы преподавателя по теме теоретического вопроса, доставшегося студенту. 52 | * На основании прохождения этапа ставится итоговая оценка за экзамен. 53 | 54 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 55 | -------------------------------------------------------------------------------- /exam/exam.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## Требования к допуску к экзамену 4 | 5 | В практическом курсе предусмотрено 6 лабораторных работ и 4 контрольных работы. Если сложить количество ЛР и КР, мы получаем 10 баллов. В зависимости от количества выполненных работ, студент обладает тем или иным количеством баллов. На основании этого определяется его группа. 6 | 7 | * 10 баллов - I группа 8 | * 9 баллов - II группа 9 | * 8 баллов - III группа 10 | * 7 баллов - IV группа 11 | * 6 баллов - V группа 12 | 13 | Студенты __I__ группы получают "отлично" без сдачи экзамена. Студенты, имеющие 5 баллов и менее, не допускаются к сдаче экзамена. 14 | 15 | ## Проведение экзамена 16 | 17 | Экзамен делится на 3 этапа: быстрый, основной и практический. 18 | 19 | ### 1. Быстрый этап 20 | 21 | * Студент последовательно тянет случайные 3 вопроса из [этого списка](https://github.com/db-course/syllabus/blob/master/exam/fast.md). 22 | * Подготовка к ответу на каждый вопрос осуществляется в течение 10 секунд без возможности пользоваться чем-либо. 23 | * При правильном ответе на 2 или 3 вопроса этап считается пройденным. 24 | * Студенты __II__ группы после прохождения данного этапа получают "отлично". 25 | * Студенты __III__ группы после прохождения данного этапа получают "хорошо" или по желанию переходят ко второму этапу. 26 | * Студенты __IV__ и __V__ группы после прохождения данного этапа переходят ко второму этапу. 27 | * Если студент отвечает менее чем на 2 вопроса, этап считается непройденным, и студент перманентно переводится в более низкую группу, после чего может попытаться пройти этап еще раз. Студенты __V__ группы в случае непрохождения этапа отправляются на переэкзаменовку. 28 | 29 | ### 2. Основной этап 30 | 31 | * Студент тянет билет, содержащий 2 теоретических вопроса из [этого списка](https://github.com/db-course/syllabus/blob/master/exam/theory.md). 32 | * Подготовка осуществляется в течение 20 минут. 33 | * При подготовке можно пользоваться конспектом, литературой, интернетом и другими источниками, но молча и не выходя из аудитории. 34 | * Студенты __III__ и __IV__ группы отвечают на один из двух вопросов по своему выбору. 35 | * Студенты __V__ группы отвечают на оба вопроса. 36 | * На основании ответа ставится предварительная оценка. Если это "удовлетворительно", то на этом экзамен заканчивается. Если это "хорошо" или "отлично", то студент переходит к следующему этапу. Студент имеет право отказаться от следующего этапа, в этом случае он получает оценку на балл ниже относительно заработанной. 37 | 38 | ### 3. Практический этап 39 | 40 | * Студент решает один из дополнительных практических вопросов, перечисленных в [этом списке](https://github.com/db-course/syllabus/blob/master/exam/practice.md) (по выбору преподавателя), либо решает один несложный SQL-запрос из категории предлагавшихся на контрольной работе. 41 | * На решение задания дается 5 минут. 42 | 43 | __N.B.__ При ответе просто иметь листок с куском конспекта не имеет смысла, поскольку прочтение конспекта не гарантирует даже оценку "удовлетворительно". Я не буду слушать то, что вы читаете, более того, вообще не буду давать читать. Большую часть ответа будут составлять ответы на вопросы преподавателя по теме билета. Отсюда совет: готовьтесь дома (изучайте, вникайте, систематизируйте, но не зубрите). На самом экзамене 20 минут подготовки дается не для того, чтобы переписать ответ из конспекта на листок, даже не задумываясь о содержании, а для того, чтобы вспомнить все, что вы знаете по конкретной теме. За это время на листке рекомендуется составлять план ответа, а также выписывать плохо запоминающиеся вещи. 44 | 45 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 46 | -------------------------------------------------------------------------------- /exam/fast.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/covid.md) 4 | 5 | ### Быстрые вопросы к экзамену по курсу «Базы данных» 6 | 7 | * Что произойдет, если в операции UPDATE не указано условие фильтрации строк? Приведите пример. Что произойдет, если в операции DELETE не указано условие фильтрации строк? Приведите пример. 8 | 9 | * Что такое ACID-свойства? 10 | 11 | * Могут ли агрегирующие функции использоваться в секции WHERE? Если да, то приведите пример. Могут ли агрегирующие функции использоваться без группировки? Если да, то приведите пример. 12 | 13 | * Может ли содержать транзитивные зависимости отношение, находящееся в 2NF? Если да, то приведите пример. Находящееся в 3NF? Если да, то приведите пример. 14 | 15 | * Может ли атрибут функционально зависеть сразу от двух других атрибутов? Если да, то приведите пример. Может ли от атрибута функционально зависеть сразу два других атрибута? Если да, то приведите пример. 16 | 17 | * Можно ли сделать соединение отношений R1(A,B,C) и R2(C,D,E)? Почему? Их объединение? Почему? Их декартово произведение? Почему? 18 | 19 | * Что такое фантомы? Приведите пример. 20 | 21 | * Должна ли транзакция блокировать строку, если она собирается выполнить чтение? Если да, то зачем? Должна ли транзакция блокировать строку, если она собирается выполнить запись в нее? Если да, то зачем? 22 | 23 | * Что такое «грязные данные»? Приведите пример. 24 | 25 | * В чем разница между потенциальным ключом и суперключом? Приведите пример. 26 | 27 | * Сколько колонок должен возвращать подзапрос в выражении [NOT] IN? Приведите пример. Сколько колонок должен возвращать подзапрос в выражении [NOT] EXISTS? Приведите пример. 28 | 29 | * Можно ли разрешить потерянные обновления путем понижения уровня изоляции? Если да, то какими уровнями? Можно ли разрешить грязные чтения путем понижения уровня изоляции? Если да, то какими уровнями? Можно ли разрешить неповторяемые чтения путем понижения уровня изоляции? Если да, то какими уровнями? 30 | 31 | * Зачем нужны неуникальные индексы? 32 | 33 | * В таблице T(A,B) с потенциальным ключом A n строк. Таблица не содержит NULL-значений. Чему равно минимальное количество строк результата запроса SELECT A FROM T GROUP BY A,B? Приведите пример. Максимальное количество? Приведите пример. 34 | 35 | * В чем принцип двухфазного протокола блокировки? 36 | 37 | * Может ли один оператор запустить сразу несколько триггеров? Если да, то каким образом? Может ли триггер запустить другой триггер? Если да, то каким образом? 38 | 39 | * Чему будет равен результат запроса SELECT COUNT(A) FROM T, если таблица T пуста? SELECT SUM(A) FROM T? SELECT AVG(A) FROM T? SELECT MIN(A) FROM T? SELECT MAX(A) FROM T? 40 | 41 | * Используется ли буферизация при записи данных в базу данных? В журнал транзакций? В чем принципиальная разница между записью в базу данных и журнал транзакций? 42 | 43 | * Может ли триггер в SQLite следить сразу за несколькими таблицами? Если да, то приведите пример. Сразу же за несколькими видами операций? Если да, то приведите пример. 44 | 45 | * В таблице T(A,B) с потенциальным ключом A n строк. Таблица не содержит NULL-значений. Чему равно минимальное количество строк результата запроса SELECT A FROM T GROUP BY B? Приведите пример. Максимальное количество? Приведите пример. 46 | 47 | * Чему будет равен результат запроса SELECT COALESCE(1, 0, NULL, 10)? Почему? 48 | 49 | * Можно ли отсортировать кортежи результата запроса в реляционной алгебре? Если да, то как? Атрибуты результата запроса в реляционной алгебре? Если да, то как? 50 | 51 | * В каких случаях необходимо восстановление системы? 52 | 53 | * Можно ли по стандарту SQL отсортировать строки результата запроса? Если да, то как? Колонки результата запроса? Если да, то как? 54 | 55 | * Что такое N-декомпозируемые отношения? Приведите пример. 56 | 57 | * В чем разница между INNER JOIN и NATURAL JOIN? Между CROSS JOIN и запятой в секции FROM? 58 | 59 | * Могут ли перекрываться множества колонок, на которые наложены ограничения UNIQUE? Если да, то приведите пример. Ограничения FOREIGN KEY? Если да, то приведите пример. 60 | 61 | * Может ли отношение с двумя ключами находиться в BCNF? Если да, то приведите пример. Может ли отношение с двумя ключами не находиться в BCNF? Если да, то приведите пример. 62 | 63 | * Может ли N-декомпозируемое отношение находиться в 4NF? Если да, то приведите пример. В 5NF? Если да, то приведите пример. 64 | 65 | * Чему будет равен результат запроса SELECT NULL IS NULL? Почему? SELECT NULL IS NOT NULL? Почему? 66 | 67 | * Может ли в одном отношении быть несколько составных первичных ключей? Если да, то приведите пример. Составных альтернативных ключей? Если да, то приведите пример. Составных внешних ключей? Если да, то приведите пример. 68 | 69 | * Какие варианты действий предлагает стандарт SQL для внешних ключей при удалении связанных записей? При изменении связанных записей? 70 | 71 | * Может ли составной индекс по колонкам (A, B) быть использован для ускорения запроса с условием WHERE С=5 AND A>6? Почему? С условием WHERE B=5 AND A>6? Почему? С условием WHERE B=5? Почему? С условием WHERE A>6? Почему? 72 | 73 | * Какой оператор SQL позволяет изменить имя таблицы? Приведите пример. Имя колонки? Приведите пример. 74 | 75 | * Могут ли отношения с одинаковыми заголовками иметь разное количество атрибутов? Если да, то приведите пример. Разный порядок атрибутов? Если да, то приведите пример. 76 | 77 | * Что такое мягкий сбой? Жесткий сбой? 78 | 79 | * Чему будет равен результат запроса SELECT 0 = NULL? Почему? SELECT 0 <> NULL? Почему? 80 | 81 | * Может ли нормализация устранить аномалии? Если да, то каким образом? Может ли денормализация устранить аномалии? Если да, то каким образом? 82 | 83 | * Дано отношение R(A,B). Какое ограничение более строгое: два простых потенциальных ключа A и B или составной потенциальный ключ (A,B). Почему? 84 | 85 | * Что такое точка физической согласованности? 86 | 87 | * Может ли детерминант функциональной зависимости включать несколько атрибутов? Если да, то приведите пример. Может ли зависимая часть функциональной зависимости включать несколько атрибутов? Если да, то приведите пример. 88 | 89 | * Как можно обнаружить тупик? 90 | 91 | * В чем заключается принцип WAL? 92 | 93 | * Чем плотный индекс отличается от неплотного? Кластеризованный от некластеризованного? 94 | 95 | * Можно ли считывать данные из представления? Если да, то как? Записывать данные в представление? Если да, то как? Удалять данные из представления? Если да, то как? Изменять данные в представлении? Если да, то как? 96 | 97 | * Может ли откат транзакции привести данные в некорректное состояние? Если да, то каким образом? Может ли фиксация транзакции привести данные в некорректное состояние? Если да, то каким образом? 98 | 99 | * В чем разница между журналированием с отложенными и немедленными обновлениями? 100 | 101 | * Чему будет равен результат запроса SELECT MAX(ФИО) FROM T, если в колонке ФИО список студентов вашей группы? SELECT SUM(ФИО) FROM T? 102 | 103 | * Может ли нормализация ускорить обработку данных? Если да, то каким образом? Может ли денормализация ускорить обработку данных? Если да, то каким образом? 104 | 105 | * Возможна ли функциональная зависимость вида AB->BC? Если да, то приведите пример. Возможна ли функциональная зависимость между двумя отношениями? Если да, то приведите пример. 106 | 107 | * Какие операции может производить команда ALTER TABLE? 108 | 109 | * Пусть в отношении R1(A,B) n кортежей, а в отношении R2(B,C) m кортежей. Какое минимальное число кортежей может содержать результат их соединения R1*R2? Приведите пример. Максимальное число кортежей? Приведите пример. 110 | 111 | * Триггер следит за изменением данных в таблице в SQLite. В таблице было изменено n строк. Каково минимальное и максимальное количество раз, когда он мог сработать в ответ на эти действия? Обоснуйте свой ответ. 112 | 113 | * Как может сказаться создание дополнительных индексов на эффективности операторов SELECT? Почему? Операторов INSERT? Почему? Операторов UPDATE? Почему? Операторов DELETE? Почему? 114 | 115 | * Что произойдет, если указать в секции ORDER BY сразу две колонки? Приведите пример. 116 | 117 | * Какая адресация (плотная/неплотная) может применяться для кластеризованного индекса? Почему? Некластеризованного индекса? Почему? Сколько кластеризованных индексов может иметь таблица? Почему? Некластеризованных индексов? Почему? 118 | 119 | * Снижается ли вероятность тупиков применением двухфазного протокола блокировки? Если да, то каким образом? Понижением уровня изоляции? Если да, то каким образом? 120 | 121 | * Что произойдет, если указать в секции GROUP BY сразу две колонки? Приведите пример. 122 | 123 | * Чему будет равен результат запроса SELECT 0 IS NULL? Почему? SELECT 0 IS NOT NULL? Почему? 124 | 125 | * В таблице T(A,B) с потенциальным ключом A n строк. Таблица не содержит NULL-значений. Чему равно минимальное количество строк результата запроса SELECT A FROM T GROUP BY A? Приведите пример. Максимальное количество? Приведите пример. 126 | 127 | * Накладывается ли автоматически по стандарту SQL ограничение NOT NULL на первичный ключ? На альтернативный ключ? На внешний ключ? 128 | 129 | * Чем отличаются выражения COUNT(*), COUNT(A) и COUNT(DISTINCT A)? Приведите пример, когда все они дают разный результат. 130 | 131 | * В чем разница между нетривиальной и полностью нетривиальной функциональными зависимостями? Приведите пример. 132 | 133 | * Чему будет равен результат запроса SELECT "Григорьев" LIKE "Г%в"? Почему? Запроса SELECT "Григорьев" LIKE "Г%в" ESCAPE "$"? Почему? Запроса SELECT "Григорьев" LIKE "Г$%в" ESCAPE "$"? Почему? 134 | 135 | * Можно ли с использованием оператора UPDATE изменить сразу несколько таблиц? Если да, то как? Сразу несколько строк? Если да, то как? Сразу несколько колонок? Если да, то как? 136 | 137 | * Дано отношение R(A,B). Какое ограничение более строгое: простой потенциальный ключ A или составной потенциальный ключ (A,B). Почему? 138 | 139 | * Триггер следит за добавлением данных в таблицу в SQLite. В таблицу было добавлено n строк. Каково минимальное и максимальное количество раз, когда он мог сработать в ответ на эти действия? Обоснуйте свой ответ. 140 | 141 | * Что понимается под атомарностью данных в реляционной модели? Приведите пример. 142 | 143 | * Является ли многозначная зависимость функциональной? Функциональная - многозначной? Функциональная - зависимостью соединения? Многозначная - зависимостью соединения? Зависимость соединения - функциональной? Зависимость соединения - многозначной? 144 | 145 | * Что произойдет, если в параметрах оператора INSERT указать меньше колонок, чем есть в таблице? Приведите пример. 146 | 147 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/covid.md) 148 | 149 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 150 | -------------------------------------------------------------------------------- /exam/practice.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/exam.md) 4 | 5 | ### Практические вопросы к экзамену по курсу «Базы данных» 6 | 7 | 1. Реализовать реляционное деление с помощью аппарата реляционной алгебры, не ипользуя операцию деления. 8 | 2. Реализовать реляционное соединение с помощью аппарата реляционной алгебры, не ипользуя операцию соединения. 9 | 3. Реализовать в SQL вычитание с помощью левого внешнего соединения. 10 | 4. Реализовать в SQL левое внешнее соединение с использованием объединения. 11 | 5. Реализовать в SQL полное внешнее соединение с использованием объединения. 12 | 6. Реализовать эквивалентные запросы с помощью EXCEPT, NOT IN и NOT EXISTS. 13 | 14 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/exam.md) 15 | 16 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 17 | -------------------------------------------------------------------------------- /exam/theory.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/covid.md) 4 | 5 | ### Теоретические вопросы к экзамену по курсу «Базы данных» 6 | 7 | 1. Недостатки файлового способа хранения данных. Причины возникновения СУБД и БД. Основные требования, предъявляемые к современным СУБД. 8 | 9 | 2. Классификация моделей данных по уровню абстракции. Инфологическое моделирование. Алгоритм преобразования ER-диаграммы в схему реляционной базы данных. Пример. 10 | 11 | 3. Реляционная модель данных. Терминология. Понятие отношения. Домен. Отношения и таблицы. Принципы, преимущества, недостатки. 12 | 13 | 4. Операции реляционной алгебры. Примеры. 14 | 15 | 5. Причины возникновения теории нормализации, общие принципы проведения нормализации. Понятие аномалии. Виды аномалий. Денормализация. Примеры. 16 | 17 | 6. Понятие функциональной зависимости. Виды ФЗ. Свойства ФЗ. Аксиомы Армстронга. Теорема Хеза. Примеры тривиальных и нетривиальных зависимостей. Замыкание атрибутов. 18 | 19 | 7. Нулевая, первая, вторая и третья нормальные формы. Нормальная форма Бойса-Кодда (BCNF). Определения, примеры отношений. 20 | 21 | 8. Многозначные зависимости. Свойства МЗ. Теорема Фейджина. Четвертая нормальная форма. Определение, примеры отношений. 22 | 23 | 9. N-декомпозируемые отношения. Зависимости соединения. Пятая нормальная форма (PJNF). 24 | 25 | 10. Язык SQL. Стандарты языка SQL. Отличия модели языка SQL от классической реляционной модели. Структура языка. 26 | 27 | 11. Операторы DDL. Создание таблицы. Типы данных SQL. Создание представления. Создание индекса. Примеры. 28 | 29 | 12. Операторы DML. Примеры. 30 | 31 | 13. Оператор SELECT: общая структура, семантика. 32 | 33 | 14. Оператор SELECT: секции SELECT, FROM, WHERE. Выражения, предикаты. Трехзначная логика. Примеры. 34 | 35 | 15. Вложенные запросы (подзапросы). NULL-значения в подзапросах. Примеры. 36 | 37 | 16. Агрегирующие функции. Примеры. 38 | 39 | 17. Оператор SELECT: секции GROUP BY, HAVING, ORDER BY, LIMIT. Семантика агрегирующих функций и сортировки при использовании группировки. Примеры. 40 | 41 | 18. Объединение, пересечение, вычитание в SQL. Примеры. 42 | 43 | 19. Виды соединений в SQL. Примеры. 44 | 45 | 20. Триггеры для таблиц и представлений в SQL. Примеры. 46 | 47 | 21. Индексы: назначение, принципы функционирования, классификация. Преимущества, недостатки использования индексов. 48 | 49 | 22. Индексы: по составному ключу, покрывающие, B-деревья. 50 | 51 | 23. Понятие транзакции. Обоснование необходимости использования транзакций. Свойства транзакций. Семантика начала и завершения транзакции в стандарте ANSI SQL. Откат транзакции. 52 | 53 | 24. Совместное выполнение транзакций. Зависимости между транзакциями. Способы достижения изоляции. 54 | 55 | 25. Обеспечение изоляции с помощью блокировок. Виды блокировок. Двухфазный протокол блокировок. 56 | 57 | 26. Обеспечение изоляции с помощью многоверсионности. 58 | 59 | 27. Тупиковые ситуации. Способы обнаружения и разрешения тупиков. 60 | 61 | 28. Уровни изоляции ANSI SQL. 62 | 63 | 29. Журнал транзакций. Назначение, виды, принципы журналирования. 64 | 65 | 30. Обеспечение свойства долговечности. Восстановление БД при индивидуальном откате транзакции, после мягкого и жесткого сбоя. Буферизация. 66 | 67 | 31. Курсоры: назначение, виды, операции. Хранимые процедуры. 68 | 69 | 32. Использование БД в программировании: API (принципы, примеры), ORM (принципы, примеры). 70 | 71 | 33. XML и JSON. Область применения. Сравнение с реляционными БД, описание схемы XML (DTD, XSD), запросы (XPath, XQuery). Структура JSON-документа. 72 | 73 | 34. BigData. Смысл термина, сфера применения, используемые инструменты. NoSQL хранилища: классификация, примеры. 74 | 75 | [Назад к требованиям к экзамену](https://github.com/db-course/syllabus/blob/master/exam/covid.md) 76 | 77 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 78 | -------------------------------------------------------------------------------- /git.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | # Инструкция по использованию git для сдачи лабораторных работ 4 | 5 | Для лабораторных работ предусмотрена онлайн-сдача на GitHub. Для этого нужно проделать ряд шагов, описанных ниже. Следует отметить, что данная инструкция не может претендовать не только на полноту описания возможностей git, но даже на полноценное введение, поскольку не описывает и 10% его самых базовых функций. Для более глубокого понимания сути и принципов работы с git обратитесь к ссылкам в конце данной инструкции. 6 | 7 | Схема работы с системой git для сдачи лабораторных работ в графическом виде приведена на следующем рисунке. 8 | 9 | ![Workflow](https://github.com/db-course/syllabus/blob/master/img/workflow.png) 10 | 11 | Далее в этой инструкции детально описаны шаги, необходимые для выполнения и сдачи лабораторных работ. В процессе чтения инструкции можно возвращаться к вышеприведенному рисунку для более наглядного восприятия. 12 | 13 | ## Настройка рабочей среды 14 | 15 | Необходимо создать аккаунт на GitHub, если у вас его еще нет. 16 | 17 | Далее следует установить клиент системы управления версиями git для вашей ОС. Он будет необходим для взаимодействия с сервером GitHub, а именно создания локальных репозиториев и отправки лабораторных работ на сервер. 18 | 19 | _Для чего используется в реальной жизни_: git — распределенная система управления версиями. Используется для совместной работы с текстовой информацией. Позволяет хранить несколько версий документов и при необходимости переключаться между ними. Также имеется возможность создания параллельных версий документов с собственной историей изменений, их объединение и множество других возможностей совместной разработки. 20 | 21 | Git может использоваться как для локального управления исходным кодом (то есть на том же компьютере, на котором этот исходный код создается), так и для хостинга исходного кода на сервере. Существует много публично доступных сервисов, предоставляющих услуги хостинга проектов под управлением системы git. Самым популярным среди таких сервисов является GitHub. 22 | 23 | В принципе, для git существует множество клиентов, но в данном курсе крайне рекомендуется пользоваться официальным клиентом, скачиваемым с сайта https://git-scm.com/downloads В составе установки содержится клиент командной строки Git Bash, использующий систему команд терминала GNU/Linux. Дальнейшие инструкции ориентированы на Git Bash. Все настройки в процессе установки можно принять по умолчанию. 24 | 25 | После установки требуется настроить клиент. Для этого из консоли Git Bash требуется выполнить команды задания имени пользователя и адреса электронной почты. 26 | 27 | ```bash 28 | git config --global user.name "ваше имя" 29 | ``` 30 | `ваше имя` - имя, которым будут подписаны ваши изменения. Рекомендуется использовать имя пользователя GitHub: 31 | 32 | ```bash 33 | git config --global user.name "ivanov" 34 | ``` 35 | Также необходимо выполнить следующую команду: 36 | 37 | ```bash 38 | git config --global user.email "ваш@email" 39 | ``` 40 | `ваш@email` - адрес электронной почты. Для этой цели можно использовать адрес электронной почты, предоставляемый GitHub и имеющий вид `ivanov@users.noreply.github.com`, где `ivanov` -- ваше имя пользователя. 41 | 42 | Эти настройки сохраняются глобально (для всех репозиториев на вашем компьютере), в дальнейшем при необходимости они могут быть изменены. Можно узнать текущее значение параметра имени пользователя и адреса электронной почты, выполнив команды 43 | 44 | ```bash 45 | git config --global user.name 46 | git config --global user.email 47 | ``` 48 | 49 | ## Регистрация в организации 50 | 51 | Для того чтобы выполнять лабораторные работы, нужно быть членом организации `db-course` на GitHub. Для этого необходимо после регистрации на GitHub подать заявку на вступление, которую принимает преподаватель. Чтобы это сделать, необходимо открыть issue (проблему) в репозитории [db-course/students](https://github.com/db-course/students). Как это сделать, указано в описании репозитория. 52 | 53 | Когда вы станете членом организации `db-course`, вам станут доступен один, а позднее несколько приватных (невидимых для пользователей, не являющихся членами) репозиториев, каждый из которых относится к какой-либо из лабораторных работ, для которых предусмотрена сдача на GitHub. Можно приступать к выполнению лабораторных работ. 54 | 55 | ![Private repo](https://github.com/db-course/syllabus/blob/master/img/privat_repo.png) 56 | 57 | ## Тренировка работы с git и GitHub 58 | 59 | Для тренировки работы с git и GitHub предназначена 0ЛР (тренировочная ЛР). Она является обязательной, но ее не требуется защищать и по ней не нужно оформлять отчет. Первоначально члену организации доступен репозиторий только этой лабораторной работы (`db-course/lab0-группа`), а после ее выполнения становятся доступны остальные репозитории. 60 | 61 | Чтобы выполнить тренировочную лабораторную работу, необходимо проделать те же действия, которые предусмотрены для обычных лабораторных работ: форк, клонирование, создание коммитов, отправка изменений, создание пулл-реквеста (см. следующие разделы инструкции). Требования к содержимому коммитов и порядку выполнения тренировочной лабораторной работы указаны в описании ее репозитория (`db-course/lab0-группа`). 62 | 63 | ## Подготовка к выполнению лабораторной работы 64 | 65 | Необходимо форкнуть (fork) приватный репозиторий, относящийся к лабораторной работе, которую вы хотите сдать. Для этого необходимо зайти в репозиторий, соответствующий работе (например, `db-course/lab3-4241`, если вы учитесь в группе 4241 и сдаете ЛР3), и нажать кнопку "Fork". 66 | 67 | ![Fork](https://github.com/db-course/syllabus/blob/master/img/fork.png) 68 | 69 | В открывшемся окне нужно убедиться, что в поле Owner (Владелец) указан ваш аккаунт на GitHub, все остальные настройки можно оставить по умолчанию, после чего нажать кнопку Create fork. 70 | 71 | ![Preforking](https://github.com/db-course/syllabus/blob/master/img/preforking.png) 72 | 73 | Через несколько секунд на сервере GitHub будет создана ваша копия репозитория проекта. 74 | 75 | Вы будете иметь права на внесение изменений в форк репозитория, что позволит загрузить на GitHub выполненную лабораторную работу. 76 | 77 | _Для чего используется в реальной жизни_: форк репозитория проекта — создание копии проекта на сервере. Это может преследовать разные цели: 78 | 79 | * Внесение собственного вклада в развитие чужого проекта. Для этого можно вносить соответствующие улучшения в свою копию проекта, а впоследствии путем создания пулл-реквеста (запроса на включение) предложить принять их в исходный проект его хозяину. 80 | 81 | * Создание собственного проекта на базе существующего. 82 | 83 | После создания форка на сервере GitHub нужно клонировать его на свой собственный компьютер. Для этого в командной строке перейдите к каталогу, в котором планируете выполнять лабораторные работы (например `D:\db\lr`), и выполните команду 84 | 85 | ```bash 86 | git clone https://github.com/ваше_имя/имя_репозитория_с_лр 87 | ``` 88 | 89 | Например, если студент группы 4241 с именем пользователя `ivanov` собирается клонировать репозиторий с ЛР3, для того чтобы сдать ее, необходимо выполнить команду 90 | 91 | ```bash 92 | git clone https://github.com/ivanov/lab3-4241 93 | ``` 94 | 95 | Поскольку это приватный репозиторий, клиент запросит авторизацию, чтобы проверить, обладаете ли вы правами на чтение из него. В случае успешной авторизации репозиторий будет склонирован. 96 | 97 | Будет создан локальный каталог (в данном случае `lab3-4241`), содержащий файл `README.md` (текстовый файл с описанием репозитория в формате markdown) и, другие файлы, если это предусмотрено лабораторной работой. Можно приступать к выполнению лабораторной работы. 98 | 99 | ## Выполнение лабораторной работы 100 | 101 | В описании конкретной лабораторной работы указано, какие именно файлы должны присутствовать в репозитории на момент сдачи. От этого зависит, необходимо ли создавать файлы собственноручно (ЛР0, ЛР2) или изменять уже существующие в репозитории файлы (ЛР3, ЛР4, ЛР5). В ЛР1 коммиты в репозитории создает стороннее приложение. 102 | 103 | Работу с файлами необходимо осуществлять в локальном клоне вашего репозитория (кроме ЛР1). Эта локальная копия также представляет собой репозиторий, который связан с исходным ссылкой `origin` (источник). Все изменения, которые вы вносите в файлы, следует сначала фиксировать в локальном репозитории, а затем направлять в репозиторий-источник (ваш форк, находящийся на сервере GitHub). 104 | 105 | Рассмотрим в упрощенном виде типичную последовательность действий разработчика при работе с системой контроля версий git. 106 | 107 | Разработчик создает в репозитории проект, и начинает вносить изменения в его файлы исходного кода. Достигнув определенной стадии разработки (например, реализована часть функционала, проект находится в работоспособном состоянии), разработчик может захотеть зафиксировать состояние проекта в локальном репозитории. Для этого сначала необходимо все файлы, подлежащие фиксации, поместить в индекс (stage) - промежуточный список файлов, который затем будет зафиксирован в качестве текущего состояния. Необходимо выполнить команду 108 | 109 | ```bash 110 | git add имя_файла 111 | ``` 112 | 113 | Она добавит в индекс указанный в качестве параметра файл. Проверить состояние индекса можно командой 114 | 115 | ```bash 116 | git status 117 | ``` 118 | 119 | Если изменения в файлы с момента предыдущей фиксации не вносились, вывод команды `git status` будет пустым. Если есть неиндексированные изменения (были изменены отслеживаемые файлы, уже добавленные в индекс файлы или добавлены новые файлы), то соответствующие файлы будут отмечены красным цветом. После внесения командой `git add` состояния файла в индекс соответствующий файл будет отображен зеленым цветом как готовый к фиксации. 120 | 121 | Часто возникает необходимость добавить в индекс сразу несколько файлов (и затем зафиксировать их состояние). Этого можно достичь указав несколько параметров в команде `git add`: 122 | 123 | ```bash 124 | git add имя_файла_1 имя_файла_2 имя_файла_3 125 | ``` 126 | 127 | Также есть возможность добавить в индекс сразу все измененные файлы в рабочем каталоге репозитория командой 128 | 129 | ```bash 130 | git add . 131 | ``` 132 | 133 | Пользоваться этой командой нужно с осторожностью и пониманием того, какие именно файлы попадут в последующую фиксацию (это можно узнать с помощью `git status`), чтобы не загромождать фиксацию лишними по смыслу изменениями. 134 | 135 | Фиксация состояния файла (коммит, commit) выполняется командой 136 | 137 | ```bash 138 | git commit -m "комментарий к коммиту" 139 | ``` 140 | 141 | Здесь `"комментарий к коммиту"` - ваше сообщение, описывающее, смысл данной фиксации. Например, так: 142 | 143 | ```bash 144 | git commit -m "Добавлены операторы удаления таблиц" 145 | ``` 146 | 147 | Выполнение команды `git status` после фиксации сообщит о том, что индекс пуст (незафиксированные изменения отсутствуют). 148 | 149 | _Для чего используется в реальной жизни_: коммит (фиксация) — снимок состояния проекта в конкретный момент времени (этим термином также обозначается действие по созданию такого снимка), также может быть рассмотрен как список изменений, внесенный разработчиком в предыдущее состояние проекта. Цель системы контроля версий — обеспечение доступа пользователей к состоянию проекта в любой момент времени. Список коммитов представляет собой историю изменений конкретной ветки проекта. Можно получить к нему доступ командой `git log`. При публикации на сервер публикуются не только сами файлы, но и все их версии со связанными с ними изменениями. Например, список изменений репозитория с описанием этого курса можно посмотреть здесь: https://github.com/db-course/syllabus/commits/master 150 | 151 | Например, типичный сценарий выполнения лабораторной работы с использованием git может выглядеть следующим образом: 152 | 153 | ```bash 154 | git status 155 | # нет изменений 156 | ``` 157 | 158 | _...редактирование файлов..._ 159 | 160 | ```bash 161 | git status 162 | # есть неиндексированные изменения, выделены красным цветом 163 | git add измененный_файл_1 измененный_файл_2 164 | git status 165 | # все изменения индексированы, выделены зеленым цветом 166 | git commit -m "Добавлены операторы создания таблиц" 167 | ``` 168 | 169 | _...обнаружена ошибка, редактирование файлов..._ 170 | 171 | ```bash 172 | git status 173 | # есть неиндексированные изменения, выделены красным цветом 174 | git add измененный_файл 175 | git status 176 | # все изменения индексированы, выделены зеленым цветом 177 | git commit -m "Исправлена ошибка создания таблицы Студент" 178 | ``` 179 | 180 | _...редактирование файлов..._ 181 | 182 | ```bash 183 | git status 184 | # есть неиндексированные изменения, выделены красным цветом 185 | git add измененный_файл_1 измененный_файл_2 186 | git status 187 | # все изменения индексированы, выделены зеленым цветом 188 | git commit -m "Таблицы Группа и Студент заполнены данными" 189 | ``` 190 | 191 | ## Сдача лабораторной работы 192 | 193 | Для сдачи работы необходимо опубликовать историю фиксаций (коммитов) из локального репозитория на сервер, в созданный вами репозиторий-форк. Напомним, на него указывает ссылка `origin`. 194 | 195 | Для публикации истории служит команда `git push`: 196 | 197 | ```bash 198 | git push origin master 199 | ``` 200 | 201 | В ней указывается, в какой репозиторий происходит публикация (`origin` — репозиторий-источник, который был клонирован) и какой ветви (`master` — основная ветвь, созданная в учебных репозиториях по умолчанию). У проекта может быть несколько ветвей, но ветвление не используется при сдаче лабораторных работ и здесь не рассмотрено. 202 | 203 | При публикации у вас могут быть затребованы учетные данные сайта GitHub, чтобы проверить, обладаете ли вы достаточными правами. 204 | 205 | Публикация коммитов на сервер может быть не окончательной, вы можете продолжать работать над файлами, фиксировать изменения и публиковать их столько, сколько будет необходимо. 206 | 207 | Чтобы сдать работу, необходимо отослать историю ваших изменений в центральный репозиторий этой работы в организации `db-course`. Там их увидит и оценит преподаватель. 208 | 209 | Выполнить команду `git push` вы не сможете, т.к. не обладаете правами на запись в центральный репозиторий данной работы. Вместо этого вы можете отправить запрос на включение изменений (пулл-реквест, pull request), и преподаватель получит уведомление о нем. 210 | 211 | _Для чего используется в реальной жизни_: пулл-реквест (иногда называемый также мердж-реквест, merge request) — основной способ вклада в проекты с открытым исходным кодом лицами, не являющимися членами проекта, но имеющими желание помочь. Помимо того, пулл-реквесты могут использоваться внутри команды разработчиков проекта для обсуждения внесения изменений из одних ветвей проекта в другие. 212 | 213 | Для создания пулл-реквеста необходимо зайти на страницу своего репозитория-форка, нажать на ссылку "Contribute" ("Внести вклад"), а затем - на кнопку "Open pull request". 214 | 215 | ![Pull request 1](https://github.com/db-course/syllabus/blob/master/img/pullrequest1.png) 216 | 217 | На появившейся странице в нижней части будут отображены изменения, которые вы внесли в файлы репозитория. В верхней части вам будет предложено написать заголовок и комментарий к своему пулл-реквесту. В заголовке напишите свой номер варианта и фамилию (например, "4 Иванов"). Комментарий можно оставить пустым. Убедитесь, что в поле "base repository" указан адрес центрального репозитория, который вы форкали (например, `db-course/lab1-4241`), а в поле head repository — адрес вашего форка. Кнопка "Create pull request" создаст пулл-реквест, и он будет ждать рассмотрения преподавателем. 218 | 219 | ![Pull request 2](https://github.com/db-course/syllabus/blob/master/img/pullrequest2.png) 220 | 221 | В дальнейшем открытый пулл-реквест (и пулл-реквесты других людей для этой лабораторной работы) можно найти на странице центрального репозитория на вкладке "Pull requests". Все свои пулл-реквесты удобно смотреть с помощью кнопки "Pull requests" в верхней правой части страницы. 222 | 223 | ![My PRs](https://github.com/db-course/syllabus/blob/master/img/my_prs.png) 224 | 225 | Если после создания пулл-реквеста были обнаружены недочеты в работе и необходимо их устранить, можно сделать это путем создания коммитов в локальном репозитории и их опубликования в репозиторий-форк. Все эти коммиты появятся в открытом пулл-реквесте и будут доступны для рассмотрения преподавателем. Закрывать открытые пулл-реквесты, а также удалять свои репозитории-форки нельзя. 226 | 227 | Преподаватель сможет оставлять комментарии к вашему пулл-реквесту (например, для уточнения или указания на ошибки). 228 | 229 | ![Conversation](https://github.com/db-course/syllabus/blob/master/img/conversation.png) 230 | 231 | Вы можете также отвечать на комментарии. 232 | 233 | Преподаватель может комментировать отдельные строчки вашей работы. 234 | 235 | ![Code review](https://github.com/db-course/syllabus/blob/master/img/code_review.png) 236 | 237 | Вы также можете отвечать на эти комментарии. 238 | 239 | ![Answer](https://github.com/db-course/syllabus/blob/master/img/answer.png) 240 | 241 | В случае успешной сдачи преподаватель отмечает это в пулл-реквесте и закрывает его. 242 | 243 | 260 | ## Если что-то пошло не так... 261 | 262 | В этом подразделе описаны некоторые ситуации, которые могут произойти по ошибке пользователя и привести к затруднению выполнения работы и могут быть исправлены с использованием системы git. 263 | 264 | __Неприятность 1__. Испорчены файлы в рабочей директории. Например, нечаянно удалены файлы / стерто содержимое / на клавиатуру легла кошка, заполнила файл бессмыслицей и сохранила изменения. 265 | 266 | _Решение_. Можно откатиться к последнему коммиту (фиксации), которая была сделана в локальном репозитории командой 267 | 268 | ```bash 269 | git reset --hard 270 | ``` 271 | 272 | Не выполняйте эту команду от нечего делать, она сотрет все ваши изменения с момента последней фиксации. 273 | 274 | Если вы не фиксируете изменения постепенно, командой будет выполнен откат на начальное состояние репозитория. 275 | 276 | __Неприятность 2__. Вы зафиксировали в локальный репозиторий испорченное состояние работы. Например, вы сделали фиксацию без текстового описания и стыдитесь этого / вы сделали и зафиксировали изменения, а потом осознали, что их не следовало делать, так как это не ваш вариант лабораторной / кошка в дополнение к предыдущему выполнила команды `git add` и `git commit` / вы по ошибке вместо файла с кодом записали в репозиторий фотографию своей кошки. 277 | 278 | _Решение_. Необходимо "переписать историю", то есть сместить указатель HEAD на предыдущий коммит, а также отменить все незафиксированные изменения в репозиторий. Для этого можно выполнить команду: 279 | 280 | ```bash 281 | git reset --hard HEAD~1 282 | ``` 283 | 284 | Эта команда еще страшнее, чем предыдущая, поскольку она удаляет не только все незафиксированные изменения, но и данные последней фиксации. Не следует выполнять ее от скуки. 285 | 286 | __Неприятность 3__. Вы зафиксировали в локальный репозиторий неполное изменение. Например, вы забыли дописать команду создания одной из таблиц или отформатировать код. 287 | 288 | _Решение_. Можно временно сместить указатель HEAD, доделать локальные изменения, а затем вернуть его обратно, сохранив предыдущее описание коммита. Для этого можно выполнить команды: 289 | 290 | ```bash 291 | git reset --soft HEAD~1 292 | ``` 293 | 294 | _...необходимые изменения..._ 295 | 296 | ```bash 297 | git commit -a -C ORIG_HEAD 298 | ``` 299 | 300 | Последняя команда восстанавливает исходное состояние указателя HEAD, сохраняя описание коммита. 301 | 302 | __Неприятность 4__. Вы зафиксировали "плохой" коммит (см. неприятности 2 и 3) и опубликовали его (выполнили push в свой репозиторий на сайте). 303 | 304 | _Решение_. Не стоит использовать два предыдущих варианта "переписывания истории" командой `git reset`, поскольку репозиторий на сайте доступен не только вам, и другие пользователи теоретически могут использовать коммиты, от которых вы хотите избавиться. Это может привести к осложнениям для них. В случае, если вам нужно исправить ошибки в опубликованных коммитах, вы должны создать новые коммиты, содержащие исправления, и опубликовать их. Следующие команды создают новый коммит, отменяющий изменения предыдущего, и публикуют его: 305 | 306 | ```bash 307 | git revert HEAD 308 | git push origin master 309 | # на этом этапе вы опубликовали отмену ранее опубликованных изменений 310 | ``` 311 | 312 | _...если нужно что-то доделать, то необходимые изменения..._ 313 | 314 | ```bash 315 | git add имя_файла_1 имя_файла_2 316 | git commit -m "Доработка" 317 | git push origin master 318 | ``` 319 | 320 | Неправильный коммит сохранится в истории, но будет исправлен следующими. 321 | 322 | __Неприятность 5__. Вы зафиксировали "плохой" коммит (см. неприятности 2 и 3), опубликовали его (выполнили `git push` в свой репозиторий на сайте) и создали пулл-реквест, попытавшись сдать работу преподавателю. 323 | 324 | _Решение_. Использовать `git reset`, также как и в предыдущем случае, нельзя, поскольку изменения были опубликованы. Хорошая новость в том, что для того чтобы поменять содержимое пулл-реквкста, нужно просто опубликовать исправленный коммит и, если необходимо, дополнения. Решение полностью совпадает с предыдущим. 325 | 326 | ### Материалы на русском языке для самостоятельного углубленного изучения 327 | 328 | * https://githowto.com/ru 329 | * https://git-scm.com/book/ru/v2/ 330 | * http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/ru/ 331 | * https://tproger.ru/translations/most-common-git-screwupsquestions-and-solutions/ 332 | 333 | [Назад к главной странице курса](https://github.com/db-course/syllabus) -------------------------------------------------------------------------------- /img/answer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/answer.png -------------------------------------------------------------------------------- /img/auto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/auto.jpg -------------------------------------------------------------------------------- /img/code_review.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/code_review.png -------------------------------------------------------------------------------- /img/conversation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/conversation.png -------------------------------------------------------------------------------- /img/field_properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/field_properties.png -------------------------------------------------------------------------------- /img/film1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/film1.png -------------------------------------------------------------------------------- /img/film2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/film2.png -------------------------------------------------------------------------------- /img/fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/fork.png -------------------------------------------------------------------------------- /img/issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/issues.png -------------------------------------------------------------------------------- /img/my_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/my_prs.png -------------------------------------------------------------------------------- /img/preforking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/preforking.png -------------------------------------------------------------------------------- /img/privat_repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/privat_repo.png -------------------------------------------------------------------------------- /img/pullrequest1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/pullrequest1.png -------------------------------------------------------------------------------- /img/pullrequest2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/pullrequest2.png -------------------------------------------------------------------------------- /img/rel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/rel1.png -------------------------------------------------------------------------------- /img/rel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/rel2.png -------------------------------------------------------------------------------- /img/relationship_properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/relationship_properties.png -------------------------------------------------------------------------------- /img/request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/request.png -------------------------------------------------------------------------------- /img/safemodewb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/safemodewb.png -------------------------------------------------------------------------------- /img/secondconndbf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/secondconndbf.png -------------------------------------------------------------------------------- /img/secondconnwb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/secondconnwb.png -------------------------------------------------------------------------------- /img/sotr1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/sotr1.png -------------------------------------------------------------------------------- /img/sotr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/sotr2.png -------------------------------------------------------------------------------- /img/stud1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/stud1.png -------------------------------------------------------------------------------- /img/stud2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/stud2.png -------------------------------------------------------------------------------- /img/table_properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/table_properties.png -------------------------------------------------------------------------------- /img/transbuttonsdbf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/transbuttonsdbf.png -------------------------------------------------------------------------------- /img/transbuttonswb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/transbuttonswb.png -------------------------------------------------------------------------------- /img/transmenudbf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/transmenudbf.png -------------------------------------------------------------------------------- /img/transmenuwb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/transmenuwb.png -------------------------------------------------------------------------------- /img/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/db-course/syllabus/2f2cc17e25625f9f05d1a51461887c92e520c3e2/img/workflow.png -------------------------------------------------------------------------------- /labs/lab1.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 1. Инфологическое моделирование предметной области 4 | 5 | ### Цель работы 6 | 7 | Освоение методов инфологического моделирования при проектировании схемы данных для реляционной базы данных. 8 | 9 | ### Теоретические сведения 10 | 11 | **Инфологическое моделирование** — способ разработки структуры базы данных, который опирается на семантику (смысл) данных. Входными данными является словесное описание предметной области, полученное от экспертов, выходными — формализованная модель, как правило, представленная в виде ER-диаграммы. 12 | 13 | #### Общие понятия и принципы инфологического моделирования [1] 14 | 15 | **ER-диаграмма** (Entity-Relationship diagram, диаграмма Сущность-Связь) описывает предметную область как набор сущностей, семантически связанных между собой. 16 | 17 | Следует различать понятия "сущность" и "экземпляр сущности". 18 | 19 | **Сущность** — набор однотипных объектов или фактов, о которых требуется хранить какую-либо информацию. Иными словами, сущность — все, что можно представить списком. 20 | 21 | Сущности желательно именовать существительными единственного числа. 22 | 23 | Примеры: 24 | "Товар" — множество всех товаров; 25 | "Клиент" — множество всех клиентов; 26 | "Покупка" — множество всех фактов покупки тем или иным покупателем того или иного товара. 27 | 28 | **Экземпляр сущности** — один объект (факт) набора, один элемент списка. 29 | 30 | Сущность определяет набор **атрибутов** — свойств, значения которых требуется хранить для каждого экземпляра. 31 | 32 | Важнейшая черта атрибутов сущности — атомарность. 33 | 34 | **Атомарность данных** (atomicity) — неделимость. Атомарные данные не представляют собой множества значений или списка значений. Атомарность данных — неоднозначная характеристика, и должна определяться с точки зрения семантики данных и предполагаемых методов работы с ними. [2] Так, атрибут "Габариты" сущности "Товар" может быть классифицирован как атомарный, если при работе с моделью будет иметь смысл использовать габариты товара только в совокупности (например, выводить на экран в спецификации), и не придется рассматривать ширину, глубину и высоту товара по отдельности (например, искать товар с шириной не более 1,5 метров). В противном случае атрибут "Габариты" будет неатомарным и требовать пересмотра модели. 35 | 36 | Рассмотрим способы борьбы с неатомарностью. 37 | 38 | * Атрибут может быть разбит на несколько атрибутов (в случае если атрибут представляет собой набор разных по смыслу значений). Пример: 39 | 40 | Исходная сущность: 41 | 42 | ![](https://github.com/db-course/syllabus/blob/master/img/stud1.png) 43 | 44 | | Nзач | ФИО | 45 | |:----:|:--------------------:| 46 | | 123 | Иванов Иван Иванович | 47 | 48 | Преобразованная сущность: 49 | 50 | ![](https://github.com/db-course/syllabus/blob/master/img/stud2.png) 51 | 52 | | Nзач | Фамилия | Имя | Отчество | 53 | |:----:|:-------:|------|----------| 54 | | 123 | Иванов | Иван | Иванович | 55 | 56 | * Атрибут может быть преобразован в атомарный путем пересмотра того, что будет экземпляром сущности (в случае если атрибут представляет собой список однотипных по смыслу значений, о которых не требуется хранить дополнительных сведений, и значение атрибута индивидуально у каждого экземпляра). Пример: 57 | 58 | Исходная сущность: 59 | 60 | ![](https://github.com/db-course/syllabus/blob/master/img/sotr1.png) 61 | 62 | | Фамилия | Телефоны | 63 | |:-------:|:----------------------------------:| 64 | | Иванов | +7 (812) 1234567, +7 (812) 7654321 | 65 | 66 | Преобразованная сущность: 67 | 68 | ![](https://github.com/db-course/syllabus/blob/master/img/sotr2.png) 69 | 70 | | Фамилия | Телефон | 71 | |:-------:|:----------------:| 72 | | Иванов | +7 (812) 1234567 | 73 | | Иванов | +7 (812) 7654321 | 74 | 75 | В данном примере экземпляром сущности был человек, а атрибутами — его фамилия и номера телефонов. После преобразования экземпляром сущности стал факт того, что человек имеет тот или иной номер телефона, а атрибутами факта — фамилия человека и номер телефона. 76 | 77 | * Атрибут может быть вынесен в отдельную сущность (в случае если атрибут представляет собой список одинаковых по смыслу значений, о которых требуется хранить дополнительные сведения, или значение атрибута может повторяться у нескольких экземпляров). Пример: 78 | 79 | Исходная сущность: 80 | 81 | ![](https://github.com/db-course/syllabus/blob/master/img/film1.png) 82 | 83 | | Фильм | Актерский состав | 84 | |:-----------:|:--------------------------------------------------:| 85 | | Смысл жизни | Иванов (род. 1979-02-21), Петров (род. 1988-07-13) | 86 | 87 | Преобразованные сущности: 88 | 89 | ![](https://github.com/db-course/syllabus/blob/master/img/film2.png) 90 | 91 | | Фильм | 92 | |:-----------:| 93 | | Смысл жизни | 94 | 95 | | Фамилия актера | Дата рождения | 96 | |:--------------:|:-------------:| 97 | | Иванов | 1979-02-21 | 98 | | Петров | 1988-07-13 | 99 | 100 | В последнем случае вновь сформированная сущность будет связана с исходной. 101 | 102 | **Связи** между сущностями проводятся в том случае, если экземпляры сущностей связаны друг с другом семантически. Экземпляры связей также несут информацию и устанавливают ассоциации между конкретными экземплярами сущностей. Сущность может быть связана сама с собой, в случае если между собой ассоциированы ее отдельные экземпляры. 103 | 104 | Связи различаются по **кратности** (мощности): "один-к-одному", "один-ко-многим", "многие-ко-многим". 105 | 106 | Тип связи определяется по отдельности на обоих ее концах. Чтобы определить тип связи на одном из концов, необходимо зафиксировать одиночный экземпляр одной из связанных сущностей и оценить, сколько экземпляров второй сущности с ним может быть логически связано: только один или несколько. Затем аналогичные действия производятся для другого конца связи. 107 | 108 | Примеры: 109 | 110 | Сущность "Сеанс" связана с сущностью "Билет" связью "один-ко-многим" (на один сеанс продается много билетов; один билет действителен только на один сеанс). 111 | Сущность "Группа" связана с сущностью "Студент" связью "один-ко-многим", которая обозначает, что студент учится в группе (в группе учится много студентов, студент может учиться только в одной группе). 112 | Сущность "Группа" связана с сущностью "Студент" связью "один-к-одному", которая обозначает, что студент является старостой группы (у группы только один староста, студент может быть старостой только одной группы). 113 | 114 | ![](https://github.com/db-course/syllabus/blob/master/img/rel1.png) 115 | 116 | Сущность "Водитель" связана с сущностью "Автобус" связью "многие-ко-многим" (один водитель может водить несколько автобусов, один автобус может управляться несколькими водителями). 117 | 118 | ![](https://github.com/db-course/syllabus/blob/master/img/rel2.png) 119 | 120 | Бывают ситуации, когда между сущностями есть несколько связей. Например, между сущностями "Группа" и "Студент", как показано в примерах выше. 121 | 122 | В большинстве случаев, когда между сущностями существует единственная связь кратности "один-к-одному", данные сущности могут быть отождествлены с точки зрения данных и слиты в одну. Например, сущности "Товар" и "Товар на складе" могут быть отождествлены в том случае, если склад единственен, и одному товару соответствует ровно один факт его наличия на этом складе. 123 | 124 | Для каждой сущности должен быть определен ключ. 125 | 126 | **Ключ сущности** — минимальный набор атрибутов и связей, комбинация значений которых гарантированно уникальна для всех экземпляров данной сущности (иными словами, гарантированно различается у любых двух ее экземпляров). Ключ может быть естественным (т.е. быть продиктованным семантикой предметной области) или суррогатным (т.е. введенным в модель только из-за необходимости наличия ключа при неудобстве использования или неинтуитивности естественного ключа). 127 | 128 | В лабораторной работе в академических целях предпочтение необходимо отдавать естественным ключам. 129 | 130 | В случае, если ключ составляет одиночный атрибут, его значение не может повториться ни у одного экземпляра сущности. В случае, если ключ состоит из нескольких атрибутов, по отдельности значение каждого из них может совпадать у двух экземпляров, а требование уникальности накладывается на комбинацию их значений. 131 | 132 | Нередки случаи, когда частью естественного ключа для сущности является связь (такая связь называется **ключевой**). Это значит, что два экземпляра данной сущности при совпадении значений остальных частей ключа будут гарантированно связаны с различными экземплярами второй сущности. 133 | 134 | Пример: 135 | 136 | Ключ сущности "Этап проекта" будет составным: (атрибут "Номер этапа", связь с сущностью "Проект"). Так, номера этапов, ассоциированных с одним и тем же проектом, будут гарантированно различными, а если у двух этапов номера совпадают, то они гарантированно относятся к различным проектам. 137 | 138 | #### Переход к реляционной модели 139 | 140 | Предварительно ознакомиться: [материалы лекции по реляционной модели данных](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture1). 141 | 142 | После составления ER-модели необходимо, руководствуясь нижеприведенным алгоритмом, перейти к реляционной модели той же самой предметной области. В дальнейшем в СУБД используется именно она. 143 | 144 | Реляционная модель является менее абстрактной и уточняет некоторые детали, такие как домены для атрибутов, специфические для СУБД названия отношений и атрибутов, ограничения целостности и др. 145 | 146 | Алгоритм перехода от ER-модели к реляционной модели 147 | 148 | 1. Каждой сущности ставится в соответствие отношение. Атрибуты сущности становятся атрибутами отношения. Если атрибут был ключевым, он становится частью потенциального ключа отношения. 149 | 1. Для каждой связи "один-ко-многим" ключевые атрибуты со стороны "один" копируются на сторону "многие". Если связь была ключевой (и только в этом случае), скопированные атрибуты становятся частью ключа. 150 | 1. Для каждой связи "многие-ко-многим" создается промежуточное отношение, в которое копируются ключевые атрибуты связанных сущностей. Все они образуют составной ключ. Полученное отношение (т.н. отношение пересечения) связывается с исходными связями "многие-к-одному". 151 | 152 | ### Порядок выполнения 153 | 154 | Примечание: основной репозиторий для выполнения лабораторной работы: ``db-course/lab1-группа`` (в названии репозитория должен быть ваш номер группы) 155 | 156 | 1. Ознакомиться с неформализованным словесным описанием предметной области, при необходимости уточнив детали у преподавателя. 157 | 1. Разработать ER-модель в соответствии с индивидуальным вариантом задания. 158 | 1. Осуществить переход к реляционной модели. 159 | 1. Оформить отчет по проделанной работе. 160 | 161 | ### Содержание отчета 162 | 163 | 1. Титульный лист. 164 | 1. Цель работы. 165 | 1. Индивидуальный вариант задания. 166 | 1. Разработанная ER-модель. 167 | 1. Синтезированная реляционная схема. 168 | 1. Выводы. 169 | 170 | ### Вспомогательные материалы 171 | 172 | 1. [Элементы модели "сущность-связь"](http://citforum.ru/database/dblearn/dblearn08.shtml) 173 | 1. [Атомарность данных](https://basegroup.ru/community/glossary/atomic-data) 174 | 175 | ### Вопросы к защите 176 | 177 | * В чем отличия инфологической и даталогической моделей? 178 | * Что является экземпляром сущности X? 179 | * Объясните семантику (смысл) связи между сущностями X и Y. 180 | * Объясните кратность (вид) связи между сущностями X и Y. 181 | * Что такое ключ в ER-модели? 182 | * Что такое ключевая связь? 183 | * Объясните выбор ключа для сущности X. 184 | * Что такое потенциальный ключ в реляционной модели? 185 | * В чем отличие первичного ключа от потенциального ключа? 186 | * В чем отличие двух потенциальных ключей a и b от составного потенциального ключа (a, b)? 187 | * Что такое внешний ключ в реляционной модели? 188 | * В чем отличие двух внешних ключей a и b от составного внешнего ключа (a, b)? 189 | 190 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 191 | -------------------------------------------------------------------------------- /labs/lab2.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 2. Создание базы данных в СУБД Microsoft Access 4 | 5 | ### Цель работы 6 | 7 | Ознакомление с методами проектирования схемы и управления данными в графическом интерфейсе СУБД Microsoft Access. 8 | 9 | ### Теоретические сведения 10 | 11 | Предварительно ознакомиться: [материалы лекции по реляционной модели данных](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture1). 12 | 13 | Microsoft Access — реляционная система управления базами данных (СУБД), входящая в пакет Microsoft Office. Не является клиент-серверной СУБД: реляционный движок ACE встроен в приложение Access, что позволяет ему работать с файлами специального формата как с базой данных. 14 | 15 | Access располагает компонентами для проектирования схемы базы данных, работы с данными в графическом интерфейсе, построения экранных форм, формирования отчетов. Несмотря на то, что функционал приложения как СУБД существенно ограничен и во многом не соответствует стандарту SQL, простота установки и настройки, а также удобный графический интерфейс пользователя делают его подходящим для изучения основ работы с реляционными базами данных. 16 | 17 | ### Рекомендации по выполнению лабораторной работы 18 | 19 | Для выполнения работы рекомендуется использовать Access версии 2013 или новее. 20 | 21 | При выполнении работы необходимо выбрать создание пустой базы данных, а затем по очереди создать все заданные в модели таблицы в режиме конструктора. В этом режиме для каждой колонки указывается имя, тип данных, а также ряд других параметров (размерность, маска ввода, обязательность, пользовательское ограничение). 22 | 23 | Пользовательские ограничения (согласно индивидуальному варианту) задаются в поле "Правило проверки". Синтаксис ограничений описан в [1]. 24 | 25 | Следует различать ограничения уровня колонки (задаваемые в окне "Свойства поля"), которые проверяются только при занесении или изменении значений в данной колонке, и ограничения уровня таблицы (задаваемые в окне "Свойства таблицы"), которые проверяются при занесении или изменении значений сразу в нескольких колонках. 26 | 27 | Ограничение уровня колонки: 28 | 29 | ![](https://github.com/db-course/syllabus/blob/master/img/field_properties.png) 30 | 31 | Ограничение уровня таблицы: 32 | 33 | ![](https://github.com/db-course/syllabus/blob/master/img/table_properties.png) 34 | 35 | После создания таблиц необходимо перейти к созданию связей между ними, осуществляющих проверку ссылочной целостности. Необходимо помнить, что ссылаться можно только на колонку того же типа, и в целом ссылка (в том числе составная) должна идти на полный ключ. 36 | 37 | Для каждой связи помимо указания связанных атрибутов необходимо включать проверку целостности (в противном случае ограничения по внешнему ключу не будут форсироваться), а также (по желанию) каскадное обновление и удаление связанных записей. 38 | 39 | ![](https://github.com/db-course/syllabus/blob/master/img/relationship_properties.png) 40 | 41 | Включение каскадного обновления (удаления) активирует режим, когда при изменении (удалении) строки в главной таблице изменяются (удаляются) строки в подчиненной таблице, ссылающуюся на изменяемую (удаляемую) строку. 42 | 43 | После завершения работы над схемой данных, можно переходить к заполнению базы данных данными. Помните, что менять схему после занесения в таблицы данных может быть затруднительно. Всего необходимо добавить в таблицы по 5-10 строк, которые правдоподобно и полно отражали бы множественные взаимосвязи между данными. 44 | 45 | Также необходимо проверить попыткой внесения некорректных данных, работают ли ограничения ссылочной целостности, заданные связями между таблицами, и пользовательские ограничения. 46 | 47 | ### Порядок выполнения 48 | 49 | Примечание: основной репозиторий для выполнения лабораторной работы: ``db-course/lab2-группа`` (в названии репозитория должен быть ваш номер группы) 50 | 51 | 1. Реализовать реляционную схему, полученную в ЛР1, визуальными средствами Microsoft Access. 52 | 1. Осуществить проверку ограничений в соответствии с индивидуальным вариантом средствами Microsoft Access. 53 | 1. Заполнить базу данных данными, позволяющими удостовериться в работоспособности ограничений реляционной модели и пользовательских ограничений. 54 | 1. Оформить отчет по проделанной работе. 55 | 56 | ### Содержание отчета 57 | 58 | 1. Титульный лист. 59 | 1. Цель работы. 60 | 1. Индивидуальный вариант задания. 61 | 1. Снимок экрана реляционной схемы в Microsoft Access. 62 | 1. Тексты логических условий ограничений, заданных для таблиц. 63 | 1. Снимки экранов всех заполненных таблиц. 64 | 1. Снимки экранов результатов работы ограничений с данными, вызвавшими их срабатывание. 65 | 1. Выводы. 66 | 67 | ### Вспомогательные материалы 68 | 69 | 1. [Ограничение ввода данных с помощью правил проверки](https://support.microsoft.com/ru-ru/topic/%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8-b91c6b15-bcd3-42c1-90bf-e3a0272e988d) 70 | 71 | ### Вопросы к защите 72 | 73 | * Объясните нотацию реляционной схемы, применяемую в Access. 74 | * В чем отличие проверок условия на значение на уровне колонки и на уровне таблицы? 75 | * Объясните принцип работы ограничения X. 76 | * Что такое потенциальный ключ в реляционной модели? 77 | * В чем отличие первичного ключа от потенциального ключа? 78 | * В чем отличие двух потенциальных ключей a и b от составного потенциального ключа (a, b)? 79 | * Как задать несколько ключей для таблицы в Access? 80 | * Что такое внешний ключ в реляционной модели? 81 | * В чем отличие двух внешних ключей a и b от составного внешнего ключа (a, b)? 82 | * Что означает свойство связи "Обеспечение целостности данных"? 83 | * Что означает свойство связи "Каскадное обновление связанных полей"? 84 | * Что означает свойство связи "Каскадное удаление связанных записей"? 85 | 86 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 87 | -------------------------------------------------------------------------------- /labs/lab3.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 3. Создание базы данных в СУБД SQLite 4 | 5 | ### Цель работы 6 | 7 | Освоение синтаксиса операторов DDL и DML. Приобретение навыков использование команд языка SQL для создания базы данных с заданной схемой и управления данными в ней. 8 | 9 | ### Теоретические сведения 10 | 11 | Предварительно ознакомиться: [материалы лекции по командам CREATE TABLE и INSERT](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture4). 12 | 13 | При выполнении данной работы настоятельно рекомендуется пользоваться сведениями из учебного пособия по SQLite [1]. 14 | 15 | SQLite — легковесный реляционный движок; представляет собой встраиваемую в приложение библиотеку, и не работает по схеме "клиент-сервер". SQLite широко используется в прикладных приложениях, в том числе на мобильных платформах, в качестве средства хранения данных. С учетом легкости установки, отсутствия необходимости настройки и неплохой поддержки стандарта SQL, данная СУБД хорошо подходит для использования в учебных целях. 16 | 17 | ### Рекомендации по выполнению лабораторной работы 18 | 19 | Лабораторную работу рекомендуется выполнять в программах [SQLiteSpy](https://www.yunqa.de/delphi/apps/sqlitespy/index) или [sqlite-gui](https://github.com/little-brother/sqlite-gui/releases), но допустимо использование других клиентов. 20 | 21 | Особенностью движка SQLite является выключенное по умолчанию ограничение ссылочной целостности (не производится форсирование внешних ключей). Это объясняется стремлением сохранить обратную совместимость с приложениями, написанными для более старых версий библиотеки (поддержка внешних ключей была реализована в SQLite начиная с версии 3.6.19 в 2009 году). В академических целях необходимо в самом начале скрипта принудительно включить форсирование внешних ключей командой 22 | 23 | ```sql 24 | PRAGMA foreign_keys = ON; 25 | ``` 26 | 27 | Скрипт лабораторной работы представляет собой одиночный текстовый файл, структурированный следующим образом: 28 | 29 | * Команда включения внешних ключей 30 | * Команды очистки схемы данных (DROP TABLE) 31 | * Команды создания схемы данных (CREATE TABLE) 32 | * Команды заполнения базы данных данными (INSERT) 33 | 34 | Таблицы желательно заполнять данными с учетом ограничений ссылочной целостности, т.е. сначала главные, а затем подчиненные. Иными словами, вначале заполняются данными таблицы, на которые указывают ссылки, а затем — таблицы, которые содержат ссылки. В этом случае ссылки при добавлении строк в подчиненные таблицы будут валидными и не вызовут нарушений целостности. 35 | 36 | Команды очистки схемы данных необходимы для удобства исполнения скрипта целиком в случае, если в схему данных были внесены изменения и надо перегенерировать ее. При этом нужно помнить, что если в таблицах уже содержатся данные, при удалении таблиц будут форсироваться ограничения ссылочной целостности (не будет позволено удалить таблицу, если существуют данные, которые ссылаются на строки из удаляемой таблицы). Чтобы гарантированно перегенерировать схему и данные, следует придерживаться определенного порядка при удалении таблиц, а именно противоположного их созданию и заполнению: сначала имеет смысл удалять подчиненные таблицы, содержащие ссылки, и лишь затем — главные таблицы, на которые те ссылались. 37 | 38 | Перед сдачей лабораторной работы следует убедиться, что скрипт исполняется полностью многократно и не вызывает ошибок. 39 | 40 | ### Порядок выполнения 41 | 42 | Примечание: основной репозиторий для выполнения лабораторной работы: ``db-course/lab3-группа`` (в названии репозитория должен быть ваш номер группы) 43 | 44 | 1. Реализовать реляционную схему, полученную в ЛР1, операторами DDL языка SQL в SQLite (с помощью SQLiteSpy или другого приложения, использующего движок SQLite). 45 | 1. Командой PRAGMA включить проверку ограничения ссылочной целостности. 46 | 1. Осуществить проверку ограничений в соответствии с индивидуальным вариантом ЛР2 средствами языка SQL. 47 | 1. Операторами INSERT языка SQL заполнить базу данных данными, позволяющими удостовериться в работоспособности ограничений реляционной модели и пользовательских ограничений. 48 | 1. Оформить отчет. 49 | 50 | ### Содержание отчета 51 | 52 | 1. Титульный лист. 53 | 1. Цель работы. 54 | 1. Индивидуальный вариант задания. 55 | 1. Снимок экрана реляционной схемы в Microsoft Access. 56 | 1. Листинг скрипта SQL создания и заполнения базы данных. 57 | 1. Выводы. 58 | 59 | Примечание: листинг скрипта должен быть приведен с использованием моноширинного шрифта для удобочитаемости. 60 | 61 | ### Вспомогательные материалы 62 | 63 | 1. Учебно-методическое пособие "Работа с СУБД с SQLite с использованием SQLiteSpy" — в личном кабинете 64 | 65 | ### Вопросы к защите 66 | 67 | * Объясните синтаксис и семантику оператора CREATE TABLE. 68 | * Объясните синтаксис и семантику оператора INSERT. 69 | * В чем проявляется то, что SQLite проверяет ссылочную целостность данных? 70 | * В чем отличие двух потенциальных ключей a и b от составного потенциального ключа (a, b)? 71 | * В чем отличие двух внешних ключей a и b от составного внешнего ключа (a, b)? 72 | * Объясните принцип работы ограничения X. 73 | 74 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 75 | -------------------------------------------------------------------------------- /labs/lab4.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 4. Создание представлений на основании запросов на выборку в СУБД SQLite. Запросы на модификацию и удаление данных в СУБД SQLite 4 | 5 | ### Цель работы 6 | 7 | Освоение синтаксиса операторов SELECT, UPDATE и DELETE при выполнении запросов на выборку, модификацию и удаление данных. Приобретение навыков использования средств языка SQL для выполнения типовых запросов к данным в реляционной модели. Знакомство с принципами работы представлений в реляционных СУБД. 8 | 9 | ### Теоретические сведения 10 | 11 | Предварительно ознакомиться: [материалы лекций по командам SELECT, UPDATE и DELETE](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture4). 12 | 13 | При выполнении данной работы настоятельно рекомендуется пользоваться сведениями из учебного пособия по SQLite [1]. 14 | 15 | ### Рекомендации по выполнению лабораторной работы 16 | 17 | Лабораторную работу рекомендуется выполнять в программах [SQLiteSpy](https://www.yunqa.de/delphi/apps/sqlitespy/index) или [sqlite-gui](https://github.com/little-brother/sqlite-gui/releases), но допустимо использование других клиентов. 18 | 19 | Скрипт лабораторной работы представляет собой одиночный текстовый файл, структурированный следующим образом: 20 | 21 | * Команды удаления представлений (DROP VIEW) 22 | * Команды создания представлений (CREATE VIEW) 23 | * Команда на модификацию данных (UPDATE, должна быть закомментирована) 24 | * Команда на удаление данных (DELETE, должна быть закомментирована) 25 | 26 | Команда создания представления должна сопровождаться SQL-комментарием, объясняющим назначение этого представления. 27 | 28 | Следует отметить, что представление должно создаваться одиночным SQL-запросом (при этом допускается использование вложенных запросов) и не обращаться к другим представлениям в схеме. И вообще, создание иных представлений помимо тех, которые фигурируют в задании, должно быть согласовано с преподавателем. 29 | 30 | Команды модификации и удаления данных следует закомментировать, чтобы они не выполнялись при выполнении скрипта целиком. 31 | 32 | Перед сдачей лабораторной работы следует убедиться, что скрипт исполняется полностью многократно и не вызывает ошибок. 33 | 34 | ### Порядок выполнения 35 | 36 | Примечание: основной репозиторий для выполнения лабораторной работы: ``db-course/lab4-группа`` (в названии репозитория должен быть ваш номер группы) 37 | 38 | 1. Реализовать для базы данных, полученной в ЛР3, представления, а также запросы на модификацию и удаление на основании задания, полученного от преподавателя. 39 | 1. Оформить отчет. 40 | 41 | ### Содержание отчета 42 | 43 | 1. Титульный лист. 44 | 1. Цель работы. 45 | 1. Индивидуальный вариант задания. 46 | 1. Снимок экрана реляционной схемы в Microsoft Access. 47 | 1. Листинг скрипта SQL создания представлений, а также запросов на модификацию и удаление. 48 | 1. Выводы. 49 | 50 | Примечание: листинг скрипта должен быть приведен с использованием моноширинного шрифта для удобочитаемости. 51 | 52 | ### Вспомогательные материалы 53 | 54 | 1. Учебно-методическое пособие "Работа с СУБД с SQLite с использованием SQLiteSpy" — в личном кабинете 55 | 56 | ### Вопросы к защите 57 | 58 | * Объясните синтаксис и семантику оператора SELECT. 59 | * Что такое представления и зачем они нужны? 60 | * Объясните синтаксис и семантику оператора UPDATE. 61 | * Объясните синтаксис и семантику оператора DELETE. 62 | * Объясните принцип работы запроса X. 63 | 64 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 65 | -------------------------------------------------------------------------------- /labs/lab5.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 5. Создание триггеров в СУБД SQLite 4 | 5 | ### Цель работы 6 | 7 | Изучение принципов работы триггеров в реляционных СУБД. Приобретение навыков создания триггеров на добавление, изменение и удаление данных для создания пользовательских ограничений целостности данных. 8 | 9 | ### Теоретические сведения 10 | 11 | Предварительно ознакомиться: [материал лекции по триггерам](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture4). 12 | 13 | При выполнении данной работы настоятельно рекомендуется пользоваться сведениями из учебного пособия по SQLite [1]. 14 | 15 | ### Рекомендации по выполнению лабораторной работы 16 | 17 | Лабораторную работу рекомендуется выполнять в программах [SQLiteSpy](https://www.yunqa.de/delphi/apps/sqlitespy/index) или [sqlite-gui](https://github.com/little-brother/sqlite-gui/releases), но допустимо использование других клиентов. 18 | 19 | Скрипт лабораторной работы представляет собой одиночный текстовый файл, структурированный следующим образом: 20 | 21 | * Команды удаления триггеров (DROP TRIGGER) 22 | * Команды создания триггеров (CREATE TRIGGER) 23 | * Команды проверки работы триггеров (должны быть закомментированы) 24 | 25 | Команда создания триггера должна сопровождаться SQL-комментарием, объясняющим назначение этого триггера. 26 | 27 | Команды проверки работы триггеров представляют собой DML-операторы, которые должны добавлять / изменять / удалять данные таким образом, чтобы спровоцировать выполнение соответствующего триггера на тех данных, которые имеются в базе данных после выполнения генерирующего скрипта. 28 | 29 | Перед сдачей лабораторной работы следует убедиться, что скрипт исполняется полностью многократно и не вызывает ошибок. 30 | 31 | ### Порядок выполнения 32 | 33 | Примечание: основной репозиторий для выполнения лабораторной работы: ``db-course/lab5-группа`` (в названии репозитория должен быть ваш номер группы) 34 | 35 | 1. Реализовать для базы данных, полученной в ЛР3, триггеры на основании задания, полученного от преподавателя. 36 | 1. Оформить отчет. 37 | 38 | ### Содержание отчета 39 | 40 | 1. Титульный лист. 41 | 1. Цель работы. 42 | 1. Индивидуальный вариант задания. 43 | 1. Снимок экрана реляционной схемы в Microsoft Access. 44 | 1. Листинг скрипта SQL создания триггеров. 45 | 1. Примеры срабатывания. 46 | 1. Выводы. 47 | 48 | Примечание: листинг скрипта должен быть приведен с использованием моноширинного шрифта для удобочитаемости. 49 | 50 | ### Вспомогательные материалы 51 | 52 | 1. Учебно-методическое пособие "Работа с СУБД с SQLite с использованием SQLiteSpy" — в личном кабинете 53 | 54 | ### Вопросы к защите 55 | 56 | * Объясните назначение и принцип работы триггеров. 57 | * В чем разница между тем или иным видом триггеров? 58 | * Объясните синтаксис и семантику оператора CREATE TRIGGER. 59 | * Объясните принцип работы триггера X. 60 | 61 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 62 | -------------------------------------------------------------------------------- /labs/lab6.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 6. Управление транзакциями в СУБД MySQL 4 | 5 | ### Цель работы 6 | 7 | Ознакомление с механизмами изоляции транзакций при параллельном выполнении запросов к одним и тем же данным на различных уровнях изоляции с использованием блокировок и многоверсионности. Получение навыков работы с СУБД MySQL. 8 | 9 | ### Теоретические сведения 10 | 11 | Предварительно ознакомиться: [материалы лекции по изоляции транзакций](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture5). 12 | 13 | #### Многоверсионность (на примере MySQL) 14 | 15 | Идея многоверсионности (MVCC, Multi-Versioned Concurrency Control) как метода достижения изоляции основана на том факте, что процесс, выполняющий чтение данных (оператор SELECT) заинтересован не столько в их свежести, сколько в их целостности. Следовательно, можно избавиться от необходимости блокировок на чтение, вместо этого предоставляя читающим транзакциям КОПИЮ (снэпшот) последнего, возможно, не самого свежего, но целостного набора запрашиваемых данных. 16 | 17 | На уровне REPEATABLE READ каждой транзакции присваивается таймпоинт, после чего она читает свой личный снэпшот целостных данных из журнала транзакций. Добавления, изменения или удаления данных, произведенные параллельными транзакциями с более поздними таймпоинтами, не видны всем операторам текущей транзакции. 18 | 19 | На уровне READ COMMITTED каждый оператор SELECT работает со наиболее свежим на момент его старта целостным снэпшотом набора данных. При этом если какая-то другая транзакция после этого изменяет этот набор данных и фиксируется, следующий оператор SELECT получит его новую версию в качестве целостного снэпшота. 20 | 21 | Следует понимать, что многоверсионность проявляется только при чтении данных (т.е. отсутствуют S-блокировки, не блокируются зависимости W-R и R-W). При этом запись осуществляется непосредственно в БД, а не в снэпшот, и если возникает зависимость W-W, используются блокировки. 22 | 23 | На уровне READ UNCOMMITTED многоверсионность не используется: каждый оператор SELECT читает последнюю (возможно, «грязную») версию данных непосредственно из БД. 24 | 25 | Уровень SERIALIZABLE в MySQL эквивалентен уровню REPEATABLE READ с неявным принудительным включением разделяемых блокировок в операторах SELECT. 26 | 27 | #### Принудительное включение блокировок 28 | 29 | В MySQL есть возможность принудительного включения блокировок на чтение. Это достигается конструкцией SELECT … LOCK IN SHARE MODE. 30 | 31 | При этом вне зависимости от уровня изоляции, на существующие в таблице строки, удовлетворяющие условию WHERE оператора SELECT текущей транзакции, накладываются разделяемые блокировки, что: 32 | 33 | * не позволяет текущей транзакции читать данные, измененные другой транзакцией, которая еще не была зафиксирована («грязное чтение», W-R); 34 | * не позволяет другим транзакциям изменять данные, прочитанные текущей транзакцией (неповторяемое чтение, R-W). 35 | 36 | Разница между уровнями изоляции проявляется лишь в способах наложения блокировок. На уровнях READ COMMITTED и READ UNCOMMITTED блокируются только существующие строки, удовлетворяющие условию фильтрации. На уровне REPEATABLE READ используются диапазонные блокировки, что исключает возможность появления фантомов. 37 | 38 | #### Общие сведения о MySQL 39 | 40 | MySQL – клиент-серверная система управления базами данных. Это означает, что СУБД выполняется в виде процесса и имеет полный доступ к базе данных, тогда как другие приложения при необходимости работать с данными обязаны формировать запросы и отправлять их процессу СУБД. 41 | 42 | MySQL имеет в распоряжении несколько движков: InnoDB, MyISAM, XtraDB и другие. 43 | 44 | В контексте рассмотрения механизмов управления транзакциями, наибольший интерес представляет ACID-совместимый движок InnoDB, который является который с 2010 года (MySQL 5.5) является движком по умолчанию для таблиц. 45 | 46 | ### Рекомендации по выполнению лабораторной работы 47 | 48 | Задания выполняются с использованием сервера MySQL версии 5.5 или выше. В качестве клиента можно использовать либо поставляемую с сервером утилиту командной строки mysql, либо официальный инструментарий MySQL Workbench, либо стороннее ПО, например, dbForge Studio for MySQL или HeidiSQL. При использовании ПО с графическим интерфейсом пользователя задания выполняются в окне редактора SQL-запросов. 49 | 50 | В лабораторной работе необходимо отключить интерактивный режим выполнения запросов, в котором работают все клиенты MySQL. В этом режиме каждый оператор SQL, обрабатываемый клиентом, облекается в отдельную транзакцию, которая автоматически фиксируется после его выполнения (т.н. режим автофискации, autocommit). В лабораторной работе исследуются методы разрешения зависимостей между параллельно (т.е. одновременно) выполняющимися транзакциями, обращающимися к одним и тем же данным, поэтому транзакции должны состоять из нескольких операторов и выполняться продолжительное время. 51 | 52 | В интерфейсе командной строки или редакторе SQL начать транзакцию без автофиксации можно выполнив команду BEGIN. В MySQL Workbench можно достичь того же, отключив режим автофиксации транзакций (Auto-Commit Transactions), после чего все выполняемые операторы будут объединены в одну транзакцию, а также станут доступны команды фиксации и отката текущей транзакции. 53 | 54 | ![](https://github.com/db-course/syllabus/blob/master/img/transmenuwb.png) 55 | 56 | Те же элементы управления продублированы на панели инструментов. 57 | 58 | ![](https://github.com/db-course/syllabus/blob/master/img/transbuttonswb.png) 59 | 60 | В dbForge Studio for MySQL по умолчанию также включен режим автофиксации. Можно отключив его, нажав на кнопку начала транзакции или выбрав соответствующий элемент контекстного меню соединения. 61 | 62 | ![](https://github.com/db-course/syllabus/blob/master/img/transmenudbf.png) 63 | 64 | После этого становятся доступны команды фиксации и отката текущей транзакции. 65 | 66 | ![](https://github.com/db-course/syllabus/blob/master/img/transbuttonsdbf.png) 67 | 68 | Для заданий задан уровень изоляции (RU – READ UNCOMMITTED, RC – READ COMMITTED, RR – REPEATABLE READ). Необходимо установить в подключении соответствующий уровень изоляции: 69 | 70 | ```sql 71 | SET TRANSACTION ISOLATION LEVEL уровень; -- для следующей транзакции 72 | 73 | SET SESSION TRANSACTION ISOLATION LEVEL уровень; -- для всех последующих транзакций данного подключения 74 | ``` 75 | 76 | Затем необходимо запустить второе подключение к той же БД. Уровень изоляции можно оставить по умолчанию (в InnoDB это REPEATABLE READ, если не изменялись настройки). 77 | 78 | В MySQL Workbench для открытия второго подключения необходимо повторно выполнить команду Open Connection для созданного подключения к базе данных. Оно создастся в соседней вкладке. 79 | 80 | ![](https://github.com/db-course/syllabus/blob/master/img/secondconnwb.png) 81 | 82 | В dbForge Studio for MySQL второе подключение открывается командой дублирования соединения. 83 | 84 | ![](https://github.com/db-course/syllabus/blob/master/img/secondconndbf.png) 85 | 86 | Следует отметить, что в MySQL Workbench по умолчанию включен так называемый "безопасный режим" обновлений и удалений, который заключается в том, что выполняются только те команды UPDATE и DELETE, которые в секции WHERE содержат фильтрацию по ключевому полю. Считается, что это позволит избежать ошибочного изменения или удаления многих строк сразу неопытными пользователями. Поскольку для выполнения работы иногда необходимо фильтровать запросы не по ключевому полю, данный режим следует отключить. Для этого необходимо зайти в меню настроек среды (Edit -> Preferences...) и на вкладке "SQL Editor" снять галочку "Safe Updates". 87 | 88 | ![](https://github.com/db-course/syllabus/blob/master/img/safemodewb.png) 89 | 90 | Параллельно запускаются две транзакции из двух открытых подключений. Первая транзакция T1 (из подключения с уровнем изоляции согласно варианту) производит операции с данными, после чего вторая транзакция T2 также работает с этими данными и так далее. Список действий должен полностью представлять реакцию системы на зависимости между транзакциями. 91 | 92 | Для каждого варианта необходимо проанализировать: 93 | 94 | 1. Зависимость потерянного обновления 95 | 96 | | T1 | T2 | 97 | |:-------:|:--------:| 98 | | read(x) | | 99 | | | write(x) | 100 | | write(x)| | 101 | 102 | 2. Зависимость грязного чтения 103 | 104 | | T1 | T2 | 105 | |:-------:|:--------:| 106 | | | write(x) | 107 | | read(x) | | 108 | | | write(x) | 109 | 110 | 3. Зависимость неповторяемого чтения 111 | 112 | | T1 | T2 | 113 | |:-------:|:--------:| 114 | | read(x) | | 115 | | | write(x) | 116 | | read(x) | | 117 | 118 | 4. Зависимость фантомов 119 | 120 | | T1 | T2 | 121 | |:---------:|:------:| 122 | | filter(t) | | 123 | | | add(t) | 124 | | filter(t) | | 125 | 126 | Задания MVCC связаны с исследованием механизма многоверсионности для движка InnoDB. При этом транзакцией T1 производятся целостные неблокирующие чтения (в InnoDB – обычный оператор `SELECT`). 127 | 128 | Задания LOCK связаны с исследованием реализации принудительных разделяемых блокировок в движке InnoDB. При этом транзакцией T1 производятся блокирующие чтения (в InnoDB – оператор `SELECT … LOCK IN SHARE MODE`). 129 | 130 | ### Пример 1 131 | 132 | MVCC, уровень READ UNCOMMITTED, зависимость потерянного обновления 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 153 | 154 | 155 | 156 | 157 | 165 | 166 | 167 | 174 | 175 | 176 | 177 | 178 | 183 | 184 |
T1T2
141 |
142 | SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
143 | BEGIN;
144 | SELECT * FROM t WHERE i = 3;
145 | +------+
146 | | i    |
147 | +------+
148 | |    3 |
149 | +------+
150 | 1 row in set (0.00 sec)
151 |             
152 |
158 |
159 | BEGIN;
160 | UPDATE t SET i=3 WHERE i=2;
161 | Query OK, 1 row affected (0.05 sec)
162 | Rows matched: 1  Changed: 1  Warnings: 0
163 |             
164 |
168 |
169 | UPDATE t SET i=5 WHERE i=2;
170 | ERROR 1205 (HY000): Lock wait timeout exceeded; 
171 | try restarting transaction
172 |             
173 |
179 |
180 | COMMIT;
181 |             
182 |
185 | 186 | Вывод: потерянное обновление не допускается, транзакция T1, пытающаяся изменить данные, на которые наложена X-блокировка транзакцией T2, ждет, а затем завершается по таймауту. 187 | 188 | ### Пример 2 189 | 190 | LOCK, уровень READ COMMITTED, зависимость фантомов 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 211 | 212 | 213 | 214 | 215 | 222 | 223 | 224 | 229 | 230 | 231 | 232 | 237 | 238 | 239 | 240 | 241 | 246 | 247 | 248 | 259 | 260 | 261 |
T1T2
199 |
200 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
201 | BEGIN;
202 | SELECT * FROM t WHERE i = 3 LOCK IN SHARE MODE;
203 | +------+
204 | | i    |
205 | +------+
206 | |    3 |
207 | +------+
208 | 1 row in set (0.00 sec)
209 |             
210 |
216 |
217 | BEGIN;
218 | INSERT INTO t VALUES (3);
219 | Query OK, 1 row affected (0.00 sec)
220 |             
221 |
225 |
226 | SELECT * FROM t WHERE i = 3 LOCK IN SHARE MODE;
227 |             
228 |
233 |
234 | ожидание...
235 |             
236 |
242 |
243 | COMMIT;
244 |             
245 |
249 |
250 | +------+
251 | | i    |
252 | +------+
253 | |    3 |
254 | |    3 |
255 | +------+
256 | 2 rows in set (0.00 sec)
257 |             
258 |
262 | 263 | Вывод: фантомы допускаются, повторное выполнение запроса транзакцией T1 получает больший набор строк. 264 | 265 | ## Индивидуальные варианты заданий 266 | 267 | Номер варианта вычисляется как ((N - 1) mod 6) + 1, где N – индивидуальный номер, полученный у преподавателя. 268 | 269 | Например, индивидуальный номер N = 35. Тогда номер варианта ((N - 1) mod 6) + 1 = ((35 – 1) mod 6) + 1 = (34 mod 6) + 1 = 4 + 1 = 5 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 |
ВариантRU MVCCRC MVCCRR MVCCRC LOCKRR LOCK
1++
2++
3++
4++
5++
6++
329 | 330 | ### Порядок выполнения 331 | 332 | 1. Создать с помощью скрипта, полученного в ЛР3, базу данных на сервере MySQL. 333 | 1. В двух параллельно запущенных сеансах выполнить набор операторов SQL, позволяющий изучить взаимодействие одновременно выполняющихся транзакций при доступе к одним и тем же данным на заданных в индивидуальном варианте уровнях изоляции. 334 | 1. Оформить отчет. 335 | 336 | ### Содержание отчета 337 | 338 | 1. Титульный лист. 339 | 1. Цель работы. 340 | 1. Индивидуальный вариант задания. 341 | 1. Снимок экрана реляционной схемы в Microsoft Access. 342 | 1. Листинги скриптов SQL пар транзакций, анализирующих наличие/отсутствие проблем параллельного выполнения транзакций на разных уровнях изоляции с использованием разделяемых блокировок или многоверсионностью. 343 | 1. Выводы для каждого из листингов. 344 | 345 | ### Вспомогательные материалы 346 | 347 | [Транзакционная модель InnoDB](http://www.mysql.ru/docs/man/InnoDB_transaction_model.html) 348 | 349 | ### Вопросы к защите 350 | 351 | * Что такое транзакция? 352 | * Что такое ACID-свойства? 353 | * Какие существуют методы достижения изоляции? 354 | * Опишите различия между уровнями изоляции X и Y. 355 | * В чем заключается принцип многоверсионности? 356 | * Объясните разницу между эксклюзивными и разделяемыми блокировками. 357 | * Поясните листинг A. 358 | 359 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 360 | -------------------------------------------------------------------------------- /practices/practice1.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 1. Реляционная алгебра 4 | 5 | ### Цель работы 6 | 7 | Приобретение навыков использования операций реляционной алгебры для выполнения типовых запросов к данным в реляционной модели. 8 | 9 | ### Содержание практической работы 10 | 11 | Предварительно ознакомиться: [материалы лекции по реляционной алгебре](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture2). 12 | 13 | Практическая работа заключается в написании заданных запросов на языке реляционной алгебры [1] к заданной схеме данных. Всего в каждом индивидуальном варианте дано 4 схемы данных, состоящих из нескольких отношений, и по 2 запроса к каждой из них. 14 | 15 | ### Выполнение и сдача практической работы 16 | 17 | Практическая работа выполняется студентом самостоятельно. На занятиях можно уточнять у преподавателя проблемные моменты. Когда практическая работа выполнена, студент сдает решение преподавателю. Преподаватель проверяет его корректность и в случае выявления ошибок сообщает их студенту устно или делая соответствующие пометки. В случае, если количество правильно решенных запросов является достаточным, практическая работа отмечается сданной. Преподаватель имеет право попросить студента объяснить ход того или иного запроса. 18 | 19 | Достаточным количеством правильно решенных запросов считается: 20 | * в течение 2 недель после получения задания — 6/8; 21 | * в течение 3 недель — 7/8; 22 | * далее — 8/8. 23 | 24 | Для тренировки навыков использования операций и проверки выполнения запросов рекомендуется использовать [тренажер реляционной алгебры](https://guap.aksenov.in/db/ra/). 25 | 26 | При выполнении работы следует пользоваться нотацией операций, рассмотренной на лекциях (с учетом изменений, принятых в тренажере, для удобного набора на клавиатуре). [2] 27 | 28 | ### Вспомогательные материалы 29 | 30 | 1. [Реляционная алгебра](https://citforum.ru/database/dblearn/dblearn04.shtml) 31 | 2. [Шпаргалка по операциям реляционной алгебры](https://www.dropbox.com/s/ocqp664cjpbri9l/rel_alg.pdf?dl=0) 32 | 33 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 34 | -------------------------------------------------------------------------------- /practices/practice2.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 2. SQL 4 | 5 | ### Цель работы 6 | 7 | Приобретение навыков использования оператора SELECT языка SQL для выполнения типовых запросов к данным в реляционной модели. 8 | 9 | ### Содержание практической работы 10 | 11 | Предварительно ознакомиться: [материалы лекций по оператору SELECT](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture4). 12 | 13 | Практическая работа заключается в написании заданных запросов на языке SQL [1] к заданной схеме данных. Всего в каждом индивидуальном варианте дано 4 схемы данных, состоящих из нескольких отношений, и по 2 запроса к каждой из них. 14 | 15 | ### Выполнение и сдача практической работы 16 | 17 | Практическая работа выполняется студентом самостоятельно. На занятиях можно уточнять у преподавателя проблемные моменты. Когда практическая работа выполнена, студент сдает решение преподавателю. Преподаватель проверяет его корректность и в случае выявления ошибок сообщает их студенту устно или делая соответствующие пометки. В случае, если количество правильно решенных запросов является достаточным, практическая работа отмечается сданной. Преподаватель имеет право попросить студента объяснить ход того или иного запроса. 18 | 19 | Достаточным количеством правильно решенных запросов считается: 20 | * в течение 2 недель после получения задания — 6/8; 21 | * в течение 3 недель — 7/8; 22 | * далее — 8/8. 23 | 24 | Для тренировки навыков использования операций и проверки выполнения запросов рекомендуется воспользоваться клиентом SQLite, создав в нем схемы данных, соответствующие заданию. 25 | 26 | ### Вспомогательные материалы 27 | 28 | 1. [Интерактивный учебник по SQL. Оператор SELECT](http://www.sql-tutorial.ru/ru/book_select_statement.html) 29 | 30 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 31 | -------------------------------------------------------------------------------- /tests/test1.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 1. Теория нормализации I 4 | 5 | ### Цель работы 6 | 7 | Приобретение умения выявлять и анализировать функциональные и многозначные зависимости между атрибутами отношения. 8 | 9 | ### Содержание контрольной работы 10 | 11 | Предварительно ознакомиться: [материалы лекций по теории нормализации](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture3). 12 | 13 | Контрольная работа заключается в закреплении материалов по теории нормализации [1, 2, 3] и состоит из 3 заданий, которые имеют вид вопроса с несколькими вариантами ответа, из которых правилен только один. 14 | 15 | Каждое задание сопровождается подсказкой, объясняющей, каким методом следует воспользоваться при его выполнении. 16 | 17 | #### Задания 1-2 18 | 19 | Задания 1 и 2 представляют собой вопросы с 4 вариантами ответа, касающиеся выявления и анализа функциональных зависимостей (далее - ФЗ). В зависимости от номера варианта контрольной работы, типы заданий могут быть следующими: 20 | 21 | * Даны заголовок отношения и множество ФЗ в нем. Определить, какое из 4 множеств атрибутов является для этого отношения ключом (пример задания приведен в образце [4]). 22 | * Даны заголовок отношения и множество ФЗ в нем. Определить, какое из 4 множеств атрибутов функционально не определяет множество атрибутов Х. 23 | * Дан заголовок отношения. Определить, для какого из 4 множеств ФЗ оно находится в BCNF (пример задания приведен в образце [4]). 24 | * Даны заголовок отношения и множество ФЗ в нем. Определить, какой из 4 ФЗ оно гарантированно удовлетворяет. 25 | * Даны заголовок отношения, один кортеж и две ФЗ в нем. Определить, какой из 4 кортежей может быть добавлен в отношение без нарушения ФЗ. 26 | 27 | #### Задание 3 28 | 29 | Задание 3 представляет собой вопрос с 4 вариантами ответа, касающийся выявления и анализа многозначных зависимостей (далее - МЗ). В зависимости от номера варианта контрольной работы, типы задания могут быть следующими: 30 | 31 | * Даны схема отношения и множество кортежей в нем. Определить, какой из 4 МЗ оно не удовлетворяет (пример задания приведен в образце [4]). 32 | * Даны схема отношения и множество кортежей в нем. Определить, какой из 4 МЗ оно удовлетворяет. 33 | * Даны схема отношения, два кортежа и две МЗ в нем. Определить, какой из 4 кортежей должен быть добавлен в отношение для соблюдения МЗ. 34 | 35 | ### Выполнение и сдача контрольной работы 36 | 37 | Контрольная работа проводится в фиксированную заранее оглашенную дату и время и представляет собой тест в [СДО ГУАП](https://lms.guap.ru). 38 | 39 | Контрольная работа выполняется в течение 15 минут. При выполнении контрольной работы можно пользоваться конспектом и другими материалами, но нельзя общаться с другими людьми. 40 | 41 | При оценивании ответов на вопросы теста применяется встроенная в Moodle [система оценивания с учетом уверенности в ответе](https://docs.moodle.org/405/en/Using_certainty-based_marking), где за ответ дается от 3 до -6 баллов в зависимости от его правильности и выставляемой студентом уверенности в нем. 42 | 43 | Контрольная работа считается сданной, если суммарно было набрано 5 баллов. 44 | 45 | ### Вспомогательные материалы 46 | 47 | 1. [Проектирование реляционных баз данных с использованием нормализации](http://citforum.ru/database/osbd/glava_23.shtml) 48 | 2. [Нормальные формы отношений](http://citforum.ru/database/dblearn/dblearn06.shtml) 49 | 3. [Нормальные формы более высоких порядков](http://citforum.ru/database/dblearn/dblearn07.shtml) 50 | 4. [Образцы заданий по контрольной работе](https://www.dropbox.com/s/kirfsqfq5a7lg3g/kr2example.pdf?dl=0) 51 | 52 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 53 | -------------------------------------------------------------------------------- /tests/test2.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 2. Теория нормализации II 4 | 5 | ### Цель работы 6 | 7 | Усвоение принципов и приемов нормализации схем отношений. 8 | 9 | ### Содержание контрольной работы 10 | 11 | Предварительно ознакомиться: [материалы лекций по теории нормализации](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture3). 12 | 13 | Контрольная работа заключается в закреплении материалов по теории нормализации [1, 2] и представляет собой практическое упражнение. 14 | 15 | Задание заключается в декомпозиции отношения с заданной схемой (как правило, в низкой нормальной форме (далее - НФ)) и парой кортежей с реальными данными. Кортежи даны исключительно для лучшего представления о сути предметной области и в выполнении задания роли не играют. 16 | 17 | Для отношения необходимо: 18 | 19 | 1. определить множество полностью нетривиальных функциональных зависимостей; 20 | 2. вычислить потенциальный ключ; 21 | 3. установить самую высокую НФ, в которой находится отношение; 22 | 4. при необходимости декомпозировать отношение без потерь. 23 | 24 | Для каждого из полученных после декомпозиции отношений также выполняются шаги 3-4. 25 | 26 | Каждое действие необходимо сопровождать пояснениями (например, нужно привести вычисление замыкания для множества атрибутов, составляющих ключ, привести обоснование нахождения отношения в той или иной НФ). 27 | 28 | Пример задания приведен в образце [3], его выполнение рассмотрено в лекциях. 29 | 30 | ### Выполнение и сдача контрольной работы 31 | 32 | Задание по контрольной работе выдается группе в фиксированную заранее оглашенную дату и представляет собой лист формата А5, выдаваемый каждому студенту лично в руки. 33 | 34 | Контрольная работа выполняется аудиторно в течение 30 минут. При выполнении контрольной работы можно пользоваться конспектом и другими материалами, но нельзя общаться с другими людьми (за исключением преподавателя, к которому можно обращаться за уточняющими вопросами). 35 | 36 | Каждое действие при выполнении задания необходимо документировать, то есть давать пояснения к принятому решению. При отсутствии пояснений задание не засчитывается. 37 | 38 | Контрольная работа считается сданной, если декомпозиция выполнена правильно, при этом допускаются и прощаются небольшие недочеты, не влияющие на ее правильность. 39 | 40 | ### Вспомогательные материалы 41 | 42 | 1. [Проектирование реляционных баз данных с использованием нормализации](http://citforum.ru/database/osbd/glava_23.shtml) 43 | 2. [Нормальные формы отношений](http://citforum.ru/database/dblearn/dblearn06.shtml) 44 | 3. [Образец задания по контрольной работе](https://www.dropbox.com/s/kirfsqfq5a7lg3g/kr2example.pdf?dl=0) 45 | 46 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 47 | -------------------------------------------------------------------------------- /tests/test4.md: -------------------------------------------------------------------------------- 1 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 2 | 3 | ## 4. Индексы 4 | 5 | ### Цель работы 6 | 7 | Усвоение методов организации индексов и понимание принципов их функционирования. Приобретение навыков оценки эффективности использования индексов различных типов при выполнений запросов на выборку данных с заданными параметрами физической организации. 8 | 9 | ### Содержание контрольной работы 10 | 11 | Предварительно ознакомиться: [материалы лекции по индексам](https://guap.aksenov.in/db/lectures/doku.php?id=lectures:lecture6). 12 | 13 | Контрольная работа заключается в вычислении характеристик производительности файлов базы данных при использовании индексов различных типов. Каждый вариант содержит исходные данные: размер записи файла, количество записей, размер ключа и размер блока диска. Необходимо произвести вычисление максимального количества обращений к диску для чтения произвольной записи файла (также необходимо документировать все промежуточные вычисления: размер и количество блоков основной и индексной области, размер записи индекса). Вычисления необходимо осуществить для трех типов организации индексов: плотный индекс, неплотный индекс, B-дерево. 14 | 15 | ### Выполнение и сдача контрольной работы 16 | 17 | Задание по контрольной работе выдается группе в фиксированную заранее оглашенную дату и представляет собой лист формата А5, выдаваемый каждому студенту лично в руки. 18 | 19 | Контрольная работа выполняется аудиторно в течение 25-30 минут. При выполнении контрольной работы можно пользоваться конспектом и другими материалами, но нельзя общаться с другими людьми (за исключением преподавателя, к которому можно обращаться за уточняющими вопросами). 20 | 21 | Каждое действие при выполнении всех заданий необходимо документировать, то есть давать пояснения к расчетам. При отсутствии пояснений контрольная работа считается несданной. 22 | 23 | Контрольная работа считается сданной, если правильно выполнены все задания, при этом допускается наличие двух неверных ответов, но только в том случае, если они возникли вследствие арифметических ошибок (например, неверного округления). В случае ошибки в расчетах, связанной с неверным пониманием смысла или метода решения задачи, контрольная работа считается несданной. 24 | 25 | Если студент не смог присутствовать в день написания контрольной работы, то она считается несданной. При возникновении спорной ситуации при аттестации данного студента ему будет предоставлен шанс ее написания в конце семестра. 26 | 27 | ### Вспомогательные материалы 28 | 29 | 1. [Образец задания по контрольной работе](https://www.dropbox.com/s/ozvtd6r2dzibqpr/kr4example.pdf?dl=0) 30 | 31 | [Назад к главной странице курса](https://github.com/db-course/syllabus) 32 | --------------------------------------------------------------------------------