clrh 20140510

43
2014/05/10 CLR/H in TOKYO #2 VB Festival データモデリング初歩 Ahf(小尾 智之)

Upload: tomoyuki-obi

Post on 19-Jun-2015

209 views

Category:

Technology


1 download

DESCRIPTION

2014/05/10 CLR/H in TOKYO #2 で利用したスライド(前半)

TRANSCRIPT

Page 1: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

データモデリング初歩

Ahf(小尾 智之)

Page 2: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

self introduction VB 使い

WF メイニア

CLR/H スタッフ

てすとぶろぐ http://blogahf.blogspot.jp/

@twit_ahf

Tomoyuki.Obi @IT エンジニアライフ

地方からの戯言

プロレス好き DDT / BJW / K-DOJO みちのくプロレス

Page 3: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

https://www.facebook.com/grou

ps/175020096009440/

Page 4: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

agenda

1. データモデリングとは

2. 業務システム的データモデリング

3. SQL によるデータ操作

Page 5: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

データモデリングとは

• 情報を正しく保持するための設計

–情報の親子関係

–情報間の繋がり度合

• DBのテーブル設計も含まれる

• 論理的構造の設計から、物理的な

構造設計を行うのが基本の流れ

–設計後は論理と物理を互いに修正しあう

Page 6: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

Entity と Relation

• エンティティ≒情報

–エンティティ間の繋がり=リレーション

• これを図に表したものが ER 図

–論理ER図

• エンティティの設計

–物理ER図

• DB上での設計

Page 7: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

主キーと外部キー

• ある情報の塊においてデータを一意に

識別するための項目群=主キー

–適当な UniqueID 値を持つ項目を主キーと

する方法もよく使われる

• 別の塊との関係を表す項目群=外部キー

親となる側では主キーとなる

Page 8: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

多重度

• ある情報の塊とある情報の塊が

n:m

の関係となる場合の数値

• 親一人に子供数人、というケース

伝票ヘッダと明細とかが該当

• 1:0..1 は親が1に対して子は0または1

Page 9: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

制約

• テーブル間やテーブルのカラムに対して指定できる

• レコードが登録できる条件

カラムに値を設定できる条件

• 基本は子供側に

「親はこのテーブル」

という制約をかけたりする

Page 10: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

NULL

• 未設定を表す特殊な値

• システムによって利用するかどうか様々

• 未設定を識別できる必要があるかどうかでNULLを利用するかどうかを決める

Page 11: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

DEFAULT

• 項目の初期値

• 値を指定せずにレコード追加を

行った場合に適用される

• 数値系項目の初期値や、日付系項目に

システム日付を設定などで利用

Page 12: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

トリガ

• データを追加 / 更新 / 削除した際に

呼び出される処理

– DBによっては処理前 / 処理後のタイミングを指定できるものもある

– INSTEAD OF トリガを利用すると Enterprise

版ではない SQL Server でも更新可能なビューを定義できる

• レコードの更新日時などでよく利用

Page 13: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

正規化

• 情報の重複や n:m の関係をなくすことで

シンプルにデータを保持する構造

• 理屈上は正規化した方が早いが

必ずしもそうとは限らない

– DBが動作しているHWの性能が関連するので理屈通りとはいかない

– DB製品の仕組みにも依存する

Page 14: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

セミナールームには座席がたくさんある

Page 15: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

座席は場合によっては片づけられることも

あるので 0~n となる

座席

0..*

Page 16: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

椅子も場合によっては片づけられることも

あるので 0~n となる 椅子は座席に対して設置されるので、親は座席となる

座席

0..*

0..* 椅子

Page 17: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

この関係では、座席がなければ椅子は存在できない

座席

0..*

0..* 椅子

座席がなくても椅子を置くことがあった場合は?

Page 18: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

座席 1

0..*

0..* 椅子

その場合はセミナールームに椅子を設置することになるので、親がセミナールームとなる

Page 19: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

モデリングの例

セミナールーム

座席 1 0..*

0..* 椅子

その状況でも座席に設置した椅子を関連付けるなら

間に座席と椅子を紐づける情報が必要

設置椅子

1 0..*

0..*

Page 20: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

業務的データモデリング

• データ志向アプローチ(DOA)

• 実際に存在するものをデータに定義

• 目に見えるものだけではなく見えない

ものをデータとすることもある

–履歴系の情報など

Page 21: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

実体からデータ化

• 実際に存在する情報を元に

テーブル構造を設計する方法

• 最低限必要なものを揃えやすい

• システムに必要な項目候補が見えやすい

Page 22: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

商品の画像 商品の名称

商品の価格

Page 23: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

商品の在庫数

予定配送日

Page 24: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

要件のデータ化

• 売り上げの履歴や在庫の変動など

「形に無いもの」もデータ化する

• どこまでをデータとして保持するか

どのような単位で保持するかは要件次第

–全ての状態を保持するのと

最新の状態を保持するのとでは

必要な形が異なる

Page 25: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

データの意味

• レコードとして存在する意味を定義

• レコードが集まるテーブルの意味を定義

–定義できる=レコードが存在するケース

• それぞれの意味を定義することで

処理の結果どうあるべきかの姿も決まる

Page 26: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

売上データ 売上が発生した

売掛データ 売上が発生したから売掛も発生した

粗利データ 売上が発生したから粗利も発生した

データ間のつながり

Page 27: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

カラムの意味

• レコードのカラムの定義

• 重複する値は原則持たない

• レコードの値から算出できるならば

結果を保持する必要は「薄い」

–アプリ要件として保持するケースはある

– SQL Server は計算列で自動計算も可能

Page 28: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

削除フラグ

• 業務系DBではよくある削除フラグ

• 手法自体は問題ない

–ただしインデックスに含ませるのは必須

• 削除したデータを保持する場合には

もっとも手軽な方法

Page 29: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

適用日時の持ち方

• データの種類によっては

「いつから適用されるか」

「いつまで適用されるか」

という日時範囲が必要になる

–消費税率とかが代表

–毎回抽出時に日付の範囲指定を記載するのは面倒なのでテーブル値関数化しておくと楽

(SQL Server)

Page 30: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

SQL

• データベースの情報を操作する言語

– SELECT(抽出)

– INSERT(追加)

– UPDATE(更新)

– DELETE(削除)

Page 31: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

SELECT

• 情報を取得するための命令

– SELECT 抽出するカラム、計算

FROM 抽出対象の情報(テーブルなど)

WHERE 抽出したものに対しての条件

• DISTINCT 指定で結果から重複を除去

Page 32: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

グルーピング集計

• GROUP BY で抽出結果のグルーピング集計

• 集計結果から一部を除外する場合は

WHERE ではなく HAVING で指定

• GROUP BY で指定するのはカラムだけ

ではなく計算結果も指定する事が多い

Page 33: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

CASE

• 抽出項目に対する条件判断

– CASE {条件} WHEN {分岐A} THEN {値A}

WHEN {分岐B} THEN {値B}

ELSE {値C} END

• 複数の CASE 文をネストさせて

利用も可能

Page 34: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

結合

• ある情報の塊と別の情報の塊を

結合して抽出を行う

– INNER JOIN:内部結合

– LEFT OUTER JOIN:左外部結合

• RIGHT OUTER JOIN:右外部結合

– CROSS JOIN:クロス結合

• WHERE 条件で結合条件を記載できるが

JOIN 句で記載するのが現在の標準

Page 35: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

内部結合

A B C

Aの塊とBの塊で共通している部分を抽出

TBL_A INNER JOIN TBL_B

Page 36: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

外部結合

A B C

Aの塊、およびAの塊とBの塊で共通している部分を抽出

TBL_A LEFT OUTER JOIN TBL_B

Page 37: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

クロス結合

A B C

Aの塊とBの塊、全ての組み合わせを抽出

TBL_A CROSS JOIN TBL_B

Page 38: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

EXISTS

• ある項目が、ある抽出結果に含まれているかどうかを判断

• WHERE節で

(ある項目) EXISTS (抽出結果)

として記述

Page 39: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

サブクエリ・インラインビュー

• クエリ結果を WHERE 条件や

SELECT 項目に組み込む方法

• SELECT の項目として組み込む場合は

単純に JOIN しては多重度の絡みで

難しいケースに適している

Page 40: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

INSERT

• データの追加を行う

• 対象カラムを指定した記述と

対象カラムを未指定な記述がある

–未指定の場合はテーブルのカラム全てに対して値を指定する必要がある

• SELECT した結果を INSERT もできる

Page 41: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

UPDATE

• データの変更を行う

• 内部的には DELETE → INSERT を

行っている DB が多い

• SELECT 結果に対して UPDATE もできる

Page 42: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

DELETE

• データの削除を行う

• SELECT 結果に対して DELETE もできる

Page 43: Clrh 20140510

2014/05/10 CLR/H in TOKYO #2 VB Festival

まとめ

• データ構造を理解する事と

システムの仕様を理解することは同じ

• プログラムを作成する際にも

データ構造は必要な知識

• データの意味を理解すると

処理結果としてどうあるべきかが見え

仕様上の問題も発見しやすくなる