主キー

主キーは、フツー論理キーを当てますね(依存型)。

Oracle Appsでは、主キーは数値型のIDを機械的に割り振っていました(非依存型)。

どっちがいいんでしょう?

結論

依存型。

依存型の主キー様式と非依存型の主キー様式

依存型の主キー様式の特徴

  • どの雑誌や入門書を見ても、みんなこれ
  • いままでこれでやってきた
  • わかりやすい
  • WHERE句が大量になりがち
  • よくわかっていなくても設計できる

ID型の主キー様式の特徴

  • SEQUENCEオブジェクト(Oracleだけ)使える
  • 結合が死ぬほど楽
  • どれが本来の論理キーなのかわかりにくい
  • 人に解説するのが死ぬほどメンドー(特に最近の実装をしていない人に)
  • データロードするときなどにプロシージャ書かないといけなくなる
  • 実装を知らないと設計できなくなる

社内プロジェクトでは依存型主キー様式で統一されたみたいです。

「わかりやすい」ということなんでしょう。SQLを作るときに不必要な緊張を強いられますし、間違いが発見しにくくなりますが、間違えた人を指差して弾劾できるので有効らしい。

A君:「これ関係ない会社の明細も出ちゃってるよ!」
B君:「あっ、会社コードの結合条件を書くのを忘れてました!」
A君:「バッキャロー!」

私も、ID型の利点を説明し続けるのにもすっかり飽きたし、DB側の機能サポートもさっぱりされないしで、もうどうでもよくなりました。プロジェクトで統一されてればいいでしょうし、慣れている方がいいんじゃないの?

私が一から全部作るならID型(OracleならNUMBER型、SQL Serverならuniqueidentifier型を使うと思います)にしますが、誰か原理主義者がプロジェクトに絡んできたらさっさと諦めて工数増やします。

依存型主キーはやる気がなくなって品質が下がるので、テスト工数を増大させようと考えると思います。

なぜ依存型を?

依存型は「結合し忘れ」が多いです。多い気がします。Cross JoinになってdistinctついてるSQLは死ぬほど見ました。「どうにもうまく取得できないんです」と言われて、死ぬほど長いWHERE句を一瞬で判定しろと強制されることも多かった。たいてい結合条件の間違いです。
自分で読むのが嫌だから、俺に押し付けていたんだと思いますね。気持はわかります。

依存型にすると品質下がらないか? と聞いてみると、「わかってる人にはいいけど、わからない人には意味がない」という話です。そうかもしれません。
わからないならさっさとわかればいいだろと思っておりましたので、私も昔は説明したりしていました。しかし、説明されなきゃわからない人は結局のところわかっていないので、病的な形で不服従が現れます。

「そんなことよりも、わからないで作ってるという方が問題だ」という話もありました。
そのとおりです!
ID様式が理解できないのなら、データ構造はまったく理解できないでしょう。それよりは依存型にして、わかる気になったほうがまだマシです。わからないで何となくやっている、というのは最悪です。

よくわからないでSQLを作っている人はよくわかっていないのだから、結合条件の書き方に型(スタイル)がない。型がないので、毎回やり方が違う。そのうちどこかで間違えるかもしれない。後で読まされるのはずいぶんと苦痛です。

そう、私がID型にこだわっていたわけがわかりました。「よく理解しないで設計する」ということがなくなるから、この方がよいと思っていたのだな。
ID型は実装がわかっていないと作れないからな。

皆さんがクラス設計するときは、要件と実装と両方を同時に考えるでしょう。
DBのクラス設計(論理設計)も同じことだと私は思っているのですね。

備考

SQL Server 2005のサンプルデータベース(Adventure Works)を見てみると、まあ厳密には違うが、ID型になっている。

主キーは数値型(int)で、必ず"ID"というサフィックスがついている(まあ、だいたい)。しかしIDENTITYだけど…。これは昔は扱いが難しかったので私は見限った(実際にINSERTするまで値が確定できない)。GUID使ったほうがいいと思う。でも80bitは結構つらいけど。
INSERTをStored Procedureでやるのはいいんだけど、そうするとプログラミング言語にID値を返さなきゃならない。これが面倒なのだ。

Oracleのスゲー人(と思う)が設計した(と思う)Appsも、"ID"サフィックスでNUMBER型の主キーだった。OracleはSequenceオブジェクトがあるからな。これは「予約型」なので値が事前に取得できます。

まあ、そうですな。まともに実装を知れば、誰だってID型で設計するはずだ。OLTPならこうなる。当然だな(私は原理主義)。しかし、私らの相手の人たちの「当然」は当然違うのだ。

この話は、世間的にはもう議論されつくしたのでしょうか? 議論自体を見た思い出がないですが、私は狭い範囲で生きてきたからなー。
何でOracleの人やMicrosoftの人は数値型のID型主キー人生を推していて、世間の人々は依存型の主キー人生なんでしょう?

よくわからないですね。皆さんのプロジェクトではどういう設計思想で作られていますか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>