Pārlūkot izejas kodu

Переписал создание ERD

Евгений Колесников 5 mēneši atpakaļ
vecāks
revīzija
fa14c16da5

+ 97 - 36
articles/5_1_1_1_erd_workbench.md

@@ -1,12 +1,10 @@
 # Создание ER-диаграммы
 
-Связи в ERD будем обозначать используя нотацию **Crow’s Foot** (воронья лапка)
-
-Согласно данной нотации, связь изображается линией, которая связывает две сущности, участвующие в отношении. Степень конца связи указывается графически, множественность связи изображается в виде «вилки» (вороньей лапки) на конце связи. Модальность связи так же изображается графически — необязательность связи помечается кружком на конце связи. 
-
 ## Предметная область
 
-Давайте теперь поработаем с системой базы данных *MyFlix Video Library*, чтобы помочь понять концепцию ER-диаграмм. Мы будем использовать эту базу данных для всей практической работы в оставшейся части этого урока
+>Статья похоже переводная, встречаются "кривые" выражения.
+
+Давайте теперь поработаем с системой *MyFlix Video Library*, чтобы помочь понять концепцию ER-диаграмм. Мы будем использовать эту базу данных для всей практической работы в оставшейся части этого урока.
 
 MyFlix — это юридическое лицо, которое сдает в аренду фильмы своим членам. MyFlix хранит свои записи вручную. Теперь руководство хочет перейти на СУБД
 
@@ -15,7 +13,7 @@ MyFlix — это юридическое лицо, которое сдает в
 * Определить сущности и отношения, которые существуют между ними.
 * Каждая сущность и атрибут должны иметь соответствующие имена, которые могут быть легко понятны и нетехническим людям.
 * Отношения должны соединять сущности.
-* Каждый атрибут в данном объекте должен иметь уникальное имя.
+* Каждый атрибут в данном объекте должен иметь уникальное имя и тип данных, соответствующий предметной области.
 
 ### Объекты, которые должны быть включены в нашу ER-диаграмму:
 
@@ -36,7 +34,7 @@ MyFlix — это юридическое лицо, которое сдает в
 * **Участник** может арендовать один или больше фильмов.
 * **Фильм** может быть арендован более чем одним участником.
 
-Из приведенного выше сценария мы можем видеть, что нужно использовать отношение «многие ко многим». Реляционные базы данных не поддерживают отношения «многие ко многим». Нам нужно ввести новую сущность - таблицу связей. Эту роль будет играет таблица MovieRentals. Она имеет отношение один-ко-многим с таблицей участников и отношение один-ко-многим с таблицей фильмов.
+Из приведенного выше сценария мы можем видеть, что нужно использовать отношение «многие ко многим». Реляционные базы данных не поддерживают отношения «многие ко многим». Нам нужно ввести новую сущность - таблицу связей. Она имеет отношение один-ко-многим с таблицей участников и отношение один-ко-многим с таблицей фильмов.
 
 **Фильмы и категории лиц**
 
@@ -52,14 +50,35 @@ MyFlix — это юридическое лицо, которое сдает в
 
 ## Теперь давайте создадим ER диаграмму
 
-![](../img/erd_001.png)
+>Диаграмму будем делать в программе MySQL Workbench.
+
+1. Запустите **MySQL Workbench**, откройте вкладку **Модели** и создайте новую модель (иконка с плюсом)
+
+    ![](../img/mywb_01.png)
+
+1. Переименуйте модель. Название модели будет использоваться в DDL-скрипте как название базы данных, поэтому название должно соответствовать задаче: например, `ekolesnikov_test` для лабораторных работ и `user01` при выполнени демо-экзамена (если у вас еще нет аккаунта для подключения к БД, то можете этот шаг пропустить).
+
+    ![](../img/mywb_02.png)
+
+    двойной клик по названию модели откроет окно редактирования
+
+    ![](../img/mywb_03.png)
+
+    >Кнопку "Rename References" нужно жать, если у вас уже есть диаграмма или таблицы
+
+1. Добавьте диаграмму
 
-Давайте посмотрим на два типа объектов, с которыми мы будем работать (на примере программы *draw.io*).
+    ![](../img/mywb_04.png)
 
-![](../img/erd_002.png)
+    Левую и правую панели можно скрыть, чтобы было больше места для диаграммы
 
-* Объект таблицы позволяет нам создавать объекты и определять атрибуты, связанные с конкретным объектом.
-* Кнопки отношений позволяет нам определять отношения между объектами.
+    ![](../img/mywb_05.png)
+
+1. Для добавления таблиц и связей используется панель или быстрые клавиши (можно посмотреть, наведя курсор на иконку)
+
+    ![](../img/mywb_06.png)
+
+### Создадим таблицу участников:
 
 **Участники** организации будет иметь следующие атрибуты
 
@@ -70,50 +89,92 @@ MyFlix — это юридическое лицо, которое сдает в
 * Физический адрес
 * Почтовый адрес
 
-### Создадим таблицу участников:
+1. Кликните по иконке "Новая таблица" (или нажмите быструю клавишу `T`)
 
-1. Перетащите на форму объект "таблица"
+    ![](../img/mywb_07.png)
 
-    ![](../img/erd_003.png)
+    В верхней панели появятся настройки таблицы, можно там ничего не менять и кликнуть мышкой в том месте диаграммы, куда вы хотите поместить новую таблицу
 
-1. Задайте название сущности и добавьте атрибуты
+1. Двойным кликом по таблице можно открыть окно свойств, где задать название таблицы (**Member**), добавить поля и их свойства
 
-    >Добавление нового атрибута:
-    >
-    >![](../img/erd_004.png)
+    ![](../img/mywb_08.png)
 
-    Должно получиться примерно такое:
+    ![](../img/mywb_09.png)
 
-    ![](../img/erd_005.png)
+    >Двойной клик по свободному месту в конце списка полей добавляет новое поле
 
-    >При наведении курсора мышки на объект, показывается информация о типе объекта
-    >
-    >![](../img/erd_006.png)
+1. Добавьте атрибуты
 
-Повторите эти действия для всех сущностей, в итоге должно получиться примерно так:
+    Должно получиться примерно такое:
 
-![](../img/erd_007.png)
+    ![](../img/mywb_21.png)
 
 Обратите внимание:
 
-* Таблица связей названа по именам связываемых сущностей
 * В названиях сущностей и атрибутов используем **CamelCase** и единственное число
-* сразу создаем атрибуты для связей: *paymentId*, *memberId*, *movieId*, *categoryId*. Для определения направления связи проговариваем про себя "у одного участника может быть несколько покупок" и, соответственно создаём аттрибут *paymentId* в сущности, которой **много**
+
+Для создания связей нам нужно иметь сущности, создадим еще сущности **Movie** (Фильм) и **Genre** (Словарь жанров для фильмов)
+
+### Создадим таблицу Фильмы (Movie):
+
+Добавим поля цена и продолжительность (жанр пока не добавляем, он будет внешним ключём к справочнику жанров)
+
+![](../img/mywb_22.png)
+
+### Создадим таблицу Жанры (Genre):
+
+![](../img/mywb_23.png)
+
+
+Таблицу для сущности "Платежи" нарисуйте сами, по аналогии с жанрами.
 
 ### Создадим связи
 
-1. Используем тип связи "один-ко-многим"
+1. Связь один-ко-многим между сущностями Фильмы и Жанры (проговариваем для себя: у фильма может быть один жанр, один и тот же жанр может быть у нескольких фильмов)
+
+    >Вообще у фильма может быть и несколько жанров, но мы в своей предметной области решили сделать так
+
+    Кликаем сначала по иконке связи один-ко-многим, затем по таблице у которой "много" и в конце по таблице где "один"
+
+    ![](../img/mywb_24.png)
+
+    Система автоматически добавит поле для внешнего ключа (`Genre_id`), вот только название не соответствует соглашению **CamelCase** - переименуем его в `genreId` (двумя кликами по сущности входим в режим редктирования и там правим название поля)
+
+    >Если присмотреться к интерфейсу, то можно заметить, что для связей есть по две иконки: с пунктиром и сплошная. Глубоко в теорию я не полезу, уточню только что при использовании идентифицирующей связи в связь включаются все ключи (т.е. если в таблице есть внешние ключи, то они тоже попадут в связь), поэтому всегда используйте неидентифицирующую связь (которая пунктирная)
+
+1. Связь многие-ко-многим между участниками и фильмами
+
+    Кликаем по иконке связи многие-ко-многим, затем по связываемым таблицам (порядок в этом случае не важен)
+
+    ![](../img/mywb_25.png)
+
+    Система автоматически создаст дополнительную таблицу связи, которая в реляционных СУБД и реализует связь многие-ко-многим.
+
+    Приведите названия таблиц и полей к соглашению **CamelCase**
+
+    Чтобы постоянно не переименовывать таблицы и поля можно в настройках Workbench задать шаблоны
+
+    Это исходный вариант (я подчеркнул поля, которые буду менять):
+
+    ![](../img/mywb_26.png)
+
+    А это измененный
+
+    ![](../img/mywb_27.png)
+
+    Теперь, если откатить изменения в диаграмме и заново создать связь, то получим такой результат:
 
-    ![](../img/erd_008.png)
+    ![](../img/mywb_28.png)
 
-1. Соединяем нужные аттрибуты сущностей соответствующими сторонами связи (проговариваем для себя: "в одной категории может быть много фильмов"), учитывая модальность связи.
+    Обратите внимание на типы ключей в таблице связи (MySQL Workbench использует не буквенное обозначение, а символьное: первичный ключ помечается ключиком, а внешний - оранжевым ромбиком). Для таблицы связи оба поля входят в первичный ключ (составной ключ)
 
-    ![](../img/erd_009.png)
+    Подробнее на созданные ключи можно посмотреть в соответствующих закладках:
 
-Повторяем эти действия для всех связей, в итоге получится примерно следующее:    
+    ![](../img/mywb_29.png)
+    
 
-![](../img/erd_010.png)
+## Задание
 
-**Задание**
+Реализуйте ER-диаграмму по предметной области из лекции в программе MySQL Workbench
 
-Разработать ER-диаграмму для своей предметной области
+В репозитории опубликовать и файл диаграммы и экспорт этой диагрыммы в PDF.

+ 1 - 1
articles/mywb01.md

@@ -34,7 +34,7 @@
 
     ![](../img/mywb_07.png)
 
-    В верхней панели появятся натройки таблицы, можно там ничего не менять и кликнуть мышкой в том месте диаграммы, куда вы хотите поместить новую таблицу
+    В верхней панели появятся настройки таблицы, можно там ничего не менять и кликнуть мышкой в том месте диаграммы, куда вы хотите поместить новую таблицу
 
 1. Двойным кликом по таблице можно открыть окно свойств, где задать название таблицы, добавить поля и их свойства
 

BIN
img/mywb_06.png


BIN
img/mywb_20.png


BIN
img/mywb_21.png


BIN
img/mywb_22.png


BIN
img/mywb_23.png


BIN
img/mywb_24.png


BIN
img/mywb_25.png


BIN
img/mywb_26.png


BIN
img/mywb_27.png


BIN
img/mywb_28.png


BIN
img/mywb_29.png


+ 3 - 2
readme.md

@@ -23,7 +23,7 @@
   </tr>
   <tr>
     <td style="text-align: center; border: none; height: 1em;">
-        г.Йошкар-Ола, 2021-2024
+        г.Йошкар-Ола, 2021-2025
     </td>
   </tr>
 </table>
@@ -197,7 +197,8 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 1. [Основы проектирования баз данных. ERD.](./articles/5_1_1_1_erd2.md)
 1. [Словарь данных](articles/5_1_1_1_data_dictionary.md)
 1. [Основы SQL](./articles/sql_for_beginner.md)
-1. [Использование MySQL Workbench для создания ER-диаграммы и DDL-скрипта](./articles/mywb01.md)
+<!-- 1. [Использование MySQL Workbench для создания ER-диаграммы и DDL-скрипта](./articles/mywb01.md) -->
+1. [Создание ER-диаграммы](./articles/5_1_1_1_erd_workbench.md)
 1. [Создание базы данных. Импорт данных.](./articles/sql_import.md)
 1. [Представления (View)](./articles/sql_view.md)
 1. [Хранимые процедуры. Триггеры.](./articles/sql_trigger.md)