Movatterモバイル変換


[0]ホーム

URL:


Mikiya Okuno, profile picture
Uploaded byMikiya Okuno
115,415 views

データベース設計徹底指南

DBエンジニアのための技術勉強会(第3回)で使用した資料です。主にリレーショナルモデルと正規化について解説しています。リレーショナルモデルの限界について正しく認識してこそ、リレーショナルモデルを理解したと言えると思います。

Embed presentation

Downloaded 826 times
データベース設計徹底指南!!@ 第3回 DB エンジニアのための技術勉強会奥野 幹也Twitter: @nippondanjimikiya (dot) okuno (at) gmail (dot) com
免責事項●本プレゼンテーションにおいて示されている見解は、私自身の見解であって、オラクル・コーポレーションの見解を必ずしも反映したものではありません。ご了承ください。
自己紹介●MySQL サポートエンジニア–日々のしごと●●●●ライフワーク–自由なソフトウェアの普及●●トラブルシューティング全般Q&A 回答パフォーマンスチューニングなどオープンソースではない今日は個人として参加しています。ブログ––漢のコンピュータ道http://nippondanji.blogspot.com/
みなさん、正しい DB 設計をしていますか?
正しいデータ型を使う〜 カラムの場合 〜●整数–●実数–●NUMBER, DECIMAL文字列–●FLOAT, DOUBLE固定小数点–●INT, BIGINTVARCHAR, CHARバイナリ–BLOB
正しいデータ型を使う〜 配列の操作の場合 〜a = Array.new# 要素の挿入a.push(' 要素 ')# N 番目の要素a[N]a = ''# 要素の挿入a = a << (a.size == 0 ? ' 要素 ' : ', 要素 '# N 番目の要素n = 0s = ''a.each_char do |c|if c == ','return s if n == Nn += 1s = ''elses << cendendreturn s if n == N
正しいデータ型を使う〜 配列の操作の場合 〜a = Array.new# 要素の挿入a.push(' 要素 ')# N 番目の要素a[N]a = ''# 要素の挿入a = a << (a.size == 0 ? ' 要素 ' : ', 要素 '# N 番目の要素n = 0s = ''a.each_char do |c|if c == ','return s if n == Nn += 1s = ''elses << cendendreturn s if n == N
正しいデータ型を使う〜 テーブルの場合 〜●演算のためのデータ型–テーブル●●カラムのデータ型だけではない!!演算–クエリ( SELECT, INSERT, UPDATE, DELETE... )テーブルを正しく定義しないとまともなクエリは書けない!!
正しくない DB 設計のままクエリを書くと・・・●●●●遅いSQL 文が無駄に長いJOIN やサブクエリ、 UNION などが異常に多い検索条件が複雑怪奇––●●OR が多数出現するなどLIKE 句による中間一致難解であるロジックが間違っている
DB 設計の欠陥は技術的負債になる●データベースはリファクタリングが難しい–変更による影響が大きい●●●––DDL に時間がかかるアプリケーションの修正箇所多数工数がかかる方法が分からない負債が溜まりすぎて首が回らない放置された負債がさらに足かせに!!
技術的負債がたまる原因●データモデルに対する無理解–リレーショナルモデルを知らない●●–結果、セオリーを無視したデータベース設計に●●テーブルをただのデータの入れ物として使う文化正規化をしない→ クエリはスパゲティにリレーショナルモデルを知らなくても RDBMS は便利––インデックスを用いた高速なアクセストランザクションによる処理の簡素化
技術的負債が蓄積すると●技術的負債は開発を難しくする–––検索の要件が難解テスト項目が増える負債がたまるほどリファクタリングが困難に負債は雪だるま式に増える!!!
RDBMS を使いこなすには●●負債をためない!データベース設計をしっかり!データモデルは超重要!!
RDBMS におけるデータモデルリレーショナルモデル!!
リレーショナルモデルとは。
クイズ 1リレーショナルモデルにおけるリレーションとは、テーブル間のリレーションシップのことである?○ ×
リレーションとは●ある物事に対する事実の集合テーブル≒リレーション
集合の性質●●重複がないNULL がない–●実際に存在する値のみ要素間に順序がない–例え数値でも。米国ベトナム日本オーストラリアスウェーデンカメルーン
リレーションの構成部品●●リレーション=見出し(ヘッダ)+本体(ボディ)見出し(ヘッダ、 headding )––●属性(アトリビュート)–●–属性で定義された型を持つ値≒ 列(カラム)組(タプル)––●名前と型(タイプ)属性値–●属性の集合集合なので順序はない見出しに対応した属性値の集合≒ 行(ロー)本体(ボディ)–組(タプル)の集合
リレーションのイメージ見出し国名 / 文字列国番号 / 整数地域 / 文字列本体国番号: 86,国名:中華人民共和国 ,地域:アジア国番号: 61,国名:オーストラリア ,地域:オセアニア国名:日本 ,国番号: 81,地域:アジア国名:米国 ,国番号: 1,地域:北米地域:アフリカ ,国名:カメルーン ,国番号: 237地域:欧州 ,国名:スウェーデン ,国番号: 46
SQL との対応リレーショナルモデルSQL関係(リレーション)テーブル属性値(アトリビュート) カラム組(タプル)行対応する概念だが性質は異なる。
クイズ 2リレーションは2次元的な構造を持つ?○ ×
リレーションの実体●●●n 個のアトリビュートを持つリレーションは、 n 次元空間にプロットされた点(のようなもの)の集合タプル = 点2次元に見えるのは縦横の軸がある表として表現するから––紙に描かれた絵は2次元になる絵が表すものが2次元だとは限らない●風景や人物などはすべて3次元
データ型=ドメイン●属性が取りうる値の有限集合–––●無限でないのはコンピュータで扱う値だから32 ビット整数なら 232 通りデータサイズが増えれば表現できる要素数は増えるけど、絶対に無限にはならないドメインの要素の性質–要素はコンピュータで表現できるものなら何でも可●–ベクトル、行列、配列、リレーションそのものなどただしポインタと NULL は NG
リレーションの演算
リレーションの演算●演算の入力も結果もリレーション––●n 個のリレーションの演算の結果、 1 個のリレーションが返る整数と整数の足し算の結果が整数なのと同じ集合操作に基づく演算–和、差、直積、射影、制限、結合 etc
リレーションのイメージ(再掲)見出し国名 / 文字列国番号 / 整数地域 / 文字列本体国番号: 86,国名:中華人民共和国 ,地域:アジア国番号: 61,国名:オーストラリア ,地域:オセアニア国名:日本 ,国番号: 81,地域:アジア国名:米国 ,国番号: 1,地域:北米地域:アフリカ ,国名:カメルーン ,国番号: 237地域:欧州 ,国名:スウェーデン ,国番号: 46
制限( RESTRICT )
制限( RESTRICT )
射影( PROJECT )
射影( PROJECT )
属性名変更( RENAME )国名 / 文字列国番号 / 整数大陸 / 文字列
属性名変更( RENAME )国名 / 文字列国番号 / 整数地域 / 文字列
拡張( EXTEND )国名 / 文字列人口 / 整数面積 /Decimal (km2)
拡張( EXTEND )国名 / 文字列人口 / 整数人口密度 /Decimal ( 人 /km2)面積 /Decimal (km2)
和( UNION )
和( UNION )
積( INTERSECT )
積( INTERSECT )
差( DIFFERENCE )
差( DIFFERENCE )
直積( PRODUCT )abxycdz
直積( PRODUCT )abxabyabzcdxcdycdz
結合( JOIN )axw1byx2czy3
結合( JOIN )bx2cy3
豆知識●直積( Product )と積( Intersect )はいずれも結合( Join) の特殊なケース––●直積・・・共通する属性がひとつも存在しないケース積・・・すべての属性がまったく同じケースリレーショナルモデルに存在する Join は Inner Join だけ
Outer Join の意味●Outer Join (LEFT JOIN または RIGHT JOIN )はプリミティブな演算ではない。–●他の演算で置き換え可能Outer Join は UNION 相当–(Inner Join) ∪ ( 駆動表にマッチしないものの集合 )
リレーションの演算は分かったけどSQL とどう関係あるの?
SELECT の実態SELECTFROMWHEREselect_listtable_referencewhere_condition
SELECT の実態= 3 つの集合演算SELECT射影FROM直積WHERE制限
クイズ 3次の SELECT は正しく実行されるか?SELECTweight / POWER(height, 2) AS bmiFROMbody_shapesWHEREbmi > 25○ ×
SELECT の評価順序SELECT3 射影FROM1 直積WHERE2 制限
その他の操作●和( UNION )–●SELECT … UNION DISTINCT SELECT …差( DIFFERENCE )––SELECT … MINUS SELECT …SELECT … WHERE NOT EXISTS (SELECT …) …
リレーションの正規化
クイズ 4テーブルに主キーがあれば正規化は完了している。○ ×
なぜ正規化が必要なのか●データベースの論理的整合性を保つ––●「論理的」な正しさを保証する→ 論理演算によって「正しい」結果が得られる= 矛盾を防ぐ–集合(リレーション)に含まれる命題に矛盾がない
論理的に矛盾しているデータは、どちらが正しいかいくら考えても分からない!!
論理的に矛盾しているデータは、どちらが正しいかいくら考えても分からない!!正しい答えが得られないデータベースは無価値!!
論理的に矛盾しているデータは、どちらが正しいかいくら考えても分からない!!正しい答えが得られないデータベースは無価値!!矛盾をなくすための定石それが正規化!!
データの”論理的”整合性論理的な不整合とは?名前格闘スタイル年齢範馬刃牙総合格闘技19範馬勇次郎総合格闘技38愚地独歩空手57ビスケットオリバ怪力40ビスケットオリバ柔道42花山薫素手喧嘩19烈海王中国拳法30烈海王ボクシング30不整合 = 矛盾どっちが正しい?
正規化理論●リレーションから重複を排除するためのデータベース設計理論–●重複は矛盾の原因になる第一正規形( 1NF )〜第六正規形( 6NF )–––より高次の正規形のほうが重複が少ない(望ましい)状態になる。3NF と 4NF の間に BCNF というものがある。超重要。ただし最終目標は 5NF
用語 1●命題––●述語––●命題の中の固有名詞をパラメータ化したもの例) x は犬である命題関数– 述語から意味を取り除いて関数化したもの。値を代入した場合の評価結果は述語と同じ。–●ある物事について記述した文章で、その意味が正しいかどうか、つまり真なのか偽なのかを問えるもののこと例)ポチは犬である例) F(x)閉世界仮説–リレーションは事実の集合●––事実=真となる命題リレーションに含まれる組の属性値を代入 → 真それ以外の属性値を代入 → すべて偽
1NF●要件:テーブルがリレーションであること。1.行が上から下に順序付けされていない。2.列が左から右に順序付けされていない。3.重複する行は存在しない。4.それぞれの行と列の交差点(つまり列の値)は、ドメイン(データ型)に属する要素の値をちょうどひとつだけ含んでいる。5.全ての列の値は定義されたものだけであり、かつそれぞれの行において常に存在する。
繰り返しグループ名前格闘スタイル範馬刃牙総合格闘技範馬勇次郎総合格闘技愚地独歩空手ビスケットオリバ怪力花山薫素手喧嘩海王烈中国拳法同じ性質のものが繰り返し出現カラム追加名前格闘スタイル 1格闘スタイル 2範馬刃牙総合格闘技NULL範馬勇次郎総合格闘技NULL愚地独歩空手NULLビスケットオリバ怪力柔道花山薫素手喧嘩NULL海王烈中国拳法ボクシング
アトミックな属性それ以上分解できないような属性名前格闘スタイル範馬刃牙総合格闘技範馬勇次郎総合格闘技愚地独歩空手ビスケットオリバ怪力柔道花山薫素手喧嘩海王烈中国拳法ボクシング2つ入ってるので分解可能※ 属性の中に繰り返しグループがある。
データ型=ドメイン●属性の値は、ドメインという有限集合に含まれる要素の「ひとつ」––集合の要素は分解できない=アトミック属性がアトミックかどうかを判断するにはドメインを意識する。
NG !!こんな設計にはご用心●●主キーの”一部”に意味を持たせる例:基礎年金番号–1234-567890事務所の ID●個人の ID問題点––アトミックでない値の一部に依存した処理●SELECT … WHERE ID LIKE '1234-%' AND …
1NF の例名前格闘スタイル範馬刃牙総合格闘技範馬勇次郎総合格闘技愚地独歩空手ビスケットオリバ 怪力ビスケットオリバ 柔道花山薫素手喧嘩海王烈中国拳法海王烈ボクシング繰り返しグループなし●重複なし●NULL なし●
用語 2●候補キーとスーパーキー––あるリレーションにおいて、タプルの値を一意に決めることができる属性の集合で、規約のもの(それ以上要素を減らすことができないもの)を候補キーという候補キーのスーパーセット、つまり余分な属性を含んだものをスーパーキーという●●すべての属性を含む集合は常にスーパーキー関数従属性( Functional Dependency - FD )––あるリレーション R の見出しの 2 つの部分集合を A 、 Bとする。 R の要素の全てのタプルにおいて、 A の値が同じならば B の値も同じである場合かつその場合だけに限り、 B は A に関数従属すると言い、 A → B と記述する。スーパーキー → 任意の属性の集合●自明な FD
2NF候補キーの真部分集合(それ自身は含まないもの)から非キー属性への FD を取り除いた状態。候補キー非キー属性タプル・・・FD
2NF でないリレーションの例候補キー図に描くときはアンダーラインをひく名前格闘スタイル年齢範馬刃牙総合格闘技19範馬勇次郎総合格闘技38愚地独歩空手57ビスケットオリバ怪力40ビスケットオリバ柔道40花山薫素手喧嘩19烈海王中国拳法30烈海王ボクシング30FD名前が同じなら年齢は常に同じ
FD を解消する●無損失分解する–必要な操作は射影●–SELECT DISTINCT{ 名前 , 格闘スタイル , 年齢 }●●●FD: 名前 → 年齢FD を含む属性の射影 +FD の非キー属性(この場合は年齢)を取り除いた属性の射影{ 名前 , 年齢 },{ 名前 , 格闘スタイル }
2NF の例名前格闘スタイル名前年齢範馬刃牙総合格闘技範馬刃牙19範馬勇次郎総合格闘技範馬勇次郎38愚地独歩空手愚地独歩57ビスケットオリバ怪力ビスケットオリバ40ビスケットオリバ柔道花山薫19花山薫素手喧嘩烈海王30烈海王中国拳法烈海王ボクシング
クイズ 5あまりに正規化し過ぎるとテーブルが増え過ぎるので問題である。○ ×
テーブルが増えても問題ない !!テーブルを減らそうと誤った DB 設計になるほうが問題
3NF非キー属性同士の FD を解消した状態。候補キー非キー属性タプル・・・FD
2NF であって 3NF でない例名前格闘スタイル寝技範馬刃牙総合格闘技Yes範馬勇次郎総合格闘技Yes愚地独歩空手Noビスケットオリバ怪力No花山薫素手喧嘩Yes烈海王中国拳法No
BCNFボイス・コッド正規形の略。すべての自明でない FD が取り除かれた状態。残る FD は、非キー属性から候補キーの真部分集合への FD 。候補キー非キー属性タプル・・・FD
3NF であって BCNF でない例名前格闘スタイル流派松尾象山空手北辰館姫川勉空手北辰館丹波文七柔術竹宮流丹波文七空手丹波流長田弘プロレスFAW長田弘柔術竹宮流藤巻十三柔術竹宮流
FD のおさらい候補キー非キー属性タプル・・・FD候補キー非キー属性タプル・・・FD候補キー非キー属性タプル・・・FD
候補キー内部には FD がない●もし仮に候補キーに FD があると・・・–––{A,B} が候補キーA→BB の値は A によって決まる●規約ではない!
用語 3●結合従属性( Join Dependencies - JD )––●Join すると元に戻るような無損失分解A,B,...,C をリレーション R の見出しの部分集合であるとする。もし A,B,...,C に対応するリレーションを結合した結果と R が同じ場合かつその場合に限り、 R は以下の JDを満たすという。☆{A,B,...,C}自明な JD–複数の非キー属性があるリレーションにおいて、それぞれ候補キーを含んだ複数の異なるリレーションに無損失分解できるような JD 。
自明な JD名前年齢国籍範馬刃牙19Japan範馬勇次郎38Japan愚地独歩57Japanビスケットオリバ40U.S.A.花山薫19Japan名前年齢名前国籍範馬刃牙19範馬刃牙Japan範馬勇次郎38範馬勇次郎Japan愚地独歩57愚地独歩Japanビスケットオリバ40ビスケットオリバU.S.A.花山薫19花山薫Japan
4NF/5NF のヒント●非キー属性がある BCNF に自明でない JD はない–何故ならば、候補キーがバラバラになるような射影をとると FD が消失してしまう。●●–●FD: 候補キー → 非キー属性無損失ができない!!非キー属性のある BCNF は自動的に 5NF になる。4NF/5NF––非キー属性がないリレーションのみが対象自明でない JD がある場合に無損失分解
自明でない JD の本質●自明でない JD のあるリレーションとは、複数の「非キー属性がないリレーション」を JOIN したリレーション––= 「見出し全体が候補キーであるようなリレーション」JOIN する前のリレーション同士は対等な関係性●●●FD のような方向性はない発見は難しい非キー属性がない場合だけ考えれば良い
一般的な 4NF の解説一般的には多値従属性( MVD )を取り除いたものという解説がなされているが、MVD は JD の特殊なパターン。
4NF共通の属性を含む 2 つのリレーションに無損失分解可能な JD を解消した状態☆{AB,AC}
BCNF であって 4NF でない例名前格闘スタイル戦歴松尾象山空手試合松尾象山空手道場破り松尾象山空手喧嘩丹波文七空手試合丹波文七空手喧嘩丹波文七空手路上丹波文七柔術試合丹波文七柔術喧嘩丹波文七柔術路上長田弘プロレス試合長田弘プロレス道場破り長田弘柔術試合長田弘柔術道場破り☆{{ 名前 , 格闘スタイル },{ 名前 , 戦歴 }}
5NF全ての自明でない JD が取り除かれた状態。3 つ以上のリレーションに無損失分解可能なJD を解消した状態。最終目標地点。
実は 5NF です。名前格闘スタイル名前年齢範馬刃牙総合格闘技範馬刃牙19範馬勇次郎総合格闘技範馬勇次郎38愚地独歩空手愚地独歩57ビスケットオリバ怪力ビスケットオリバ40ビスケットオリバ柔道花山薫19花山薫素手喧嘩烈海王30烈海王中国拳法烈海王ボクシング
4NF であって 5NF でない例nameartmatch丹波文七虎王FAW マッチ丹波文七ハイキックFAW マッチ丹波文七ストレートFAW マッチ丹波文七ストレート道場破り丹波文七ハイキック道場破り長田弘バックドロップ北心館トーナメント長田弘虎王北心館トーナメント長田弘ストレート北心館トーナメント長田弘ボディスラム道場破り長田弘脇がため道場破り長田弘ストレート道場破り
6NF自明なものを含めてすべての JD を取り除く。非キー属性は最大でひとつ。正規化をする上ではあまり意味はない。
自明な JD (再掲)名前年齢国籍範馬刃牙19Japan範馬勇次郎38Japan愚地独歩57Japanビスケットオリバ40U.S.A.花山薫19Japan名前年齢名前国籍範馬刃牙19範馬刃牙Japan範馬勇次郎38範馬勇次郎Japan愚地独歩57愚地独歩Japanビスケットオリバ40ビスケットオリバU.S.A.花山薫19花山薫Japan
リレーションの直交性●●正規化は個々のリレーションの内部の重複をテーマにしたものリレーション同士の重複に焦点を当てたのが直交性
用語 4●直交したリレーションとは、互いに重複したタプルを含まないものを指す。––直交していないと片方だけを更新することで不整合が生じる見出しが同じ型のタプルは単に重複がなければ OK
見出しが異なる場合には単純に比較できない!!
直交性を確認する●●6NF まで分解して比較する重複があればデータベース設計を見なおそう–リレーションの統合と再編
直交していないリレーションの例nameagenationality範馬刃牙19日本範馬勇次郎38無国籍愚地独歩57日本ビスケットオリバ40アメリカ花山薫20日本烈海王30中国namefighting_styleage範馬刃牙総合格闘技19愚地克己空手21ジャック・ハンマー総合格闘技21渋川剛気柔術60愚地独歩空手57鎬昂昇空手25本部以蔵柔術59
6NF に分解nameagenamenationality範馬刃牙19範馬刃牙日本範馬勇次郎38範馬勇次郎無国籍愚地独歩57愚地独歩日本ビスケットオリバ40ビスケットオリバアメリカ花山薫20花山薫日本烈海王30烈海王中国nameagenamefighting_style範馬刃牙19範馬刃牙総合格闘技愚地克己21愚地克己空手ジャック・ハンマー21ジャック・ハンマー総合格闘技渋川剛気60渋川剛気柔術愚地独歩57愚地独歩空手鎬昂昇25鎬昂昇空手本部以蔵59本部以蔵柔術
共通の属性をまとめるnameagenamenationality範馬刃牙19範馬刃牙日本範馬勇次郎38範馬勇次郎無国籍愚地独歩57愚地独歩日本ビスケットオリバ40ビスケットオリバアメリカ花山薫20花山薫日本烈海王30烈海王中国愚地克己21ジャック・ハンマー21namefighting_style渋川剛気60範馬刃牙総合格闘技鎬昂昇25愚地克己空手本部以蔵59ジャック・ハンマー総合格闘技渋川剛気柔術愚地独歩空手鎬昂昇空手本部以蔵柔術
リレーショナルモデルの限界
リレーショナルモデルの外側の世界●現実世界––––●リレーショナルモデルの範疇とそれ以外が入り乱れている。境界線を見極めることが重要。リレーショナルモデルで解決できる部分はリレーショナルモデルを適用すべし!!リレーショナルモデル以外の領域は創意工夫が必要リレーショナルモデル≒ SQL––SQL はリレーショナルモデル以外の分野も扱えるSQL なら何とかできるものがある●●非常に容易なものもある例) GROUP BY, ORDER BY
リレーショナルモデルでは扱いが難しいテーマ●●●●●●●●●グラフの探索ツリーの探索行列履歴データ全文検索正規表現ソート集計空間データ
リレーショナルモデルでは扱いが難しいテーマ●●●●●●●●●グラフの探索ツリーの探索行列履歴データ全文検索正規表現ソート集計空間データ
グラフ●グラフとは–ノード(頂点)をエッジ(辺)でつないだ構造を持つモデルbdエッジ多重辺ノードaceループ
様々なグラフ単純グラフ非連結グラフ完全グラフ重み付きグラフe7858b33ca9d3f48
グラフを表現した例●グラフ = ノードの集合 + エッジの集合NodesEdgesNodeNode1Node2 Weightaab3bae8cbc3dbd8be7cd4cf8de5df3ef9ef
グラフに対するクエリの問題点●グラフ特有の問題を表現できない–––●何度 JOIN すれば良いのか事前に分からない––●連結グラフかどうか閉路があるかどうか最短距離はどれかグラフを辿ることで得た値によって決まるJOIN を何度するかで、 SQL の構文が異なる解決策––ストアドプロシージャグラフデータベース
ツリーとは●次の条件を満たすグラフのこと––––閉路がなく連結しているすべてのエッジはブリッジである任意の 2 つのノードを結ぶパスはただひとつだけである隣接していないどの 2 つのノードを結んでも閉路ができるebicgafhd
よく扱うツリーの特徴●●●●親子関係がある有向グラフであるあるノードへ向かうエッジはひとつのみ全てのノードの出発点になるノードがある(根あるいはroot )a根からの距離が深さとして表される–階層構造になっているbecfdgh
ツリーの表現方法●●ツリーは特殊なグラフ多数の制約がある–●表現の自由度が下がる一方、扱いは簡単になる代表的なモデル––––隣接リストモデルパス列挙モデル入れ子集合モデルクロージャテーブルモデル
隣接リストモデル●一般グラフと同じように隣接リストを使って表現する––●子ノードが親ノードの ID を持つ根ノードの親は NULL再帰クエリあるいはストアドプロシージャnode_idQ: f の深さはいくつか?WITH RECURSIVE r AS (SELECT 1 AS level, node_id, parent_idFROM TreeWHERE parent_id IS NULLUNION ALLSELECT r.level + 1, t.node_id, t.parent_idFROM r JOIN Tree tON r.node_id = t.parent_id)SELECT * FROM r WHERE node_id = 'f';parent_idaNULLbacadaebfbgchg
パス列挙モデル●根ノードからのフルパスで経路を表現するモデル–––LIKE 句で検索深さを求めるのは超簡単非正規化されたデータそのものnode_idpathQ: b の子孫をすべて挙げよa/aSELECT * FROM Tree WHERE pathLIKE CONCAT((SELECT path FROM TreeWHERE node_id='b'), '%');b/a/bc/a/cd/a/de/a/b/ef/a/b/fg/a/c/gh/a/c/g/h
入れ子集合モデル●●ノードごとに lft 、 rgt という 2 つの数値を使って、ノードの包含関係を表現するモデル親ノードは全ての子ノードを含んでいるabecgfhd
入れ子集合モデルlft と rgt による表現10321465ef97hg8b111213 14c15d16aQ: b の子孫をすべて挙げよSELECT t1.node_id FROM Tree t1 JOIN Tree t2WHERE t2.node_id = 'b'AND t1.lft BETWEEN t2.lft AND t2.rgtnode_idlftrgta116b27c813d1415e34f56g912h1011
クロージャーテーブルモデル●祖先、子孫の関係にあるノードをすべてリストアップ–テーブルサイズは大更新は容易Q: c の子孫をすべて挙げよSELECT descendant FROM TreeWHERE ancestor = 'c'ancestordescendantaba–cadaeafagahbebfcgchgh
どのモデルを使えば良いのか●残念ながら決定版はない!!––●なぜなら根本的にツリーとリレーショナルモデルは相容れないからどのモデルも妥協案に過ぎない要件次第で使い分けるべき–データサイズを気にしなければクロージャテーブル●●–ツリーの形状から分かる「事実」を列挙したもの「事実の集合←→ツリー」の変換はアプリケーションの役割コンパクトさを重視するなら隣接リストモデル●再帰クエリ( WITH RECURSIVE )が使えるならクエリも表現しやすい
履歴データ●●履歴データ ≒ 時系列で並んだデータ実はリレーショナルモデルで扱うのは難しい(例)ショッピングサイトの価格リストitempricestart_dateend_date100002010-01-019999-12-31グリッパー40002012-04-012013-03-31グリッパー50002013-04-019999-12-31懸垂マシン180002010-01-012011-12-31懸垂マシン200002012-01-012013-12-31懸垂マシン220002014-01-019999-12-31ダンベルセット※2013/11/28 現在
履歴データの問題点 1時間軸との直交性●リレーションとはある時点での事実の集合––●変数の中身と同じように、刻々と関係変数( Relvar )の内容は刻々と変化するある時点において事実はひとつ履歴データは時間軸と直交していない!–時刻が変わればクエリの結果が変わる(例)懸垂マシンの価格を調べるクエリSELECT priceFROM price_listWHERE item = ' 懸垂マシン 'AND NOW() BETWEEN start_dateAND end_date
履歴データの問題点 2行の意味が異なる●リレーションとは事実(=真となる命題)の集合–リレーションには命題関数がある●●●命題関数に各属性の値を代入した結果=真命題関数の意味はすべて共通特定の行だけ(隠れた)特別な意味がある!!––現在有効な価格現在有効でない価格
行によって特別な意味があるitempricestart_dateend_date100002010-01-019999-12-31グリッパー40002012-04-012013-03-31グリッパー50002013-04-019999-12-31懸垂マシン180002010-01-012011-12-31懸垂マシン200002012-01-012013-12-31懸垂マシン220002014-01-019999-12-31ダンベルセットこのテーブルは・・・過去の価格 ∪ 現在の価格 ∪ 未来の価格→ そのままでは扱いにくい有効な価格無効な価格
履歴データ対策 1テーブルを分割する●意味の異なるリレーションに分ける––●意味の違いが解消日付はあるものの、クエリの結果には影響を与えない元のテーブルは UNION で。過去の価格現在の価格itempricestart_dateitempricestart_date100002010-01-01グリッパー40002012-04-01グリッパー50002013-04-01懸垂マシン180002010-01-01懸垂マシン200002012-01-01ダンベルセット
対策 1 の問題点●●外部キー制約が使えない同じレコードが含まれてはいけないという制約をつけるのが難しい–トリガーを使えば表現可能
履歴データ対策 2重複したデータを持つ●●外部キーが利用可能UNION が不要過去から現在に至るまでの価格現在の価格itempricestart_dateitemstart_date100002010-01-01グリッパー40002012-04-01グリッパー50002013-04-01懸垂マシン180002010-01-01懸垂マシン200002012-01-01100002010-01-01ダンベルセットグリッパー50002013-04-01懸垂マシン200002012-01-01ダンベルセットprice
対策 2 の問題点●重複したデータがある––直交していない更新異常(矛盾)に注意●●2 つのテーブルで同じアイテム、同じ日付なのに価格が異なるどちらか一方だけにしか該当する行がない
履歴データ対策 3擬似 (pseudo) キーの利用●外部キーは利用したいけどデータの重複は避けたいキーマスター現在の価格price_idprice_iditem11 ダンベルセット23pricestart_date100002010-01-013 グリッパー50002013-04-015 懸垂マシン200002012-01-0145過去の価格price_iditempricestart_date2 グリッパー40002012-04-014 懸垂マシン180002010-01-01
対策 3 の問題点●擬似キーは本質的に不要–––●擬似キー以外にもユニークキーが存在することになるディスクスペースの無駄更新のオーバーヘッドが増えるJOIN が増える
NG!! こんな設計にご用心●フラグを立てたら?–––end_date → validフラグは自動的に更新されないフラグだらけになってしまうitempricestart_dateend_datevalid100002010-01-019999-12-31 yグリッパー40002012-04-012013-03-31 nグリッパー50002013-04-019999-12-31 y懸垂マシン180002010-01-012011-12-31 n懸垂マシン200002012-01-012013-12-31 y懸垂マシン220002014-01-019999-12-31 yダンベルセット
クイズ 6リレーショナルモデルで表現することができないテーブルでも正規化できる。○ ×
まとめDB 設計鉄則三箇条一、リレーショナルモデルを理解する一、リレーションを正規化する一、リレーショナルモデルの限界を知る
おすすめの書籍●SQL and Relational Theory–●●●●データベースの実践講義は内容が少ないし古いのでおすすめはしない。The Art of SQLプログラマのための SQLSQL アンチパターンWEB+DB PRESS–Vol.68 〜
Q&A!!ご静聴ありがとうございました。

Recommended

PDF
イミュータブルデータモデル(世代編)
PPTX
イベント・ソーシングを知る
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
PDF
イミュータブルデータモデルの極意
PDF
ドメイン駆動設計 本格入門
PDF
SQL大量発行処理をいかにして高速化するか
PDF
イミュータブルデータモデル(入門編)
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
PDF
リレーショナルな正しいデータベース設計
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PPTX
トランザクションをSerializableにする4つの方法
PDF
Vacuum徹底解説
PPTX
DockerコンテナでGitを使う
PPTX
Redisの特徴と活用方法について
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
機械学習で泣かないためのコード設計 2018
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLアーキテクチャ入門
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
PDF
テスト文字列に「うんこ」と入れるな
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
pg_bigmを用いた全文検索のしくみ(後編)
PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
データベース09 - データベース設計
PDF
「データベース実践入門」から学ぶリレーショナルモデル

More Related Content

PDF
イミュータブルデータモデル(世代編)
PPTX
イベント・ソーシングを知る
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
PDF
イミュータブルデータモデルの極意
PDF
ドメイン駆動設計 本格入門
イミュータブルデータモデル(世代編)
イベント・ソーシングを知る
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
イミュータブルデータモデルの極意
ドメイン駆動設計 本格入門

What's hot

PDF
SQL大量発行処理をいかにして高速化するか
PDF
イミュータブルデータモデル(入門編)
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
PDF
リレーショナルな正しいデータベース設計
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PPTX
トランザクションをSerializableにする4つの方法
PDF
Vacuum徹底解説
PPTX
DockerコンテナでGitを使う
PPTX
Redisの特徴と活用方法について
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
機械学習で泣かないためのコード設計 2018
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLアーキテクチャ入門
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
PDF
テスト文字列に「うんこ」と入れるな
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
pg_bigmを用いた全文検索のしくみ(後編)
PDF
ドメイン駆動設計 失敗したことと成功したこと
SQL大量発行処理をいかにして高速化するか
イミュータブルデータモデル(入門編)
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
リレーショナルな正しいデータベース設計
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
トランザクションをSerializableにする4つの方法
Vacuum徹底解説
DockerコンテナでGitを使う
Redisの特徴と活用方法について
ドメインオブジェクトの見つけ方・作り方・育て方
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
機械学習で泣かないためのコード設計 2018
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLアーキテクチャ入門
NTT DATA と PostgreSQL が挑んだ総力戦
テスト文字列に「うんこ」と入れるな
マルチテナント化で知っておきたいデータベースのこと
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
pg_bigmを用いた全文検索のしくみ(後編)
ドメイン駆動設計 失敗したことと成功したこと

Viewers also liked

PDF
データベース09 - データベース設計
PDF
「データベース実践入門」から学ぶリレーショナルモデル
PDF
データベース実践入門読書会スペシャル #nseg
 
PDF
なぜプレゼンテーション読書会か
ODP
集合演算を真っ向から否定するアレの話
PDF
NULLとの戦い RDBMS実装編
PPTX
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
PDF
なぜ、いまリレーショナルモデルなのか
PDF
DB2をAWS上に構築する際のヒント&TIPS
PDF
IBM版Hadoop - BigInsights/Big SQL (2013/07/26 CLUB DB2発表資料)
PDF
Groovyで楽にSQLを実行してみよう
PDF
JJUG CCC 2014 Spring IBM SDK for Java 8の全貌 #jjug_ccc #ccc_r57
PDF
DBパフォーマンスチューニングの基礎:インデックス入門
PDF
Java用O/Rマッピングソフトについて私が知っている二、三の事柄
PDF
アクセスプラン(実行計画)の読み方入門
PDF
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
PDF
DB2の使い方 管理ツール編
PDF
エバンジェリストが語るパワーシステム特論 ~ 特番:世界最速スパコン、セコイア(IBM Blue Gene/Q)の凄さの秘密に迫る
PPTX
ならば(その弐)
PDF
Datalogからsqlへの トランスレータを書いた話
データベース09 - データベース設計
「データベース実践入門」から学ぶリレーショナルモデル
データベース実践入門読書会スペシャル #nseg
 
なぜプレゼンテーション読書会か
集合演算を真っ向から否定するアレの話
NULLとの戦い RDBMS実装編
理論から学ぶデータベース実践入門Night(mvccでちょっとハマった話)
なぜ、いまリレーショナルモデルなのか
DB2をAWS上に構築する際のヒント&TIPS
IBM版Hadoop - BigInsights/Big SQL (2013/07/26 CLUB DB2発表資料)
Groovyで楽にSQLを実行してみよう
JJUG CCC 2014 Spring IBM SDK for Java 8の全貌 #jjug_ccc #ccc_r57
DBパフォーマンスチューニングの基礎:インデックス入門
Java用O/Rマッピングソフトについて私が知っている二、三の事柄
アクセスプラン(実行計画)の読み方入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
DB2の使い方 管理ツール編
エバンジェリストが語るパワーシステム特論 ~ 特番:世界最速スパコン、セコイア(IBM Blue Gene/Q)の凄さの秘密に迫る
ならば(その弐)
Datalogからsqlへの トランスレータを書いた話

Similar to データベース設計徹底指南

PDF
あなたが知らない リレーショナルモデル
KEY
Algebraic DP: 動的計画法を書きやすく
PPT
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
PDF
Extending Relational Data Model with Merged Cells(セル結合を考慮した関係データモデルの拡張)
PDF
データ解析技術入門(R編)
PDF
ゲーム開発者のための C++11/C++14
PDF
データ解析1 ベクトルの復習
PDF
C++0x in programming competition
 
PDF
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
PDF
programming camp 2008, introduction of programming, algorithm
PPTX
GPUによる多倍長整数乗算の高速化手法の提案とその評価
PDF
行列計算を利用したデータ解析技術
PDF
Rdbms qpstudy-okuno
PDF
ウェーブレット木の世界
PDF
2011年11月11日
PDF
関数型プログラミング入門 with OCaml
PDF
Ruby科学データ処理ツールの開発 NArrayとPwrake
PPT
Pythonintro
PDF
プログラミング入門
PDF
Rのオブジェクト
あなたが知らない リレーショナルモデル
Algebraic DP: 動的計画法を書きやすく
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Extending Relational Data Model with Merged Cells(セル結合を考慮した関係データモデルの拡張)
データ解析技術入門(R編)
ゲーム開発者のための C++11/C++14
データ解析1 ベクトルの復習
C++0x in programming competition
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
programming camp 2008, introduction of programming, algorithm
GPUによる多倍長整数乗算の高速化手法の提案とその評価
行列計算を利用したデータ解析技術
Rdbms qpstudy-okuno
ウェーブレット木の世界
2011年11月11日
関数型プログラミング入門 with OCaml
Ruby科学データ処理ツールの開発 NArrayとPwrake
Pythonintro
プログラミング入門
Rのオブジェクト

More from Mikiya Okuno

PDF
サポート一筋24+年のエンジニア、サポートのイロハは E4500に教わった。 Sun Microsystems 勉強会〜1994年頃から2000年頃の思い...
PDF
MySQL Cluster 新機能解説 7.5 and beyond
PDF
MySQL 5.7 トラブルシューティング 性能解析入門編
PDF
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
PDF
リレーショナルデータベースとの上手な付き合い方
PDF
リレーショナルデータベースとの上手な付き合い方 long version
PDF
What's New in MySQL 5.7 Security
PDF
What's New in MySQL 5.7 Replication
PDF
とあるギークのキーボード遍歴
PDF
MySQLアーキテクチャ図解講座
PDF
What's New in MySQL 5.7 InnoDB
PDF
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
PDF
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
PDF
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
PDF
人類は如何にして大切な データベースを守るべきか
PDF
RDBにおけるバリデーションをリレーショナルモデルから考える
PDF
MySQLトラブル解析入門
PDF
Mysql toranomaki
PDF
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
ODP
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
サポート一筋24+年のエンジニア、サポートのイロハは E4500に教わった。 Sun Microsystems 勉強会〜1994年頃から2000年頃の思い...
MySQL Cluster 新機能解説 7.5 and beyond
MySQL 5.7 トラブルシューティング 性能解析入門編
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方 long version
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 Replication
とあるギークのキーボード遍歴
MySQLアーキテクチャ図解講座
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
人類は如何にして大切な データベースを守るべきか
RDBにおけるバリデーションをリレーショナルモデルから考える
MySQLトラブル解析入門
Mysql toranomaki
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
MySQl 5.6新機能解説@第一回 中国地方DB勉強会

データベース設計徹底指南


[8]ページ先頭

©2009-2025 Movatter.jp