skillup

技術ブログ

Database

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

投稿日:

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

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

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

ポイントとしては

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

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

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

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

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

  • 使いまわしをしている

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

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

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

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

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

できれば

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

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

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

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

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

代理キー

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

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

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

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

 

-Database
-

執筆者:


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

comment

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

関連記事

no image

複数GROUP BYでの注意

GROUP BYしたときに件数が増えるという現象があったので一応メモ。というか当たり前のことですが・・・ たとえば以下のようなテーブルがあったとします。 student id student_name …

no image

アンチパターン 連鎖倒産+エラー監視+データのバックアップ

本日は主にインフラの設計的なことに関して。 Contents1 連鎖倒産1.1 デメリット1.2 対策2 エラー監視2.1 デメリット2.2 対策3 データのバックアップ体制3.1 デメリット3.2 …

no image

データクレンジング

リレーショナルデータベースでデータを管理する前に、しなくてはいけないことはデータをデータベースに登録できる形に整形することです。 このことをデータクレンジングといいます。 これを行わずに何も考えずにデ …

no image

MySQLのメモリ設定

実務で結構サーバーをヘビーに使われるお客さんがいて、SQLが遅くなったりとしています。 なんとか対策しないといけないので、いろいろと調査をいます。 それで今回はMySQLのメモリ問題など。 MySQL …

no image

集合としてのSQL

今まで何度かSQLが集合ということを扱ってきました。 今回はそれがよくわかる例を。 実務ではあまりないと思うのですが、集合をイメージしやすい例題として、2つのテーブルが全く同じケースを考えます。 下記 …

アーカイブ