skillup

技術ブログ

Database

エンティティの抽出と主キー決定

投稿日:

主に設計に関することのメモ。

業務フロー分析

顧客の業務フローがどのように動いているのかを図で確認する。

使えそうと思った図式化の手法は下記のようなもの

  1. まずやることを業務順に箇条書きにする。
  2. 実行順番と実行者がわかりやすいようにアクティビティー図にする。
  3. のちにエンティティを抽出したあとER図を作成する。

エンティティの抽出

業務フローの中で扱われる実態のあるリソース(顧客・社員・商品など)やイベント(入荷、出荷、注文)を抽出する。またイベントの履歴(購買履歴、在庫履歴)のようなサマリー系といわれるデータも存在する。

エンティティの関連付け

わかりやすいように可視化する。一般にイベントエンティティの上にリソースエンティティを書いたほうがわかりやすい。

ここで1:nなどの関連付けを行う。

主キーの抽出を行う

インスタンスをユニークに識別する値のこと。

主キーの特徴

  • 値が不変
  • 桁数がなるべく短い
  • 複合した場合でも多くはならない(5つ以下)
  • 必ず存在する(NULLにならない)

一般的には複数の主キーを使う、複合主キーが多いため、いわゆるauto_incrementタイプの自動で附番されるidをサロゲートキー(代理キー)といい、これが使われるケースが多い。

できれば自然に存在しているデータで主キーを考え、やむを得ずコードやidなどを考えるべき。コードなどは自動採番などではなく意味を込めて作ることができれば望ましい。JANコードはそういうつくり。(理想論かもしれないが・・・)

複合主キーをそのまま使うか、あるいは複合主キー的なキーを作る(ようはJANコードの容量)ことも考慮に入れること。

またサロゲートキーは以下のようなメリットとデメリットを覚えておく必要がある。

サロゲートキーのメリット

  • 結合を使うSQLが比較的簡単になる
  • テーブル間の依存度が薄くなる(複合主キーの場合、もし増えると別のテーブルにも影響度がでる)
  • 3により比較的業務変更に強い
  • データを特定するのがカンタン(複合主キーは煩雑)

サロゲートキーのデメリット

  • 業務と無関係のキーが増える
  • 容量が増える

個人的には一般的なテーブルではサロゲートキーを使って、関連テーブルなどの中間テーブルはナチュラルキーなのかな。。と思ってます。

参考リンク

http://dbflute.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html

https://amg-solution.jp/blog/8980

http://qiita.com/jkr_2255/items/5a71ff5f8569c5e0f24d

http://mycode.snow69it.net/915/

-Database
-

執筆者:


comment

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

関連記事

no image

SQLの高速化について&explain

本日はSQLの高速化について。 高速化といってもさまざまなテクがあると思うのですが、代表的な考え方に関して。 Contents1 高速化に関して1.1 index1.2 ディスクアクセスを減らす1.3 …

no image

正規化について&EXTRACT

Contents1 正規化とは?2 第一正規化3 SQLネタ EXTRACT 正規化とは? 正確な定義は難しいですが、8割ぐらいあっている定義としては「適切なテーブルに分割すること」です。※ただし正確 …

no image

アンチパターン トランザクションスコープ+大量データのリアルタイム集計+接続が詰まる

本日は主にインフラの設計的なことに関して。 Contents1 トランザクションスコープの設定1.1 デメリット1.2 対策2 大量データのリアルタイム集計2.1 デメリット2.2 対策3 詰まると接 …

no image

SQLのチューニングに関して

ここ2か月ぐらいはSQLの本でがりがり勉強してきましたね。当然復習も必要かと思いますが、だいぶいろんなことを覚えたなあという気がします。 一番勉強になった本はもちろん「達人に学ぶ SQL徹底指南書」と …

no image

slow-query-logについて

データベースを伴う部分でののチューニングですが、大きく分けると SQLを書き直す インデックスを張りなおす プログラム内部でキャッシュを有効化する 設定ファイルの修正 上記のようなかんじになるのではな …