読者です 読者をやめる 読者になる 読者になる

たなちの開発日誌

プログラミングのメモを中心に気になったことを書いていきます。

【DB設計】主キーをIDとCDのどちらにすべきか

システム開発の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の技術メモ