dbの代理キーと自然キー

10/08/23
UMLによる設計がだいぶできてきたので、作業日報アプリケーションについてDBの準備を進めています。


このアプリケーションの開発にはhibernateを使用します。それを踏まえてテーブルを作成しています。ここで少し考えさせられたのが、代理キー自然キーです。


hibernateを利用する上でDBのテーブルに代理キーを準備することがHibernate辞典 設定・マッピング・クエリ逆引きリファレンス (DESKTOP REFERENCE)でも推奨されています。代理キーにはDB側でAUTO_INCREMENTを利用して作成します。DB側ではこのカラムが主キーになります。


一方、Java側でJava.Util.Setを利用して一対多(one to many)を実装するには自然キーも必要です。IDはhibernateがまだオブジェクトをDBにflush()していない時点では存在しない可能性があるので、その時点でのオブジェクトの重複を許さないために、自然キーを利用します。

以上を踏まえ、テーブル作成のSQLは以下のようになりました。もし間違いにお気づきの方がいらっしゃいましたらご意見ください。

CREATE TABLE `user` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`easylock` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user` char(40) NOT NULL,
`password` char(40) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

100911追記
現在、事前設計に基づいてMySQLにテーブルを作成し、hibernateまわりのプログラミングを行っています。結局、自然キーはプログラム側で重複しない文字列を作成し(データクラス名+連番の予定)、自然キーとして登録することにしました。データベース側で作成する代理キーであるIDと重複しそうな気がしますが、とりあえず書籍の言うことを信じて今回のアプリケーションでは作成していきます。それを踏まえたテーブル設計は以下の様になりました。"naturalkey"という名前をつけた列がそうです。(カラムの文字数は変更する可能性あり)

CREATE TABLE `user` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`easylock` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`naturalkey` char(40) NOT NULL,
`name` char(40) NOT NULL,
`password` char(40) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `naturalkey` (`naturalkey`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |