Создание модели
В главном окне программы
В разделе “Models” нажмите “+”
Откроется новая созданная схема с названием “mydb”.
На этом экране можно создавать таблицы, добавлять отображения, SQL-скрипты и т.п.
Нас сейчас интересует возможность создания EER-диаграмм.
Задание названия БД
При двойном клике на название схемы данных
откроется окно свойств.
В нем можно задать название схемы, указать кодировку по умолчанию, и добавить комментарий.
Далее используется название по умолчанию mydb
, однако при самостоятельном выполнении настоятельно рекомендуется указать осмысленное название схемы.
Создание новой диаграммы
В верхней части экрана, нажмите “Add Diagram” (двойной клик)
Откроется новосозданная EER-диаграмма – пока пустая
Основные элементы управления расположены слева от клетчатого поля.
Назначение этих элементов (сверху вниз):
- Выбор объектов
- Перемещение схемы
- Удаление объектов
- Создание визуальных групп на диаграмме
- Добавление текста на диаграмму
- Добавление рисунка на диаграмму
- Создание таблицы
- Создание отображения
- Создание группы процедур
- Создание не идентифицирующей связи 1:1
- Создание не идентифицирующей связи 1:M
- Создание идентифицирующей связи 1:1
- Создание идентифицирующей связи 1:M
- Создание связи M:N
- Создание связи по существующим ключам
Идентифицирующая связь в данном случае – связь по внешнему ключу, который входит в первичный ключ. Например, в отношениях
- clients: (idClient, idManager, …)
- managers: (idManager, …)
атрибут clients.idManager
является внешним ключом, но связь clients
и managers
не будет идентифицирующей (M:1 или 1:1 в зависимости от ограничений на clients.idManager
).
В случае же
- purchaseArticles: (idPurchase, idArticle, quantity)
- purchases: (idPurchase, …)
- articles: (idArticle, …)
связи purchaseArticles
c purchases
articles
будут идентифицирующими (M:1 в обоих случаях).
Создание таблиц
Нажатие на кнопку создания таблицы позволит разместить новый объект “таблица” на диаграмме.
Нажмите на кнопку создания таблицы, и затем в любое место на диаграмме (клетчатое поле).
Появится новый объект типа “таблица” с автоматически генерированным названием
При этом, автоматически будет выбран инструмент “выбор объекта” .
Откройте свойства объекта таблицы двойным щелчком на нем. Откроется окно свойств
На первой вкладке, Вы можете задать имя таблицы, способ хранения, кодировку и комментарий.
Переименуйте таблицу, согласно ее предполагаемому содержимому.
Далее полагается, что создается таблица clients
из БД теннисного клуба.
На второй вкладке можно создать столбцы (атрибуты) таблицы
Двойной клик в пустом поле Column Name
приведет к добавлению колонки. Следует задать имя и тип данных.
Можно так же задать различные атрибуты колонки:
PK
– ключевой атрибут (часть первичного ключа)NN
–NOT NULL
– не может иметь “пустое” значениеUQ
–UNIQUE
– значение должно быть уникальноBIN
– предполагается хранение двоичных данных (используется для некоторых строковых типов)UN
–UNSIGNED
– беззнаковое представление для численных типовZF
–ZEROFILL
– дополнять возвращаемое численное значение нулями слеваAI
–AUTO_INCREMENT
– автоматический счетчик
Так же можно задать значение по умолчанию в последней колонке.
“Лишние” колонки можно удалять, выбрав “Delete selected” в контекстном меню (по правой кнопке мыши). Не пытайтесь удалить последнюю (пустую) строчку!
После создания колонок для таблицы clients
:
На третьей вкладке можно создать индексы
Индекс для первичного ключа создается автоматически.
Здесь следует создать индексы для внешних ключей. Для этого в левой части окна, делается двойной клик на пустой строке, вводится название индекса, и возможно выбирается тип (нас интересует в основном INDEX
).
После этого, в средней части выбираются индексируемые колонки.
В левой части можно указать настройки для индекса. Можно оставить их по умолчанию.
Например, создадим индекс для isMember
#
в средней части окна соответствует положению колонки в создаваемом индексе. При создании индекса для составного внешнего ключа, порядок колонок в индексе должен совпадать с порядком во внешнем ключе.
Создадим остальные таблицы. Не забывайте создавать индексы для внешних ключей!
Создание связей
Будем использовать инструмент “Создание связи по существующим ключам” . Причина проста: все остальные инструменты автоматически создают колонки для внешних ключей, но мы уже создали эти колонки.
Можно было бы, конечно, сперва создать связи, и потом уже добавить оставшиеся колонки.
Создадим связь для внешнего ключа reserves.idClient
с таблицей clients
.
Нажмем на инструмент создания связи и выберем колонку reserves.idClient
. В правом верхнем углу при этом появится подсказка:
Можно было бы выбрать дополнительно другие колонки для внешнего ключа, в случае составного ключа.
Теперь можно выбрать колонку другой таблицы, на которую ссылается данный внешний ключ. В нашем случае это, видимо, clients.id
. Выберем его.
При наведении курсора мыши на связь, появляется подсказка с описанием связи.
Создадим связи для остальных таблиц.
Определения внешних ключей при этом будут созданы автоматически.
Уточнение внешних ключей
Автоматически созданные определения внешних ключей имеют в спецификаторах ON UPDATE
и ON DELETE
значение NO ACTION
.
Пройдем по всем таблицам и установим необходимые действия.
На примере таблицы reserves
, двойной клик на таблице открывает окно свойств. Четвертая вкладка Foreign Keys
позволяет задать свойства внешних ключей.
Выберем первый ключ. В средней части окна показано, какая колонка является внешним ключом, и на какую колонку она ссылается. В данном примере это колонка idClient
, ссылающаяся на clients.id
. Зададим действия ON DELETE RESTRICT
, ON UPDATE CASCADE
.
Произведем аналогичную процедуру со вторым внешним ключом (fk_reserves_courts1
):
Создание SQL-скрипта схемы базы
На основе созданной диаграммы, можно сгенерировать SQL-код создания схемы.
Для этого запустите команду меню Database
→ Forward Engineer...
Откроется окно с предложением выбрать соединение (оставьте по умолчанию или задайте параметры соединения с БД)
Окно настроек генерируемого кода
Окно выбора элементов, на основе которых требуется создать SQL-код
И, наконец, будет показан созданный код
Сам код:
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`clients`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`clients` (
INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',
`id` VARCHAR(200) NOT NULL COMMENT '',
`name` 1) NOT NULL COMMENT '',
`isMember` TINYINT(PRIMARY KEY (`id`) COMMENT '',
INDEX `idx_isMember` (`isMember` ASC) COMMENT '')
= InnoDB;
ENGINE
-- -----------------------------------------------------
-- Table `mydb`.`courts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`courts` (
INT UNSIGNED NOT NULL COMMENT '',
`id` PRIMARY KEY (`id`) COMMENT '')
= InnoDB;
ENGINE
-- -----------------------------------------------------
-- Table `mydb`.`reserves`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`reserves` (
INT UNSIGNED NOT NULL COMMENT '',
`idCourt` NOT NULL COMMENT '',
`startTime` DATETIME INT UNSIGNED NOT NULL COMMENT '',
`idClient` TIME NOT NULL COMMENT '',
`duration` PRIMARY KEY (`idCourt`, `startTime`) COMMENT '',
INDEX `idx_idCourt` (`idCourt` ASC) COMMENT '',
INDEX `idx_idClient` (`idClient` ASC) COMMENT '',
CONSTRAINT `fk_reserves_clients`
FOREIGN KEY (`idClient`)
REFERENCES `mydb`.`clients` (`id`)
ON DELETE CASCADE
ON UPDATE RESTRICT,
CONSTRAINT `fk_reserves_courts1`
FOREIGN KEY (`idCourt`)
REFERENCES `mydb`.`courts` (`id`)
ON DELETE CASCADE
ON UPDATE RESTRICT)
= InnoDB;
ENGINE
-- -----------------------------------------------------
-- Table `mydb`.`prices`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`prices` (
INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',
`id` VARCHAR(50) NOT NULL COMMENT '',
`name` DECIMAL(14,4) NOT NULL COMMENT '',
`price` PRIMARY KEY (`id`) COMMENT '')
= InnoDB;
ENGINE
-- -----------------------------------------------------
-- Table `mydb`.`tariffs`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`tariffs` (
INT UNSIGNED NOT NULL COMMENT '',
`idCourt` 1) NOT NULL COMMENT '',
`isMember` TINYINT(INT UNSIGNED NOT NULL COMMENT '',
`idPrice` PRIMARY KEY (`idCourt`, `isMember`) COMMENT '',
INDEX `idx_idPrice` (`idPrice` ASC) COMMENT '',
CONSTRAINT `fk_tariffs_courts1`
FOREIGN KEY (`idCourt`)
REFERENCES `mydb`.`courts` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tariffs_prices1`
FOREIGN KEY (`idPrice`)
REFERENCES `mydb`.`prices` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
= InnoDB;
ENGINE
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Этот код затем может быть выполнен на сервере СУБД.
ВАЖНО: Если для каких-то внешних ключей нет индексов, или тип внешнего ключа не соответствует типу атрибута, на который он ссылается, выполнение SQL-кода завершится ошибкой!