@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Ruby on Railsを前提としたナチュラルキーとサロゲートキーの話

若手のWeb系プログラマナチュラルキーとサロゲートキーの話をしました。 適当なこと言ってないか不安になったのて、調べ直しました。

DB データのサロゲートキー | knooto

おおむね SI 系は自然キー派、Web 系はサロゲートキー派の傾向がある

とても同意できる意見です。

ナチュラルキー派

第3回 テーブル設計のグレーゾーン~毒と薬は紙一重 (4)サロゲートキーVSナチュラルキー:SQLアタマアカデミー|gihyo.jp … 技術評論社

サロゲートキーを使えば,その保存に余計なディスク領域を消費しますし,論理的には不要な項目が付け加わることで,設計を不透明なものにするからです。必要に迫られたときだけ使うようにしましょう。

漢(オトコ)のコンピュータ道: ナチュラルキーとサロゲートキーについての議論

リレーショナルモデルでは、ドメインとは属性が取り得る値の集合のことである。(詳細はスライド を参照のこと。)もし同じ要素が異なるアイテムを指し示す可能性があるのだとしたら、そのドメインは一体如何なる意味のものだろうか。

ミックさんや奥野さんのようなDBに強い人、ナチュラルキーを生かして(DBのレイヤーで)ドメイン設計していこう派のようです。

サロゲートキー

欅樹雑記: 自然キー vs 人工キー 勝手に決着

主キーの要件を満たせるのは理論的に人工キーしかありえないよね?

サロゲート派もいます。

やはりSI系は自然キー派、Web系はサロゲートキー派というおおまかな傾向はありそうです。

私見

僕個人の見解を。 僕は「当分Railsを介さずにRDBを触るつもりはない」というポジションです。 その立場からすると「Railsサロゲートキーをサポートしているんだから、脳死してRail Wayに乗れば良いじゃん」です。

もうちょっと丁寧にいうと、Railsでは「モデリングをDB中心からリソース中心に変更する」決断をしています。 Railsプログラマが何も指定せずに「ドメインモデル」と言うときはデータベースやモデルクラス単体というよりは、URLとHTTPメソッドまでひっくるめたリソースをイメージしていると思います。 ナチュラルキーを使い出すと、リソースの一部のDBがリソースからはみ出はじめるように思います。 そこまでしてナチュラルキーを使ってそれでドメインモデリングがよくなるか?というと、Railsではそんなことはありません。 それよりは早めに動くリソース使って、動く物をみながらモデリングする方がRail Wayに乗れるように思います。 Railsの強みは早く動く物が作れる点にあります。

というわけで、「ナチュラルキーを絶対使ってはいけない」とは思いませんが、初手はサロゲートキーが、良いように思います *1

*1:「初手」というのは、RailではDBマイグレートできますので、実装してしばらく試して、ナチュラルキーが良いと思ったときにナチュラルキーに変更するのが良いと思います