mabots' blog

知のレバレッジを最大化せよ (旧はてなダイアリーから移転しました。)

DBDesignerでERモデリングから簡単DB設計

先日取り上げたDBDesignerですが、使い方になれればすごく便利です。

▼日本語化
http://dbdesigner.iimp.jp/
▼本家
http://fabforce.net/dbdesigner4/

何がいいかというと

まるでパズルを組み立てるごとくER図を作っていくと、DB設計からDB接続してCREATE TABLE、もちろんER図の画像出力まで一通りやってくれます。
10テーブル程度の設計であれば1-2時間くらいでできると思います。

ただ若干挙動がバギーなのですが(よくカラムが消えますww)、簡単にForeign Keyを使ったモデリングパターンを今回紹介します。この方法でいく限りは、バギーな挙動に直面せずにひととおり作業できハズ・・。

目的と概要

  • コンサートの情報を保持するコンサートエンティティと、コンサートにひもづくスケジュールを保持するスケジュールエンティティをつくる
  • イメージ的にはAというコンサートで「7/21 赤坂ホール」と「8/1 国際展示場」見たいな感じで日程が設定できるかんじです。
  • リレーション形としては、1:n
  • まずは、CREATE TABLEでForeign Key Referenceがでるところまでやってみる。


1.モデル設定を確認する


  • ストレージエンジンをInnoDBにする
  • リレーションシップの外部キー定義を自動オンにする
  • 外部キーカラムの接頭辞に参照先テーブル名を指定する

この場合原則として、concertエンティティのidを参照する場合concert_idなどというカラムが参照側のエンティティに作る設計となります。この設定以外だと結構バギーです。InnoDBではなくMyISAMでもいいですが、外部参照はアプリ対応になるのであしからず。


2.参照先エンティティの作成

まずはコンサートエンティティを作成します。左側のバーの真ん中のボタンで新規テーブル作成になります。
この図ではidと中身しかないですw

3.参照元エンティティの作成

コンサートのスケジュールが格納されるエンティティです。idと場所名と日付がはいります。

  • 最初の設定の約束に基づき、concert_idというカラムを作る
  • 参照元と参照先のカラムのデータ型定義は一緒にしておく


4.リレーションの作成

1:nリレーションのボタンを押し、参照先(concert)から参照元(schedule_concert)の順番でクリックすると外部参照が作成されます。


そんなわけで下記のようなCREATE TABLE文をメニューからつくれます。外部参照の挙動定義については、リレーションをダブルクリックして編集できます。

最終的なCREATE TABLE文

CREATE TABLE concert (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
content TEXT NULL,
PRIMARY KEY(id)
)
TYPE=InnoDB;

CREATE TABLE concert_schedule (
id INTEGER UNSIGNED NOT NULL,
place VARCHAR NULL,
date DATE NULL,
concert_id INTEGER UNSIGNED NULL,
PRIMARY KEY(id),
FOREIGN KEY(concert_id)
REFERENCES concert(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;

とりあえずここまできたら、後はいろいろダブルクリックしていじってみれば大体できると思います。
(このリレーションつくる方法にいたるまで、何回もFK変なところに張られたり、カラムが自動消滅しました・・・)