DBコンバータへの道(1)

<< 戻る   トップ >>

JPA (Java 永続性 API) をいじっていて、ときおり出てくる pk と fk について、pk はペナルティキックとは無縁であることは当然として、なんの略なのか疑問に思っていた所なのだが、それぞれ Primary Key と Foreign Key の略だったという、そりゃそうだよねというコロンブスの卵な脱力と、pk は pack と、fk はfook との関連を思い浮かべていた穴があったら入りたい的な面目のなさを如何にせん。

これまで、データベースの表を作成する時に、PRIMARY KEY にしたり NOT NULL にしたりと様々な「設定」をしてきた。しかし、この「設定」についてはカラムに「属性」を与えるというとらえ方をしていて、「制約」という意識はあまりなかった。それで CREATE 文や ALTER 文に CONSTRAINT なんて単語が出てくることに違和感をもったのだと思う。また、制約に名前をつけられることに今まで気がつかなかった。名前つけてうれしいのか?メリットがあるのか?ということには疑問を感じる。一度作成した制約を再利用できるというわけでなし、制約の削除が容易というところがメリットらしい。

MySQL で一対多や多対多の関係をつくるには、fk こと外部キー制約をかけなくてはいけない。MySQL の場合、データの管理を司る「ストレージエンジン」がいくつかあって、デフォルトのエンジンは MyISAM である。ところが、MyISAM は外部キー制約をかけられないので、エンジンを InnoDB に切り替えなくてはならない。検索の心臓部の切り替えなのだから、なかなか大変なモノであろう、と予想したのだが、コマンド "ALTER TABLE tbl ENGINE=InnoDB" であっさりと移行した。

鴨乃嘴南蛮データベースで多対多の関係にある article と category で、中間ファイルの relation_ac に外部キーを設定してエンティティクラスを作り直したところ、相互に Collection のフィールドをもつ二つのクラスが生成できた。

CREATE TABLE `relation_ac` (
    `article` int(11) NOT NULL DEFAULT '0',
    `category` int(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`article`,`category`),
    CONSTRAINT `fk_article`     FOREIGN KEY (`article`)     REFERENCES `article`     (`id`),
    CONSTRAINT `fk_category` FOREIGN KEY (`category`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

結局、MySQL のストレージエンジンとして MyISAM を選択していたという落とし穴に気がつかずに外部キー制約を使おうとしたのが先日の「うまくいっているのかいないのかがわからない」という不快感の源泉だったということだ。


作成: 2013-07-26 12:47:16.0更新: 2013-07-26 12:47:16.0
http://museo-anonimo.jp/nanban/?id=1225,http://museo-anonimo.jp/nanban/tr/1225