問題を正しく認識できていない可能性がありますが、質問にコメントしてみます。
プログラミングを始めたばかりの頃、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でたくさん扱ってきましたが、
特別な設定が必要だったりする程度で、そんなに苦労したこともないですよ。
※複合主キーだとやや制限はあるかもしれませんが、それでもそんなに困った記憶はないです。
不明な点や誤解等あれば、コメントお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/09 03:04
2016/11/09 03:22
2016/11/09 10:38