skillup

技術ブログ

Database

論理設計のグレーノウハウ サロゲートキー

投稿日:

前回まではアンチパターンやバッドノウハウについて学習してきましたが、今回はグレーノウハウについて特集します。

グレーノウハウとは読んで字のごとくホワイトともブラックとも言えないという手法ですね。

つまりある程度の効果もあるけれども、堂々と正しいとは言えない設計のことです。

ポイントとしては

  • 完全に否定はできない
  • 使うなら節度をもち、リスクを踏まえて

ということですね。それでは以下見ていきます。

主キーが存在しないときのサロゲートキー

データベースではコードなどのキーによってユニークな組み合わせをつくれることが理想です。こういったキーを主キーといい、一つのキーだけで特定できない場合は複数のキーを組み合わせる複合主キーを使用します。

そうはいっても実務では必ずしもユーザーが使用しているキーがユニークになるとは限りません。

  • 使いまわしをしている

というケースも考えらなくはありません。

このようなケースで使われるのがシステム側が発行する代理キー(サロゲートキー)です。ユーザーが使用するものとは別にシステム側で自動採番されるような人工的なキーを生成します。

これはかなり一般的によく使われている手法ですが、

  • そもそも論理的に不要なキーであり、論理モデルを分かりにくくする

などのデメリットもあり、無条件で奨励できるものではないようです。

できれば

使いまわしをしている場合は

  • 年度や時間などを列として追加することで複合主キーとして解決できないかを検討する

といった解決策を考えるのが良いようです。

上記の内容ですが、メリットとデメリットを深く考慮してませんでした・・・いままで何も考えずにオートインクリメント属性のidを作成し、これを主キーとしてました・・・。このやり方に問題自体がないと思っていたので・・

うーんやっぱり理論的なことを知らないとまずいですね・・・

代理キー

ちなみに代理キーに関してもシーケンスオブジェクトを使用するパターンとオートインクリメントを使用するパターンの2種類があります。

私はMySQLがほとんどだったのでほとんどオートインクリメントでやってきましたが、データベースベンダーにより型が違っているなど、移植性がひくいというデメリットがあり、柔軟性という点ではシーケンスオブジェクトに軍配が上がります。

オートナンバリングをアプリ側でつくることもできますが、排他制御を考えたりと開発工数が増えるというデメリットがあります。

ちなみに代理キー自体はシーケンスオブジェクトでもオートインクリメントでもアクセスが集中した時に性能遅延するというデメリットがあります。

 

-Database
-

執筆者:


  1. […] 論理設計のグレーノウハウ サロゲートキー […]

comment

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

関連記事

no image

cake sql系+リレーション+ヘルパー

先月末に引き続いてcakeネタをもりっといきます。 といっても自分用の小ネタリンク集です。 Contents1 sql系の小ネタ1.1 findとread1.2 find(‘count&# …

no image

DBの基礎 テーブルとは

CSSを学習したあとはデータベースの学習などを。 参考図書:「達人に学ぶDB設計指南書」基本的にはこれを読んでいきます。が、現状よくわからないところは飛ばしていきます・・・ Contents1 テーブ …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …

no image

CASE式のすすめ その2

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。 Contents1 CASE式の利用2 UPDATE文のCASE3 テーブル同士のマッチング CASE式の利用 私自身はCHECK制約を使 …

no image

SQL問題

今までやったSQL問題などのまとめ。定期的にやる予定です・・ 自分用なのでテーブルデータとかあったりなかったりいい加減です(汗) SQLドリル 問題1 nameとageで構成されたテーブルがあるとして …