システム開発のDB設計中に悩んだこと。
何を主キーとするか
- ID:データの意味とは関係のない一意の数値(人工キー、サロゲートキー)
- CD:データとして意味を持ち、一意の値(自然キー)
この2通りの考え方があるという認識。
色々記事をみてみると、新たにシステムを開発するならIDの方が良さそう。
僕自身も、長期的に運用することや改修案件に携わるときのことを考えると、IDを主キーとするべきだと思う。なぜならCD(例えば社員番号や店CDなんか)は仕様が変わる可能性があり、そのときのプログラムの変更範囲が大きくなり、面倒だからw
x-xx-xxxの形式を変えて
x-xx-xxx-xxxxで運用したい。
となったときに、テーブル同士の関連がデータの意味と関係のないIDであればあまり苦労しなさそうな気がする。。既存システムの状況とかプロジェクトの方針とかケースバイケースだけど。
CakePHPでは
現在、個人的にCakePHP3で開発を始めたのだが、Cookbookによるとテーブル名、カラム名にはデフォルトで規約があるとのこと。
hasMany, blongsTo, hasOne 中の外部キーは、デフォルトで関連するモデルの(単数形の)名前に _id を付けたものとして認識されます。
例えばブログ管理システムで ユーザー:記事が 1:n の関係で、 articles(記事) テーブルは、 user_id を外部キーとして users テーブルのデータを 参照する。
なので、CakePHPでの開発では主キーとしてIDを持つことが推奨されているということかな。自力で別名をつけることはできるけど。
結論
テーブルの主キーにはIDを使う。
(実際の現場ではケースバイケースですが、できることならこちらの方がスマートですかね。)
悩んだきっかけは、テーブルのソート用にCDを使うときに主キーとの関係性が気になったこと。ユーザーに主キーを編集させるのはあることなのかな?と思ったので。
こちらの記事を参考にさせていただきました。
Mikeのプログラミング・メモ: 商品コードを主キーにするべきではない理由
主キーの設計どっち?「ID派 vs コード派」 - Akabeiの技術メモ