IntelliJ IDEAのDB Toolを使ってわかったこと

昨日は金曜だったし喉も痛かったから早めに上がって久々に家族と一緒に就寝した。なんかここ最近雨続き、曇り続きのせいかかなり涼しい。おかげでかなり寝やすいのだが、寒暖差が激しいせいで少し体調が悪い。コロナの感染者も鰻登りでとうとう神奈川県は2回目のアラートを出した。これでまた保育園は自粛かな。。。妻と息子のことを考えると保育園はやっててくれた方がいいけど、保育士さんも大変だろうからなんか色々と複雑な心境だわ。
さて、最近テーブル設計することが多いけどテーブル設計はもっぱら 『IntelliJ IDEA』 を使うようにしている。というのも 『Ultimate』 だと IDEAは 『DB Tool』 が使えるのだが、これが結構便利で DDLを書く=>DBに適用 => ER図生成 みたいな流れでDDLがちゃんと実行できることとを試しつつER図生成ができるのですごくいい。
で、このツールを使って思ったことは、DDLを作るときに骨組みを作ってから中のカラムとか制約を後付けで設定するというやり方が便利だということ。手順としては
- テーブル定義はPKとFKだけで作る(テーブルとPK、FKのカラムのコメントは当たり前だがちゃんと書く)
- 外部キー制約はテーブルを一通り作成した後に一気に貼る
- カラムを作成する(もちろんコメント書く)
- 追加で制約をつける場合は後でつける(複合ユニークキーとか・・・)
例えば年賀状を管理するようなテーブル構成を考えるとすると以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
BEGIN; -- DROP SCHEMA DROP SCHEMA nenga CASCADE; --CREATE SCHEMA CREATE SCHEMA nenga; COMMENT ON SCHEMA nenga IS '年賀状スキーマ'; -- CREATE TABLES CREATE TABLE nenga.addresses ( address_id BIGSERIAL PRIMARY KEY ) COMMENT TABLE ON nenga.addresses IS '年賀状アドレス' COMMENT COLUMN ON nenga.addresses.address_id IS 'ID'; CREATE TABLE nenga.address_history ( address_history_id BIGSERIAL PRIMARY KEY, address_id BIGINT NOT NULL ) COMMENT TABLE ON nenga.address_history IS '年賀状アドレス履歴' COMMENT COLUMN ON nenga.address_history.address_history_id IS 'ID'; COMMENT COLUMN ON nenga.address_history.address_id IS '年賀状アドレスID'; CREATE TABLE nenga.address_status_delete ( address_status_delete_id BIGSERIAL PRIMARY KEY, address_id BIGINT NOT NULL ) COMMENT TABLE ON nenga.address_status_delete IS '年賀状アドレス削除ステータス' COMMENT COLUMN ON nenga.address_status_delete.address_status_delete_id IS 'ID'; COMMENT COLUMN ON nenga.address_status_delete.address_id IS '年賀状アドレスID'; -- FKEY ALTER TABLE ONLY nenga.adress_history ADD CONSTRAINT ah_address_id_fkey FOREIGN KEY (address_id) REFERENCES nenga.addresses (address_id) CASCADE DELETE; ALTER TABLE ONLY nenga.adress_status_delete ADD CONSTRAINT asd_address_id_fkey FOREIGN KEY (address_id) REFERENCES nenga.address (address_id) CASCADE DELETE; -- ADD COLUMN -- nenga.addresses ALTER TABLE ONLY nenga.addresses ADD COLUMN first_name TEXT NOT NULL; ALTER TABLE ONLY nenga.addresses ADD COLUMN last_name TEXT NOT NULL; ALTER TABLE ONLY nenga.addresses ADD COLUMN postal_code TEXT NOT NULL; ALTER TABLE ONLY nenga.addresses ADD COLUMN address TEXT NOT NULL; COMMENT COLUMN ON nenga.addresses.first_name IS '名'; COMMENT COLUMN ON nenga.addresses.last_name IS '氏'; COMMENT COLUMN ON nenga.addresses.postal_code IS '郵便番号'; COMMENT COLUMN ON nenga.addresses.address IS '住所'; -- nenga.address_history ALTER TABLE ONLY nenga.address_history ADD COLUMN first_name TEXT NOT NULL; ALTER TABLE ONLY nenga.address_history ADD COLUMN last_name TEXT NOT NULL; ALTER TABLE ONLY nenga.address_history ADD COLUMN postal_code TEXT NOT NULL; ALTER TABLE ONLY nenga.address_history ADD COLUMN address TEXT NOT NULL; ALTER TABLE ONLY nenga.address_history ADD COLUMN is_delete BOOLEAN NOT NULL; ALTER TABLE ONLY nenga.address_history ADD COLUMN create_time TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL; COMMENT COLUMN ON nenga.addresses_history.first_name IS '名'; COMMENT COLUMN ON nenga.addresses_history.last_name IS '氏'; COMMENT COLUMN ON nenga.addresses_history.postal_code IS '郵便番号'; COMMENT COLUMN ON nenga.addresses_history.address IS '住所'; COMMENT COLUMN ON nenga.addresses_history.is_delete IS '削除フラグ'; COMMENT COLUMN ON nenga.addresses_history.create_time IS '作成日時'; COMMIT; |
この手順のいいところは、1〜2で全体像が出来上がるので、設計する上で俯瞰して見ることが可能だという点。最初からカラムを全部入れて作るよりもコード量が少ないからすごく見やすいなぁというのが個人的な感想。デバッグするときも目的のところにアクセスしやすい。
生成されるER図もすっきりしているから見やすい。保守するときもDDLの全体像が掴みやすいので他の人が読んでも見やすいんじゃないかなと思う。多分これってプログラムでも言えるだろうから見やすい書き方というところでこういうの追求してもいいのかなと思った。
さて、今日は息子の自転車を見に行かなくちゃいけないからそろそろ日記投稿して準備しよう。