Explorar el Código

убрал старые темы и написал "Основы проектирования БД"

Евгений Колесников hace 4 años
padre
commit
e7f72c06b0

+ 343 - 0
articles/5_1_1_1_erd.md

@@ -0,0 +1,343 @@
+[содержание](/readme.md)
+
+# Проектирование баз данных.
+
+>Основано на книге "Реляционные базы данных в примерах", полный текст книги см. в каталоге `docs` этого репозитория
+
+<!-- 
+https://pro-prof.com/forums/topic/db_example 
+https://habr.com/ru/post/193136/
+https://metanit.com/sql/tutorial/
+https://se.ifmo.ru/education/documentation/dbguide/
+https://se.ifmo.ru/education/documentation/dbguide/
+-->
+
+## Данные и базы данных
+
+**Данные (data)** — поддающееся различной интерпретации представление информации в формализованном виде, пригодном для передачи, связи, или обработки.
+
+*Упрощённо: информация, организованная по определённым правилам.*
+
+Ключевых моментов здесь два.
+
+**Во-первых**, информация должна быть представлена в формализованном виде (иными словами, подчиняться неким правилам). Для наглядности приведём пример неформализованного и формализованного представления информации:
+
+![](../img/01001.png)
+
+**Во-вторых**, различная интерпретация позволяет нам по-разному воспринимать одни и те же данные в разном контексте. Например, поле pass (пропуск) может быть интерпретировано так:
+
+* номер пропуска сотрудника;
+* поле с уникальным значением;
+* число;
+* естественный первичный ключ отношения;
+* кластерный индекс {110} таблицы;
+* и т.д.
+
+Когда данных становится достаточно много, появляется необходимость в их организации в более сложные структуры.
+
+**База данных (database)** — совокупность данных, организованных в соответствии с концептуальной структурой, описывающей характеристики этих данных и взаимоотношения между соответствующими сущностями и поддерживающей одну или более областей применения.
+
+*Упрощённо: большой объём данных, взаимосвязь между которыми построена по специальным правилам.*
+
+Итак, база данных — это большая совокупность данных, подчинённых дополнительным правилам. Такие правила зависят от вида базы данных, а за их соблюдение отвечает *система управления базами данных* (СУБД).
+
+**Система управления базами данных, СУБД (database management system, DBMS)** — система (базирующаяся на программном и аппаратном обеспечении) для описания, создания, использования, контроля и управления базами данных.
+
+*Упрощённо: программное средство, управляющее базами данных.*
+
+>Стоит отметить важный для начинающих факт (т.к. очень часто можно услышать просьбу «показать СУБД»): подавляющее большинство СУБД не имеет никакого «человеческого интерфейса», представляет собой сервис (демон в *nix-системах) и взаимодействует с внешним миром по специальным протоколам (чаще всего, построенным поверх TCP/IP). Такие известные продукты как MySQL Workbench, Microsoft SQL Server
+Management Studio, Oracle SQL Developer и им подобные — это не СУБД, это лишь клиентское программное обеспечение, позволяющее нам взаимодействовать с СУБД.
+
+Итак, СУБД — это специальное программное обеспечение, предназначенное для управления базами данных. Поскольку в этой книге мы будем говорить исключительно о реляционных базах
+данных и реляционных же СУБД, можно сразу отметить, что взаимодействие с такими СУБД происходит путём выполнения SQL-запросов.
+
+## Моделирование баз данных
+
+**Модель базы данных (database model)** — способ описания базы данных с помощью формализованного (в т.ч. графического) языка на некотором уровне абстракции.
+
+*Упрощённо: описание базы данных, по которому она потом будет создана (по аналогии с проектом здания, по которому оно потом будет построено).*
+
+Особый интерес в данном определении представляет упоминание уровня абстракции. Получается, что у одной и той же базы данных может быть несколько моделей, отличающихся уровнем детализации и целью (например, общее описание данных и их взаимосвязей, описание структур данных, описание способов хранения и обработки данных и т.д.)
+
+Отсюда мы переходим к понятию уровней (этапов) моделирования и проектирования баз данных, т.е. к построению нескольких взаимосвязанных моделей базы данных, каждая из которых
+призвана служить своей особой цели.
+
+Прежде, чем мы рассмотрим каждый уровень  необходимо дать
+ещё одно предельно важное пояснение, без которого вся эта информация может оказаться бесполезной.
+
+Как правило, студенты, изучающие базы данных и проектирующие их в
+рамках лабораторных, курсовых и дипломных работ, искренне не понимают, зачем нужны какие-то уровни, если можно просто «взять и спроектировать базу».
+
+Можно. В том случае, если база примитивная (до нескольких десятков таблиц), предметная область ограничивается уровнем сложности университетской работы, исходные требования просты и не меняются. Т.е. если вы проектируете однотипные и/или простые базы данных, вся
+эта «научная заумь» вам не понадобится. (Особенно, если вы сами и заказчик, и исполнитель, и ничто не мешает опустить руки и поменять требования, как только возникнет достаточно сложная задача.)
+
+Но! Представьте, что предметная область вам совершенно неизвестна (например, вы проектируете не очередную базу данных библиотеки, а информационное хранилище для исследовательского центра кардиохирургии).
+
+Добавьте к этому тот факт, что сам заказчик (в лице представителей этого центра) не сильно разбирается в информационных технологиях, и многое объясняет вам «на пальцах», причём в процессе работы многократно выясняется, что что-то было забыто, что-то вы не так поняли, что-то поменялось, чего-то не знал сам заказчик и т.д.
+
+Причём в этой ситуации, как правило, не удастся отказаться от реализации того или иного требования просто потому, что оно слишком сложное и/или вы не очень понимаете, как его реализовать.
+
+Также добавьте к этому тот факт, что база данных может состоять из сотен (и даже тысяч) таблиц, что к ней предъявляются достаточно жёсткие требования по надёжности, производительности и иным показателям качества.
+
+Учтите, что проектировать такую базу вы будете не в одиночку, а в составе команды (и всем участникам надо будет гарантированно понимать друг друга, согласовывать свои действия, подменять друг друга).
+
+В такой ситуации структурированный, управляемый, регламентированный подход к моделированию и проектированию критически необходим — без него создать работоспособную базу данных не получится. Никак.
+
+Возвращаемся к уровням моделирования.
+
+![](../img/01002.png)
+
+**Инфологический (концептуальный) уровень (conceptual level)** моделирования ставит своей целью создание т.н. концептуальной модели (conceptual model), отражающей основные сущности предметной области, их атрибуты и связи (возможно, пока не все)
+между сущностями.
+
+*Упрощённо: описание предметов и явлений реального мира, данные о которых потом будут помещены в базу данных.*
+
+Если продлить рисунок «вверх», к ещё меньшему уровню детализации, от непосредствен о работы с базами данных мы перейдём к области бизнес-анализа (business analysis), выявления
+общих требований заказчика и параметров предметной области.
+
+**Даталогический уровень (часто его называют просто «логическим», logical level)** моделирования детализирует инфологическую модель, превращая её в логическую схему, на которой ранее выявленные сущности, атрибуты и связи оформляются согласно правилам моделирования для выбранного вида базы данных (возможно,
+даже с учётом конкретной СУБД).
+
+*Упрощённо: описание предметов и явлений реального мира по правилам выбранной СУБД.*
+
+Во многих средствах проектирования баз данных, поддерживающих разделение лишь на «логическое» и «физическое» проектирование именно этот уровень называется «логическим».
+
+**Физический уровень (physical level)** моделирования продолжает детализацию и позволяет создать т.н. физическую схему, на которой максимально учитываются технические особенности работы конкретной СУБД и её возможности по организации и управлению структурами разрабатываемой базы данных и данными в ней.
+
+*Упрощённо: описание составных частей базы данных таким образом, чтобы на его основе можно было автоматически сгенерировать SQL-код для создания базы данных.*
+
+Если продлить рисунок «вниз», к ещё большему уровню детализации, от непосредственно работы с базами данных мы перейдём к области системного администрирования (конфигурирования СУБД, операционной системы, сетевой инфраструктуры и т.д.)
+
+Требования предъявляемые к любой базе данных (и, соответственно, её моделям):
+* адекватность предметной области;
+* удобство использования;
+* производительность;
+* защищённость данных.
+
+**Адекватность предметной области** выражается в том, что база данных должна позволять выполнять все необходимые операции, которые объективно нужны в реальной жизни в контексте той работы, для которой предназначена база данных.
+
+Лучше всего выполнить это требование позволяет моделирование на инфологическом уровне (т.к. этот уровень ближе всего находится к предметной области и требованиям заказчика), но для выявления некоторых ошибок неизбежно придётся анализировать и модели на других уровнях.
+
+А суть этого требования наиболее наглядно отражают примеры его нарушения.
+
+Сначала рассмотрим совершенно тривиальный пример. Допустим, для хранения информации о человеке было спроектировано отношение, представленное следующей схемой:
+
+![](../img/01003.png)
+
+Сразу же бросается в глаза, что `cpu_frequency` (частота процессора) не является характеристикой человека (по крайней мере, на сегодняшний день). А потому совершенно непонятно, что писать в это поле.
+
+Если немного подумать, также становится очевидным, что в этом отношении не хватает многих свойств, ведь характеристики человека не заканчиваются на фамилии, имени и отчестве.
+
+Рассмотрим чуть более близкий к реальности пример ошибки проектирования (здесь даже обойдёмся без рисунка). Допустим, мы разрабатываем базу данных для автоматизации работы
+деканата университета. Соответствующее приложение уже введено в эксплуатацию, прошло какое-то время, и тут нам звонят заказчики и спрашивают: «А как отметить, что студент ушёл в академический отпуск?»
+
+И мы вдруг понимаем, что... никак. Что мы не подумали о такой ситуации, и ни приложение (с которым работают сотрудники деканата), ни наша база данных не имеют возможности сохранить соответствующие данные.
+
+Эта ситуация является неприятной (придётся много переделывать), но она меркнет по сравнению со следующей — худшей из того, что может случиться.
+
+Рассмотрим третий (по-настоящему страшный) пример, продолжив тему автоматизации работы деканата. Допустим, что информация о взаимосвязи предметов, преподавателей и студентов хранилась в базе данных, представленной (упрощённо) следующей схемой:
+
+![](../img/01004.png)
+
+Все три отношения попарно соединены связями «многие ко многим», ведь действительно:
+* каждый студент изучает много предметов, и каждый предмет изучает много студентов;
+* каждый предмет может вести много преподавателей, и каждый преподаватель может вести много предметов;
+* каждый студент обучается у многих преподавателей, и каждый преподаватель обучает многих студентов.
+
+Допустим, разработанный продукт успешно введён в эксплуатацию, прошло много лет, и тут заказчик звонит и интересуется, как для очень важного отчёта показать список студентов, у которых профессор Иванов вёл высшую математику.
+
+Никак. Эта информация не сохранялась в базе данных. Там есть лишь информация о том, что профессор Иванов (вместе с ещё тремя десятками коллег) вёл высшую математику (и ещё восемь предметов). Есть информация о том, какие студенты учились у профессора Иванова, и какие студенты изучали высшую математику. Но никак невозможно определить, что вот именно этот конкретный студент изучал именно высшую математику (а не другой предмет) именно у профессора Иванова (а не у кого-то из его коллег).
+
+Этот пример потому и назван самым страшным, что тут ничего нельзя исправить. Даже если мы доработаем приложение и базу данных, требуемая заказчиком информация всё равно останется утерянной навсегда. А ведь заказчик был полностью уверен, что она есть и доступна.
+
+В принципе, при грамотном подходе к сбору требований такие ошибки (как в примерах про деканат) выявляются и при нисходящем проектировании, но намного легче заметить их при восходящем проектировании, когда мы задумываемся о том, какие конкретно задачи будет решать пользователь, и к выполнению каких запросов к базе данных это приведёт.
+
+Существует ещё одна форма нарушения адекватности предметной области — нарушения нормализации, которые приводят к возникновению аномалий операций с данными. Но этот вопрос настолько важен и обширен, что ему посвящён отдельный раздел.
+
+**Удобство использования** (в контексте проектирования баз данных) не связано с удобством для конечного пользователя (который может даже не знать, что в мире существуют какие-то базы данных). Этот термин относится к использованию базы данных в следующих ситуациях:
+
+* при взаимодействии с приложениями (в основном, здесь упор делается на простоту и лёгкость написания безошибочных запросов);
+* в процессе её дальнейшего развития (и тогда говорят о таких показателях качества, как поддерживаемость и сопровождаемость).
+
+Таким образом, речь идёт об «удобстве для программиста». Почему это важно? Чем лучше база данных отвечает данному требованию, тем проще и быстрее программисты могут организовать взаимодействие с ней, допуская минимум ошибок и с меньшими затратами решая вопросы
+быстродействия, безопасности и т.д.
+
+Прекрасной иллюстрацией разницы в удобстве использования базы данных в зависимости от её модели, может быть пример с определением номера дня недели и номера недели в месяце на основе указанной даты.
+Пока дата хранится в виде единого значения, приходится использовать запрос на целый экран, причём для каждой СУБД в нём появляется своя «магия» в виде числовых констант, слабо документированных параметров функций и тому подобных крайне опасных с точки зрения возможности допустить ошибку моментов.
+
+Но модель базы данных можно изменить. Можно хранить искомые значения в самой таблице (и вычислять их триггерами) или создать представление (и «замаскировать» соответствующий запрос в нём). Тогда для программиста, организующего взаимодействие приложения
+с базой данных задача сведётся к тривиальному SELECT длиной в пару строк.
+
+Рассмотрим ещё один очень простой и наглядный пример нарушения удобства использования. Предположим, что в некоторой базе данных фамилии и инициалы людей сохранены следующим образом:
+
+![](../img/01005.png)
+
+Здесь фамилия и инициалы сохранены в одной колонке, причём инициалы идут перед фамилией (и для наглядности представлены в нескольких вариантах, что вполне может встретиться в реальной жизни). Как теперь упорядочить список людей по алфавиту по фамилии?
+
+Теоретически можно написать функцию, учитывающую множество вариантов написания инициалов (например, «А.А.», «АА», «А. А. », «А .» и т.д. и т.п.), убирающую эту информацию и возвращающую только фамилию. И использовать эту функцию в запросах следующего вида:
+
+```sql 
+-- Упорядочивание списка людей по фамилии по алфавиту с удалением инициалов
+SELECT *
+FROM `person`
+ORDER BY REMOVE_INITIALS(`p_name`) ASC
+```
+
+Но такая функция будет сложной, медленной, может не учитывать некоторые варианты написания инициалов, а также сделает невозможным использование индексов для ускорения выполнения запроса (или потребует создания отдельного индекса над результатами своих вы-
+числений).
+
+Но всего лишь стоит поместить фамилии и инициалы в раздельные колонки, и ситуация мгновенно упрощается:
+
+![](../img/01006.png)
+
+Теперь нет необходимости как бы то ни было предварительно обрабатывать информацию, и значение фамилии можно использовать напрямую, что устраняет все недостатки решения с использованием функции. И запрос упрощается до следующего вида:
+
+```sql 
+-- Упорядочивание списка людей по фамилии по алфавиту с удалением инициалов
+SELECT *
+FROM `person`
+ORDER BY `p_surname` ASC
+```
+
+Подобные ситуации могут встречаться чаще, чем кажется. И их продумывание позволяет ощутимо повысить удобство использования базы данных.
+
+**Производительность** можно смело считать одним из самых больных вопросов в работе с базами данных, и решение соответствующих задач может быть описано несколькими отдельными книгами. Что стоит делать на любой стадии проектирования — так это как минимум помнить о
+производительности и не допускать создания таких моделей, в которых на ней будет поставлен крест изначально.
+
+Например, мы знаем, что для работы приложения понадобится очень часто выяснять количество записей в разных таблицах (как общее, так и количество неких особенных записей). В общем случае такие операции будут работать очень медленно, но с использованием кэширующих таблиц и материализованных представлений можно ценой небольшой потери производительности других операций в этом конкретном случае свести время выполнения запроса почти к нулю.
+
+Как правило, проблемы с удобством использования приводят к увеличению количества проблем с производительностью, т.к. сложные запросы тяжелее оптимизировать.
+
+**Защищённость данных** стоит воспринимать не только в контексте безопасности (ограничения доступа), но и в том смысле, что с данными не должно происходить никаких случайных непредвиденных изменений. Для достижения этой цели порой приходится продумывать огромное количество ограничений, реализуемых через специфические объекты базы данных и даже через отдельный интерфейс в виде набора хранимых процедур.
+
+## Реляционная модель данных
+
+**Реляционная модель (relational model)** — математическая теория, описывающая структуры данных, логику контроля целостности данных и правила управления данными.
+
+*Упрощённо: модель для описания реляционных баз данных.*
+
+На момент изобретения именно эта модель предоставила полный комплекс решений по описанию базы данных, контролю целостности данных и управлению данными — в отличие от множества других альтернативных подходов, позволяющих реализовать лишь часть задач. Сейчас кажется странным, что были какие-то другие «неполноценные решения», но напомним: это было в те времена, когда компьютер занимал несколько комнат и стоил, как половина здания, в кото-
+ром находится.
+
+## Создание базы данных и таблиц
+
+Для качественного проектирования базы данных существуют различные методики, различные последовательности шагов или этапов, которые во многом похожи. И в целом мы можем выделить следующие этапы:
+
+* Выделение *сущностей* и их *атрибутов*, которые будут храниться в базе данных, и формирование по ним таблиц. Атомизация сложных атрибутов на более простые.
+
+* Определение уникальных идентификаторов (первичных ключей) объектов, которые хранятся в строках таблицы
+
+* Определение отношений между таблицами с помощью внешних ключей
+
+* Нормализация базы данных
+
+На первом этапе происходит выделение *сущностей*. **Сущность** (entity) представляет тип объектов, которые должны храниться в базе данных. Каждая таблица в базе данных должна представлять одну сущность. Как правило, сущности соответствуют объектам из реального мира.
+
+У каждой сущности определяют набор *атрибутов*. **Атрибут** представляет свойство, которое описывает некоторую характеристику объекта.
+
+Каждый столбец должен хранить один атрибут сущности. А каждая строка представляет отдельный объект или экземпляр сущности.
+
+### Восходящий и нисходящий подходы
+
+При проектировании базы данных на этапе выделения сущностей и их атрибутов мы можем использовать два подхода: восходящий и нисходящий.
+
+Восходящий подход предусматривает выделение необходимых атрибутов, которые надо сохранить в бд. Затем выделенные атрибуты группируются в сущности, для которых впоследствии создается таблицы. Такой подход больше подходит для проектирования небольших баз данных с небольшим количеством атрибутов.
+
+Например, нам дана следующая информация:
+
+```
+Том посещает курс по математике, который преподает профессор Смит.
+Сэм посещает курс по математике, которые преподает профессор Смит.
+Том посещает курс по языку JavaScript, который преподает ассистент Адамс.
+Боб посещает курс по алгоритмам, который преподает ассистент Адамс.
+Сэм имеет следующие электронный адрес sam@gmail.com и телефон +1235768789.
+```
+
+Какие данные из этой информации мы можем сохранить: 
+* имя студента, 
+* название курса, 
+* должность преподавателя, 
+* имя преподавателя, 
+* электронный адрес студента
+* телефон стулента.
+
+Затем мы можем выполнить группировку по сущностям, к которым относятся эти данные:
+
+Студент
+
+Преподаватель
+
+Курс
+
+Имя студента
+
+Название курса
+
+Дата рождения студента
+
+Электронный адрес студента
+
+Телефон студента
+
+Имя преподавателя
+
+Должность преподавателя
+
+Название курса
+
+Имя студента
+
+Имя преподавателя
+
+Название курса
+
+Так, те данные, которые имеются позволяют выделить три сущности: студент, преподаватель и курс. При этом мы вполне можем добавлять какие-то недостающие данные. Также следует отметить, что какие-то данные могут иметь отношение к разным сущностям. Например, курс хранит информацию о студенте, которые его посещает. А студент хранит информацию о посещаемом курсе. Подобная избыточность данных решается на последующих шагах проектирования в процессе нормализации базы данных.
+
+Но подобных атрибутов может оказаться очень много: сотни и даже тысячи. И в этом случае более оптимальным будет нисходящий подход. Данный подход подразумевает выявление сущностей. Затем происходит анализ сущностей, выявляются связи между ними, а потом и атрибуты сущностей.
+
+То есть в данном случае мы могли бы сразу определить, что нам надо хранить данные по студентам, курсам и преподавателям. Затем в рамках каждой сущности выявить атрибуты
+
+Например, у сущности "Студент" мы могли бы выделить такие атрибуты, как имя студента, его адрес, телефон, рост, вес, год его рождения. В тоже время нам надо учитывать не вообще все свойства, которые в принципе могут быть у сущности "Студент", а только те, которые имеют значение в рамках описываемой системы. Вряд ли в данном случае играют роль такие свойства как рост или вес студента, поэтому мы можем их вычеркнуть из списка атрибутов при проектировании таблицы.
+
+Иногда подходы комбинируются. Для описания разных частей системы могут использоваться разные подходы. А затем их результаты объединяются.
+
+Атомизация атрибутов
+При определении атрибутов происходит разделение сложных комплексных элементов на более простые. Так, в случае с именем студента мы можем его разбить на собственно имя и фамилию. Это позволит впоследствии выполнять операции с эти подэлементами отдельно, например, сортировать студентов только по фамилии.
+
+То же самое касается адреса - мы можем сохранить весь адрес целиком, а можем разбить его на части - дом, улицу, город и т.д.
+
+В то же время возможность разделения одного элемента на подэлементы не всегда может быть востребованной. В ряде задач это может быть просто не нужно. Выделять необходимо только те элементы, которые действительно нужны.
+
+В соответствии с этим аспектом мы можем выделить у сущности "Студент" следующие атрибуты: имя студента, фамилия студента, год рождения, город, улица, дом, телефон.
+
+Домен
+Каждый атрибут имеет домен (domain). Домен представляет набор допустимых значений для одного или нескольких атрибутов. По сути домен определяет смысл и источник значений, которые могут иметь атрибуты.
+
+Домены могут отличаться для разных атрибутов, но также несколько атрибутов могут иметь один домен.
+
+Например, выше были определены атрибуты сущности Студент. Определим используемые домены:
+
+Имя. Домен представляет все возможные имена, которые могут использоваться. Каждое имя представляет строку длиной максимум 20 символов (маловероятно, что нам могут встретиться имена свыше 20 символов).
+
+Фамилия. Домен представляет все возможные фамилии, которые могут использоваться. Каждая фамилия представляет строку длиной максимум 20 символов.
+
+Год рождения. Домен представляет все года рождения. Каждый год является числовым значением от 1950 до 2017.
+
+Город. Домен представляет все города текущей страны. Каждый город представляет строку длиной максимум 50 символов.
+
+Улица. Домен представляет все улицы текущей страны. Каждая улица представляет строку длиной максимум 50 символов.
+
+Дом. Домен представляет все возможные номера домов. Каждый номер дома является числом от 1 до, скажем, 10000.
+
+Телефон. Домен представляет все возможные телефонные номера. Каждый номер является строкой длиной в 11 символов.
+
+Определяя домен, мы сразу видим, какие данные и каких типов будут хранить атрибуты. Какое-то другое значение, которое не соответствует домену, атрибут иметь не может.
+
+В примере выше каждый атрибут имеет свой домен. Но, домены могут совпадать. Например, если бы сущность содержала бы следующие два атрибута: город рождения и город проживания, то домен бы совпадал и был бы одним и тем же для обоих атрибутов.
+
+Определитель NULL
+При определении атрибутов и их домена необходимо проанализировать, а может ли у атрибута отсутствовать значение. Определитель NULL позволяет задать отсутствие значения. Например, в примере выше у студента обязательно должно быть какое-либо имя, поэтому недопустима ситуация, когда у атрибута, который представляет имя, отсутствует значение.
+
+В то же время студент может не иметь телефонного номера или в рамках системы телефон не обязателен. Поэтому на этапе проектирования таблицы можно указать, что данный атрибут позволяет значение NULL.
+
+Как правило, большинство современных реляционных СУБД поддерживают определитель NULL и позволяют задать его допустимость для столбца таблицы.

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 28 - 0
articles/5_1_1_1_erd2.md


+ 1 - 1
articles/kp.md

@@ -9,7 +9,7 @@
 1. Автосервис. Подсистема работы с клиентами. (Батанов)
     * список клиентов (юзеров)
     * список автомобилей
-    * автомобили пользователя
+    * автомобили пользователя (таблица связей)
 
 2. Автосервис. Подсистема работы с сотрудниками. (Галимулин)
     * список сотрудников с ролями (юзеров)

+ 157 - 0
articles/kp2.md

@@ -0,0 +1,157 @@
+# Курсовой проект
+
+Курсовой проект служит для закрепления и систематизации знаний и умений **ПМ.05**.
+
+## Что должно быть реализовано
+
+- база данных
+- десктопное приложение для администрирования БД
+    - авторизация
+    - добавление
+    - редактирование
+    - удаление
+    - поиск
+    - фильтрация
+    - сортировка
+- АПИ-сервер на PHP
+- мобильное приложение, получающее данные через АПИ-сервер (просмотр/заказ)
+
+## Темы курсовых проектов
+
+1. Автосервис:
+    - список услуг (админка)
+    - запись на сервис (мобилка) с выбором списка услуг
+
+2. Онлайн-пекарня (интернет магазин)
+    - список продукции (админка)
+    - онлайн-заказ (мобильное приложение)
+
+3. Фитнесс-центр
+    - список услуг (админка)
+    - запись на занятие (учесть овербукинг) с выбором услуг
+
+4. Бронирование столика в ресторане
+    - список залов и столиков (количество мест) (админка)
+    - онлайн бронь (мобильное приложение) с учетом овербукинга
+
+5. Автомойка
+    - список услуг
+    - онлайн запись
+
+6. Запись к врачу
+    - список врачей (у каждого свой график работы)
+    - запись (мобилка)
+
+7. Сотовый оператор
+    - список тарифов и опций (админка)
+    - выбор тарифа и опций (мобилка)
+
+8. Транспортная компания (служба доставки)
+    - парк транспортных средств (поезд, самолет, авто)
+    - заказ доставки (вес, расстояние)
+
+9. Заказ ЖД-билетов
+    - список поездов с расписанием
+    - бронирование на нужную дату и кол-во пассажиров
+
+10. Покупка билета в кино
+    - список фильмов, залов, мест
+    - бронирование билетов
+
+11. Шиномонтаж
+    - список услуг 
+    - онлайн-запись
+
+12. Стоматолог
+    - список услуг, врачей
+    - запись 
+
+13. Аптека.ру
+    - список лекарств
+    - онлайн-покупка
+
+14. Строй.материалы
+    - список товаров
+    - онлайн-покупка
+
+15. Доставка еды (на двоих)
+    - список ресторанов, список блюд, список доставщиков (деливери, яндекс)
+    - формирование заказа (мобилка)
+    - доставка заказа (мобилка)
+
+16. Парикмахерская
+    - список услуг, парикмахеров
+    - запись
+
+17. Книга рецептов
+    - список блюд, ингредиенты
+    - отображение с расчетом калорийности (мобилка)
+
+18. Книжный магазин
+    - список книг
+    - онлайн заказы    
+
+## Важно!!!
+
+USE-case и ER диаграммы рисуются для всей предметной области. 
+ 
+## Методические рекомендации
+
+### Общие положения
+
+Курсовой проект выполняется в виде публичного репозитория на общедоступном сервере контроля версий (github, gitlab...). Пояснительная записка располагается в файле `readme.md` и, соответственно, должна быть написана в формате *MarkDown*.
+
+Тема курсового проекта выбирается из списка, либо, по желанию студента. 
+
+### Требования к структуре курсового проекта
+
+* титульный лист. Разметку HTML можно взять из этого репозитория;
+* содержание;
+* введение, в котором раскрываются актуальность и значение темы, формулируются цели и задачи работы, объект, предмет и методы исследования;
+* теоретическая часть, в которой содержатся теоретические основы разрабатываемой темы:
+    - анализ предметной области: опрос, анкетирование (разработать как минимум одну анкету)
+    - разработать UseCase-диаграмму для основных пользователей системы. 
+        - полную диаграмму в формате PDF положить в репозиторий
+        - "свой" кусок картинкой прицепить к пояснительной записке (картинки в *MarkDown* внедряются разметкой: `![<alt>](<имя картинки с относительным путём в вашем репозитории>)`). Например, все свои ресурсы вы храните в подкаталоге `src`, тогда для картинки с названием `erd.png` команда будет выглядеть так: `![ER-диаграмма](./src/erd.png)`
+    - разработать спецификацию к UseCase (к 3 самым важным прецедентам). Формат **MarkDown**
+    - для ЧЁТНЫХ номеров: разработать диаграмму состояний (в формате PDF)
+    - для НЕЧЁТНЫХ номеров: разработать диаграмму последовательности (в формате PDF)
+    - проектирование ERD. Необходимо спроектировать максимально полную ERD для предметной области. Обязательна 3 нормальная форма с обеспечением ссылочной целостности.
+        - полную диаграмму в формате PDF положить в репозиторий
+        - "свой" кусок картинкой прицепить к пояснительной записке
+    - разработать словарь данных (MarkDown).
+* практическая часть, которая состоит из проектирования, описания его реализации
+    - база данных (MYSQL):
+        * создание базы данных. На этом этапе реализовать только основной функционал подсистемы (подойти к преподавателю и утвердить набор обязательных таблиц)
+        * подготовить 3 файла с данными (в РАЗНЫХ форматах csv, txt, xls): 5 записей для справочников, 10 - для данных (список товаров/услуг/клиентов...). Для данных предусмотреть поле для изображения и, соответственно, каталог с изображениями.
+            + таблица с основными данными (продукты)
+            + таблица с составными данными (материалы для продуктов)
+            + таблица связей (продукты + материалы)
+        * импортировать данные в базу данных (в пояснительной записке привести SQL-команды, используемые при импорте)
+    - разработка (C#)
+        * отображение основного списка товаров/услуг с:
+            - условной раскраской (по доступности/цене... уточнить у преподавателя);
+            - выводом изображений
+            - сортировкой (уточнить у преподавателя)
+            - фильтрацией (по справочному полю)
+            - поиском (по нескольким полям)
+            - вычисляемыми полями (по связям)
+            - счетчиками общего количества записей и отображаемых
+
+            Пример разметки "списком" есть [тут](https://github.com/kolei/de)
+
+            все действия должны быть "живые", т.е. для фильтрации и поиска не нужно нажимать каких-то специальных кнопок.
+            
+        * добавление, удаление, редактирование записей списка товаров/услуг в отдельных модальных окнах, где это возможно. Если товар уже продавали (услугу оказывали), то выводить уведомление о невозможности удаления.
+        * отображение дополнительного списка (продажи/оказанные услуги)
+    - разработка (PHP)
+        * реализовать API для базы данных
+        * написать инструкцию по развертыванию сервера
+    - разработка (мобильное приложение)
+        * реализовать приложение для записи на услугу/заказ товара         
+    - тестирование
+        * разработать библиотеку классов (реализовать в ней метод для расчета вычисляемого поля в основной таблице)
+        * разработать модульные тесты для метода из библиотеки классов (не менее 10)
+        * разработка тестовых сценариев для удаления товара/услуги (не менее 5)
+    - XML-комментарии. Не очевидный код (разработка и тестирование) должен содержать комментарии
+* заключение, в котором содержатся выводы и рекомендации относительно возможностей практического применения полученных результатов;

BIN
docs/Реляционные базы данных в примерах.pdf


BIN
img/01001.png


BIN
img/01002.png


BIN
img/01003.png


BIN
img/01004.png


BIN
img/01005.png


BIN
img/01006.png


BIN
img/01007.png


BIN
img/01008.png


BIN
img/01009.png


+ 13 - 7
readme.md

@@ -9,8 +9,7 @@
     <td style="text-align: center; border: none; height: 45em;">
         <h2>
             Курс лекций по предмету <br/>
-            "Проектирование и разработка информационных систем" <br/>
-            для группы И-31
+            "Проектирование и разработка информационных систем"
         <h2>
     </td>
   </tr>
@@ -31,7 +30,7 @@
 
 <div style="page-break-after: always;"></div>
 
-https://github.com/kolei/PiRIS
+# https://github.com/kolei/PiRIS
 
 # Содержание
 
@@ -39,8 +38,10 @@ https://github.com/kolei/PiRIS
 
 TODO
 
-- SQL: основы, триггеры, представления
+https://dev.mysql.com/downloads/windows/installer/8.0.html
+
 - ERD
+- SQL: основы, триггеры, представления
 - импорт данных
 - сервер АПИ на PHP
 - сетевые запросы C#, Kotlin (встроенными средствами)
@@ -66,17 +67,21 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 # МДК. 05.01 Проектирование и дизайн информационных систем
 
-[56+92=148, 34+72=106]: ФГОС
+<!-- 56+92=148, 34+72=106 -->
 
 ## Тема 5.1.1. Основы проектирования информационных систем
 
-[1]: https://sites.google.com/site/anisimovkhv/learning/pris/lecture
+<!-- https://sites.google.com/site/anisimovkhv/learning/pris/lecture -->
 
 ### Лекции
+
 1. [Основные понятия и определения ИС.](articles/5_1_1_1_intro.md)
+    
+<!-- 4+0 -->
 
-[4+0]: _
+2. [Основы проектирования баз данных.](articles/5_1_1_1_erd2.md)
 
+<!--
 2. [Жизненный цикл информационных систем.](articles/5_1_1_2_lifecycle.md)
 
 [4+0 => 8+0]: _
@@ -244,6 +249,7 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 ## Работа с БД
 
 1. [Знакомство с SQL](https://github.com/kolei/yotc/blob/master/articles/sql_for_beginner.md)
+-->
 
 <!--  
 ERD,

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio