Использование визуальных средств проектирования БД.

Создание модели

В главном окне программы

Главное окно программы

В разделе “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 – ключевой атрибут (часть первичного ключа)
  • NNNOT NULL – не может иметь “пустое” значение
  • UQUNIQUE – значение должно быть уникально
  • BIN – предполагается хранение двоичных данных (используется для некоторых строковых типов)
  • UNUNSIGNED – беззнаковое представление для численных типов
  • ZFZEROFILL – дополнять возвращаемое численное значение нулями слева
  • AIAUTO_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-код создания схемы.

Для этого запустите команду меню DatabaseForward 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` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',
  `name` VARCHAR(200) NOT NULL COMMENT '',
  `isMember` TINYINT(1) NOT NULL COMMENT '',
  PRIMARY KEY (`id`)  COMMENT '',
  INDEX `idx_isMember` (`isMember` ASC)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`courts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`courts` (
  `id` INT UNSIGNED NOT NULL COMMENT '',
  PRIMARY KEY (`id`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`reserves`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`reserves` (
  `idCourt` INT UNSIGNED NOT NULL COMMENT '',
  `startTime` DATETIME NOT NULL COMMENT '',
  `idClient` INT UNSIGNED NOT NULL COMMENT '',
  `duration` TIME NOT NULL COMMENT '',
  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)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`prices`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`prices` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',
  `name` VARCHAR(50) NOT NULL COMMENT '',
  `price` DECIMAL(14,4) NOT NULL COMMENT '',
  PRIMARY KEY (`id`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`tariffs`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`tariffs` (
  `idCourt` INT UNSIGNED NOT NULL COMMENT '',
  `isMember` TINYINT(1) NOT NULL COMMENT '',
  `idPrice` INT UNSIGNED NOT NULL COMMENT '',
  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)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Этот код затем может быть выполнен на сервере СУБД.

ВАЖНО: Если для каких-то внешних ключей нет индексов, или тип внешнего ключа не соответствует типу атрибута, на который он ссылается, выполнение SQL-кода завершится ошибкой!