Как быстро сгенерировать схему базы данных

14 января 2011

Меня давно подмывало написать заметку о том, как с помощью Dia и dia2code можно сгенерировать SQL-код из схемы базы данных. Или код на C++ из диаграммы классов. А тут на Хабре появилась заметка об онлайн-сервисе DBDsgnr, решающий первую из этих двух задач. И мне кажется, что он намного удобнее связки Dia + dia2code.

Сервис сделан на питоне и google app engine. Залогиниться в него можно имея аккаунт в гугле. Вкратце о сервисе: вы рисуете схему баз данных, а сервис создает вам код. На данный момент можно получить только для MySQL…

… но в скором времени обещают сделать поддержку и других СУБД. На практике это выглядит так. Рисуем схему базы данных:

Схема базы данных для простого блога

Для примера я составил схему БД простого блог-движка. На это ушло минут пять.

Дополнение: Перечитывая заметку, я понял, что таблица post_comment, по всей видимости, лишняя. Тут же нет связи «многие ко многим». Что-то я дал маху…

Затем жмем на кнопку «SQL» и получаем код:

-- generated by dbdesignr.appspot.com
CREATE TABLE `posts`
  (
     `pid`             INT NOT NULL AUTO_INCREMENT,
     `title`           CHAR(64),
     `message`         TEXT,
     `slug`            CHAR(64),
     `comments_num`    INT,
     `created`         DATETIME,
     `comments_closed` INT,
     PRIMARY KEY (`pid`)
  );

CREATE TABLE `tags`
  (
     `tid`  INT NOT NULL AUTO_INCREMENT,
     `name` CHAR(64),
     `slug` CHAR(64),
     PRIMARY KEY (`tid`)
  );

CREATE TABLE `post_tag`
  (
     `pid` INT NOT NULL AUTO_INCREMENT,
     `tid` INT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`pid`, `tid`)
  );

CREATE TABLE `comments`
  (
     `cid`     INT NOT NULL AUTO_INCREMENT,
     `author`  CHAR(64),
     `email`   CHAR(64),
     `url`     CHAR(64),
     `message` TEXT,
     `created` DATETIME,
     PRIMARY KEY (`cid`)
  );

CREATE TABLE `post_comment`
  (
     `pid` INT NOT NULL AUTO_INCREMENT,
     `cid` INT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`pid`, `cid`)
  );

ALTER TABLE `post_tag` ADD CONSTRAINT `post_tag_fk1`
  FOREIGN KEY (`pid`) REFERENCES posts(`pid`);

ALTER TABLE `post_tag` ADD CONSTRAINT `post_tag_fk2`
  FOREIGN KEY (`tid`) REFERENCES tags(`tid`);

ALTER TABLE `post_comment` ADD CONSTRAINT `post_comment_fk1`
  FOREIGN KEY (`pid`) REFERENCES posts(`pid`);

ALTER TABLE `post_comment` ADD CONSTRAINT `post_comment_fk2`
  FOREIGN KEY (`cid`) REFERENCES comments(`cid`);

Не знаю, как вам, а мне приятнее нарисовать пять прямоугольников, чем писать 50 строк кода. А если бы таблиц было штук 12, по десятку полей в каждой?

К сожалению, в настоящее время DBDsgnr довольно сыроват. Например, в нем не работают некоторые элементы управления (во всяком случае, у меня, во FreeBSD), а в сгенерированном коде после половины запросов ALTER TABLE не хватало точки с запятой.

Еще один косяк DBDsgnr — после копирования в буфер обмена код теряет форматирование. Но это легко исправить с помощью другого веб-сервиса — Instant SQL Formatter.

Несмотря на свои недостатки, сервис очень удобен и позволяет сэкономит много времени. Вот бы еще найти аналогичный редактор диаграмм классов, позволяющий получить на выходе C++/Java/Perl/Python/PHP код…

Дополнение: В этом блоге также есть куда более удачный пост на тему проектирования схем баз данных

Метки: , .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, ВКонтакте, Twitter или Telegram.