質問: プログラミングを始めたばかりの頃、DBでは主キーにid(サロゲートキー)を指定していたにも関わらず、 CakePHP側でプライマリーキーをuser_idに指定したために後で大変な思いをしました。 新たに、DBの設計を考えているのですが、 DBでの主キーをuser_id CakePHP側でプライマリーキーをuser_id にすれば、過去のような惨事は起きず、問題なくつかえると思うのですが、この場合user_idはユニークなランダム英数字10文字などでも問題無いのでしょうか? また、このuser_idは外部キーとしても使われます。 例えばpostsテーブルのposterカラムにuser_idが入り、postとuserを紐付けます。 DB設計において、サロゲートキーは本来使わずにナチュラルキーを用いるべきだと、色々な記事で読みました。 ですが、フレームワークを使う以上、規約にのっとるべきだともありました。 user_idを主キーにするとインデックスをつけられない?でしょうか・・・? 長々書きましたが、 ・CakePHPの規約にのっとり、id(サロゲートキー)を主キー・プライマリーキーとし、user_idを外部キーとする ・user_id(ユニークなランダム英数字10文字)を主キー、プライマリーキーにするのは問題無いが外部キーとして使うのはやめておいた方がいい ・user_idを主キー・プライマリーキー・外部キーとして用いる問題ない どうするのが良いでしょうか? アドバイス頂けますと幸いです。 よろしくお願い致します。
回答: 問題を正しく認識できていない可能性がありますが、質問にコメントしてみます。 > > プログラミングを始めたばかりの頃、DBでは主キーにid(サロゲートキー)を指定していたにも関わらず、 > > CakePHP側でプライマリーキーをuser_idに指定したために後で大変な思いをしました。 > > > DB側で主キーがidだったなら、CakePHPもプライマリキーをidにすべきだったのではないでしょうか... そうしなかった理由がよくわかりません...。 > > 新たに、DBの設計を考えているのですが、 > > DBでの主キーをuser_id > > CakePHP側でプライマリーキーをuser_id > > にすれば、過去のような惨事は起きず、問題なくつかえると思うのですが、この場合user_idはユニークなランダム英数字10文字などでも問題無いのでしょうか? > > > Cakephpに規約に従うならusersテーブルの主キーの名前はuser_idではなく、idにすべきだと思います。 Model側にプライマリキーのカラム名を指定すれば他のカラム名でも問題ないです。 > > また、このuser_idは外部キーとしても使われます。 > > 例えばpostsテーブルのposterカラムにuser_idが入り、postとuserを紐付けます。 > > > Cakephpの規約に従うならusers.idとposts.user_idにすべきですが、 アソシエーションの設定を追加すれば違うカラム名でも問題ないです。 > > DB設計において、サロゲートキーは本来使わずにナチュラルキーを用いるべきだと、色々な記事で読みました。 > > ですが、フレームワークを使う以上、規約にのっとるべきだともありました。 > > > ケースバイケースかもしれないので、断言はできませんが... ユニークなランダム英数字10文字という意味のない文字列はナチュラルキーとは呼ばないと思います。ランダムな英数字を使うぐらいなら、連番を使ったほうが普通だと思います。 user_idがユーザ名を意味する一意な文字列だったらナチュラルキーだと思いますが、それを外部キーに使うと、あとで変更するのが大変になるので、サロゲートキーを使うのが一般的なんだと思います。 > > user_idを主キーにするとインデックスをつけられない?でしょうか・・・? > > > 主キーには必ずインデックスがつきます(たぶん) ※少なくとも英数字10文字なら問題はありません。 > > ・CakePHPの規約にのっとり、id(サロゲートキー)を主キー・プライマリーキーとし、user_idを外部キーとする > > ・user_id(ユニークなランダム英数字10文字)を主キー、プライマリーキーにするのは問題無いが外部キーとして使うのはやめておいた方がいい > > ・user_idを主キー・プライマリーキー・外部キーとして用いる問題ない > > > ここまでの話を総括すると、Cakephpで自分が実装するならCakephpの規約に従って... ※別にCakephpでなくても、これに近い設計にすると思いますが * usersテーブルの主キーはidとしてauto incrementで自動採番にしますね。 ※ランダムな英数字にする必要性は特にないかと(特別な理由があれば別ですが) * postsテーブルのusersテーブルへの外部キーは、posts.user_idにしますね。 なお、今までid以外を主キーとするテーブルをCakephpでたくさん扱ってきましたが、 特別な設定が必要だったりする程度で、そんなに苦労したこともないですよ。 ※複合主キーだとやや制限はあるかもしれませんが、それでもそんなに困った記憶はないです。 不明な点や誤解等あれば、コメントお願いします。