Upload
tomoyuki-obi
View
205
Download
1
Embed Size (px)
DESCRIPTION
2014/05/10 CLR/H in TOKYO #2 で利用したスライド(前半)
Citation preview
2014/05/10 CLR/H in TOKYO #2 VB Festival
データモデリング初歩
Ahf(小尾 智之)
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 みちのくプロレス
2014/05/10 CLR/H in TOKYO #2 VB Festival
https://www.facebook.com/grou
ps/175020096009440/
2014/05/10 CLR/H in TOKYO #2 VB Festival
agenda
1. データモデリングとは
2. 業務システム的データモデリング
3. SQL によるデータ操作
2014/05/10 CLR/H in TOKYO #2 VB Festival
データモデリングとは
• 情報を正しく保持するための設計
–情報の親子関係
–情報間の繋がり度合
• DBのテーブル設計も含まれる
• 論理的構造の設計から、物理的な
構造設計を行うのが基本の流れ
–設計後は論理と物理を互いに修正しあう
2014/05/10 CLR/H in TOKYO #2 VB Festival
Entity と Relation
• エンティティ≒情報
–エンティティ間の繋がり=リレーション
• これを図に表したものが ER 図
–論理ER図
• エンティティの設計
–物理ER図
• DB上での設計
2014/05/10 CLR/H in TOKYO #2 VB Festival
主キーと外部キー
• ある情報の塊においてデータを一意に
識別するための項目群=主キー
–適当な UniqueID 値を持つ項目を主キーと
する方法もよく使われる
• 別の塊との関係を表す項目群=外部キー
親となる側では主キーとなる
2014/05/10 CLR/H in TOKYO #2 VB Festival
多重度
• ある情報の塊とある情報の塊が
n:m
の関係となる場合の数値
• 親一人に子供数人、というケース
伝票ヘッダと明細とかが該当
• 1:0..1 は親が1に対して子は0または1
2014/05/10 CLR/H in TOKYO #2 VB Festival
制約
• テーブル間やテーブルのカラムに対して指定できる
• レコードが登録できる条件
カラムに値を設定できる条件
• 基本は子供側に
「親はこのテーブル」
という制約をかけたりする
2014/05/10 CLR/H in TOKYO #2 VB Festival
NULL
• 未設定を表す特殊な値
• システムによって利用するかどうか様々
• 未設定を識別できる必要があるかどうかでNULLを利用するかどうかを決める
2014/05/10 CLR/H in TOKYO #2 VB Festival
DEFAULT
• 項目の初期値
• 値を指定せずにレコード追加を
行った場合に適用される
• 数値系項目の初期値や、日付系項目に
システム日付を設定などで利用
2014/05/10 CLR/H in TOKYO #2 VB Festival
トリガ
• データを追加 / 更新 / 削除した際に
呼び出される処理
– DBによっては処理前 / 処理後のタイミングを指定できるものもある
– INSTEAD OF トリガを利用すると Enterprise
版ではない SQL Server でも更新可能なビューを定義できる
• レコードの更新日時などでよく利用
2014/05/10 CLR/H in TOKYO #2 VB Festival
正規化
• 情報の重複や n:m の関係をなくすことで
シンプルにデータを保持する構造
• 理屈上は正規化した方が早いが
必ずしもそうとは限らない
– DBが動作しているHWの性能が関連するので理屈通りとはいかない
– DB製品の仕組みにも依存する
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
セミナールームには座席がたくさんある
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
座席は場合によっては片づけられることも
あるので 0~n となる
座席
1
0..*
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
椅子も場合によっては片づけられることも
あるので 0~n となる 椅子は座席に対して設置されるので、親は座席となる
座席
1
0..*
1
0..* 椅子
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
この関係では、座席がなければ椅子は存在できない
座席
1
0..*
1
0..* 椅子
座席がなくても椅子を置くことがあった場合は?
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
座席 1
0..*
1
0..* 椅子
その場合はセミナールームに椅子を設置することになるので、親がセミナールームとなる
2014/05/10 CLR/H in TOKYO #2 VB Festival
モデリングの例
セミナールーム
座席 1 0..*
1
0..* 椅子
その状況でも座席に設置した椅子を関連付けるなら
間に座席と椅子を紐づける情報が必要
設置椅子
1 0..*
0..*
1
2014/05/10 CLR/H in TOKYO #2 VB Festival
業務的データモデリング
• データ志向アプローチ(DOA)
• 実際に存在するものをデータに定義
• 目に見えるものだけではなく見えない
ものをデータとすることもある
–履歴系の情報など
2014/05/10 CLR/H in TOKYO #2 VB Festival
実体からデータ化
• 実際に存在する情報を元に
テーブル構造を設計する方法
• 最低限必要なものを揃えやすい
• システムに必要な項目候補が見えやすい
2014/05/10 CLR/H in TOKYO #2 VB Festival
商品の画像 商品の名称
商品の価格
2014/05/10 CLR/H in TOKYO #2 VB Festival
商品の在庫数
予定配送日
2014/05/10 CLR/H in TOKYO #2 VB Festival
要件のデータ化
• 売り上げの履歴や在庫の変動など
「形に無いもの」もデータ化する
• どこまでをデータとして保持するか
どのような単位で保持するかは要件次第
–全ての状態を保持するのと
最新の状態を保持するのとでは
必要な形が異なる
2014/05/10 CLR/H in TOKYO #2 VB Festival
データの意味
• レコードとして存在する意味を定義
• レコードが集まるテーブルの意味を定義
–定義できる=レコードが存在するケース
• それぞれの意味を定義することで
処理の結果どうあるべきかの姿も決まる
2014/05/10 CLR/H in TOKYO #2 VB Festival
売上データ 売上が発生した
売掛データ 売上が発生したから売掛も発生した
粗利データ 売上が発生したから粗利も発生した
データ間のつながり
2014/05/10 CLR/H in TOKYO #2 VB Festival
カラムの意味
• レコードのカラムの定義
• 重複する値は原則持たない
• レコードの値から算出できるならば
結果を保持する必要は「薄い」
–アプリ要件として保持するケースはある
– SQL Server は計算列で自動計算も可能
2014/05/10 CLR/H in TOKYO #2 VB Festival
削除フラグ
• 業務系DBではよくある削除フラグ
• 手法自体は問題ない
–ただしインデックスに含ませるのは必須
• 削除したデータを保持する場合には
もっとも手軽な方法
2014/05/10 CLR/H in TOKYO #2 VB Festival
適用日時の持ち方
• データの種類によっては
「いつから適用されるか」
「いつまで適用されるか」
という日時範囲が必要になる
–消費税率とかが代表
–毎回抽出時に日付の範囲指定を記載するのは面倒なのでテーブル値関数化しておくと楽
(SQL Server)
2014/05/10 CLR/H in TOKYO #2 VB Festival
SQL
• データベースの情報を操作する言語
– SELECT(抽出)
– INSERT(追加)
– UPDATE(更新)
– DELETE(削除)
2014/05/10 CLR/H in TOKYO #2 VB Festival
SELECT
• 情報を取得するための命令
– SELECT 抽出するカラム、計算
FROM 抽出対象の情報(テーブルなど)
WHERE 抽出したものに対しての条件
• DISTINCT 指定で結果から重複を除去
2014/05/10 CLR/H in TOKYO #2 VB Festival
グルーピング集計
• GROUP BY で抽出結果のグルーピング集計
• 集計結果から一部を除外する場合は
WHERE ではなく HAVING で指定
• GROUP BY で指定するのはカラムだけ
ではなく計算結果も指定する事が多い
2014/05/10 CLR/H in TOKYO #2 VB Festival
CASE
• 抽出項目に対する条件判断
– CASE {条件} WHEN {分岐A} THEN {値A}
WHEN {分岐B} THEN {値B}
ELSE {値C} END
• 複数の CASE 文をネストさせて
利用も可能
2014/05/10 CLR/H in TOKYO #2 VB Festival
結合
• ある情報の塊と別の情報の塊を
結合して抽出を行う
– INNER JOIN:内部結合
– LEFT OUTER JOIN:左外部結合
• RIGHT OUTER JOIN:右外部結合
– CROSS JOIN:クロス結合
• WHERE 条件で結合条件を記載できるが
JOIN 句で記載するのが現在の標準
2014/05/10 CLR/H in TOKYO #2 VB Festival
内部結合
A B C
Aの塊とBの塊で共通している部分を抽出
TBL_A INNER JOIN TBL_B
2014/05/10 CLR/H in TOKYO #2 VB Festival
外部結合
A B C
Aの塊、およびAの塊とBの塊で共通している部分を抽出
TBL_A LEFT OUTER JOIN TBL_B
2014/05/10 CLR/H in TOKYO #2 VB Festival
クロス結合
A B C
Aの塊とBの塊、全ての組み合わせを抽出
TBL_A CROSS JOIN TBL_B
2014/05/10 CLR/H in TOKYO #2 VB Festival
EXISTS
• ある項目が、ある抽出結果に含まれているかどうかを判断
• WHERE節で
(ある項目) EXISTS (抽出結果)
として記述
2014/05/10 CLR/H in TOKYO #2 VB Festival
サブクエリ・インラインビュー
• クエリ結果を WHERE 条件や
SELECT 項目に組み込む方法
• SELECT の項目として組み込む場合は
単純に JOIN しては多重度の絡みで
難しいケースに適している
2014/05/10 CLR/H in TOKYO #2 VB Festival
INSERT
• データの追加を行う
• 対象カラムを指定した記述と
対象カラムを未指定な記述がある
–未指定の場合はテーブルのカラム全てに対して値を指定する必要がある
• SELECT した結果を INSERT もできる
2014/05/10 CLR/H in TOKYO #2 VB Festival
UPDATE
• データの変更を行う
• 内部的には DELETE → INSERT を
行っている DB が多い
• SELECT 結果に対して UPDATE もできる
2014/05/10 CLR/H in TOKYO #2 VB Festival
DELETE
• データの削除を行う
• SELECT 結果に対して DELETE もできる
2014/05/10 CLR/H in TOKYO #2 VB Festival
まとめ
• データ構造を理解する事と
システムの仕様を理解することは同じ
• プログラムを作成する際にも
データ構造は必要な知識
• データの意味を理解すると
処理結果としてどうあるべきかが見え
仕様上の問題も発見しやすくなる