Movatterモバイル変換


[0]ホーム

URL:


Mikiya Okuno, profile picture
Uploaded byMikiya Okuno
PDF, PPTX31,770 views

あなたが知らない リレーショナルモデル

dbtech showcase 2014で使ったスライドです。

Embed presentation

Download as PDF, PPTX
あなたが知らないリレーショナルモデル@dbtech showcase tokoy 2014 奥野 幹也 Twitter: @nippondanji mikiya (dot) okuno (at) gmail (dot) com
免責事項 本プレゼンテーションにおいて示されている見解は、私 自身の見解であって、オラクル・コーポレーションの見 解を必ずしも反映したものではありません。ご了承くだ さい。
自己紹介 ● MySQL サポートエンジニア – 日々のしごと ● トラブルシューティング全般 ● Q&A回答 ● パフォーマンスチューニング など ● ライフワーク – 自由なソフトウェアの普及 ● オープンソースではない ● ブログ 今日は個人として 参加しています。 – 漢のコンピュータ道 – http://nippondanji.blogspot.com/
リレーショナルモデル と聞いて 何を思い浮かべますか?
リレーショナルモデルとは? ● テーブル同士の関係を表現する方法? ● 2 次元のテーブルにデータを格納する? ● ER図を使ってモデリングすること? ● ストアドプロシージャを使ってナンボ? すべて誤解です!!
リレーショナルモデルは 誤解されている!! ● リレーショナルデータベースは覚えることが多すぎる – データモデル – SQL – アプリケーションプログラムとの融合 – トランザクション – 実装、応用 – 製品もいっぱいある etc etc ● 言ってることがみんな違う – サロゲートキーvs ナチュラルキー – 正規化するべき派vs 正規化しなくても良い派 – NULL許容派vsNULL否定派 – ロジックは全部ストアドプロシージャで書け派vs ストアドプロシージャ使ったら負け派 etc etc
目の前のタスクを優先した結果 ● SQL の構文とトランザクションだけとても詳しくなる – データモデル不在 ● データベースはタダの入れ物です。 – 正規化などどこ吹く風 ● せっかくのリレーショナルデータベースのパワーが・・ リレーショナルモデルが蔑ろに!!
リレーショナルモデルとは! ● リレーションという名前のデータ構造を用いてデータを表現 するデータモデル – データモデル ≠ モデリング – データモデル = データの表現方法 ● リレーションを単位として様々な演算を行う – リレーションはデータそのもの – テーブル同士の関係性(リレーションシップ)ではない
リレーションとは ● 現実世界のある物事に対する事実の集合 テーブル ≒ リレーション
集合の性質 ● 重複がない ● NULL がない – 実際に存在する値のみ ● 要素間に順序がない – 例え数値でも 米国 ベトナム 日本 オーストラリア スウェーデン カメルーン 要素が含まれるか どうかだけが重要
リレーションの構成部品 ● リレーション=見出し(ヘッダ)+本体(ボディ) ● 見出し(ヘッダ、headding ) – 属性の集合 ● 属性(アトリビュート) – 名前と型(タイプ) ● 属性値 – 属性で定義された型を持つ値 – ≒列(カラム) ● 組(タプル) – 見出しに対応した属性値の集合 – ≒行(ロー) ● 本体(ボディ) – 組(タプル)の集合
リレーションのイメージ 見出し国名/文字列国番号/整数 本体 地域/文字列 国名:日本, 国番号:81, 地域:アジア 国番号:84, 国名:ベトナム 地域:アジア 国番号:61, 国名:オーストラリア, 地域:オセアニア 国名:米国, 国番号:1, 地域:北米 地域:アフリカ, 国名:カメルーン, 国番号:237 地域:欧州, 国名:スウェーデン, 国番号:46
リレーションは2 次元ではない ● n 個の属性を持つリレーションは、n 次元空間にプロットさ れた点(のようなもの)の集合 – タプル = 点 ● 2次元に見えるのは縦横の軸がある表として表現するから – 紙に描かれた絵は2次元になる – 絵が表すものが2次元だとは限らない ● 風景や人物などはすべて3次元
用語の対応 リレーショナルモデルSQL 関係(リレーション) 表(テーブル) 属性[値] (アトリビュート) 列(カラム) 組(タプル) 行(ロー) 対応する概念だが性質は異なる。
演算の単位はリレーション 入力出力 リレーションR1 リレーションR2 ・・・ リレーションRX 演算
リレーションの演算 ● 演算の入力も結果もリレーション – n 個のリレーションの演算の結果、1 個のリレーションが 返る ● クロージャ(閉包) ● 整数と整数の足し算の結果が整数なのと同じ – 演算結果に対して新たに別の演算を適用できる ● 集合操作に基づく演算 – 和、差、直積、射影、制限、結合etc
リレーションのイメージ(再掲) 見出し国名/文字列国番号/整数 本体 地域/文字列 国名:日本, 国番号:81, 地域:アジア 国番号:86, 国名:中華人民共和国, 地域:アジア 国番号:61, 国名:オーストラリア, 地域:オセアニア 国名:米国, 国番号:1, 地域:北米 地域:アフリカ, 国名:カメルーン, 国番号:237 地域:欧州, 国名:スウェーデン, 国番号:46
制限( RESTRICT )
制限( RESTRICT )
射影( PROJECT )
射影( PROJECT )
属性名変更( RENAME ) 国名/文字列国番号/整数大陸/文字列
属性名変更( RENAME ) 国名/文字列国番号/整数地域/文字列
拡張( EXTEND ) 国名/文字列人口/整数 面積 / 実数 (km2)
拡張( EXTEND ) 国名/文字列人口/整数 面積 / 実数 (km2) 人口密度 / 実数 (人/km2)
和( UNION )
和( UNION )
積( INTERSECT )
積( INTERSECT )
差( DIFFERENCE )
差( DIFFERENCE )
直積( PRODUCT ) a b c d x y z
直積( PRODUCT ) a b x a b y a b z c d x c d y c d z
結合(JOIN ) a x b y c z w 1 x 2 y 3
結合(JOIN ) a x 2 b y 3
豆知識 ● 直積( Product )と積( Intersect )はいずれも結合( Join) の特殊なケース – 直積・・・共通する属性がひとつも存在しないケース – 積・・・すべての属性がまったく同じケース ● リレーショナルモデルに存在するJoin はInner Join だけ
リレーションの演算は 分かったけど SQL とどう関係あるの?
SELECT の基本形 SELECT select_list FROM table_reference WHERE where_condition
SELECT の実態 = 3 つのリレーション演算 SELECT 射影 FROM 直積 WHERE 制限
リレーショナルモデルを 無視するとどうなるか ● データベース設計がぐだぐだになる。 – セオリー無視 – データとそれに対する操作はセット ● 結果、クエリもぐだぐだになる。 ● データベース設計が良くないと・・・ – クエリがすっきりと表現できない – クエリを書くのに様々なスーパーテクニックが必要に ● 他の人が見たら「なんじゃこりゃ!!?」 ● 自分が後から見ても「なんじゃこりゃ!!?」 ● 結果、メンテナンスが地獄 – ストアドプロシージャが颯爽と登場!! ● スーパーテクニックを駆使したクエリを手続き型で書き なおしただけ。 ● 状況はさらに悪化
Ruby で配列を操作する a = Array.new # 要素の挿入 a.push('要素') # N番目の要素 a[N] スッキリ!!
Ruby で配列を操作する 誤ったやり方 a = '' # 要素の挿入 a = a << (a.size == 0 ? '要素' : “,#{要素}”) # N番目の要素 n = 0 s = '' a.each_char do |c| if c == ',' return s if n == N n += 1 s = '' else s << c end end return s if n == N ●無駄に長い ●何をしている処理なのかが一目で 分からない ●読みづらい ●間違い(バグ)を犯しやすい ●メンテナンスが大変
誤った設計は 技術的負債を生む
クエリをすっきり表現するには ● 正しいデータ構造を用いる – リレーショナルデータベース上では正しいデータ構造は たったひとつ – リレーション!! ● テーブルがリレーションになっていること ● 矛盾がないこと ● 集合演算=論理演算に基づく表現 – SELECT 射影 FROM 直積 WHERE 制限
述語論理 ● 命題 – ある物事について記述した文章で、その意味が正しいかどうか、つま り真なのか偽なのかを問えるもののこと – 例)ポチは犬である ● 述語 – 命題の中の固有名詞をパラメータ化したもの – 例) x は犬である ● 命題関数 – 述語から意味を取り除いて関数化したもの。値を代入した場 合の評価結果は述語と同じ。 – 例) F(x) ● 閉世界仮説 – リレーションは事実の集合 ● 事実=真となる命題 – リレーションには述語がある ● リレーションに含まれる組の属性値を代入 → 真 ● それ以外の属性値を代入 → すべて偽
宣言型vs 手続き型 ● SQL は宣言型で使うべき。 ● 宣言型=WHAT – 欲しいデータはSELECT一発でゲット!! – 論理演算で表現されたもの ● クエリによって欲しい解(集合)に対する述語は何か? ● 手続き型=HOW – 難解なテクニックを駆使したSELECT – ストアドプロシージャ – 論理演算で欲しい解を導出することができない ● 条件分岐 ● ループ
何故手続き型になってしまうか ● データベース設計が間違っている!! – 欲しい解が論理演算で得られるのは、データベースがそ のように設計されているから – 集合として表現する ● 集合と述語は1:1 で対応 ● 集合として表現されていないと・・・ – 欲しい解は論理演算では得られない – カーソルをスクロールさせて探す羽目に ● 宣言型で書けない場合にはデータベース設計を見直す兆 候かも
正しいデータベース設計 ● 集合=リレーションとして表現されたテーブル – NULL がない – 重複がない – 要素(タプル、属性)間に順序がない – 属性の値はドメインの要素のひとつ – 第1正規形 ● リレーションになっているからリレーションの演算が適用可能 – リレーションの演算=集合演算=論理演算 – リレーションでないものに対してリレーションの演算は適 用できない!
正規化理論 ● リレーションから重複を排除するためのデータベース設計 理論 – 重複は矛盾の原因になる。 ● 重複=同じ事実を複数回述べている ● 部分的に変更すると異なる事実を述べることになる – 矛盾が含まれていると、論理演算によって正しい答えが 導き出せない ● 矛盾は論理学の天敵 ● クエリの結果が正しくない可能性がある
矛盾の例 名前格闘スタイル年齢 範馬刃牙総合格闘技19 範馬勇次郎総合格闘技38 愚地独歩空手57 ビスケットオリバ怪力40 ビスケットオリバ柔道42 花山薫素手喧嘩19 烈海王中国拳法30 烈海王ボクシング30 どっちが 正しい? データそのものを見ただけでは どちらが正しいのかが分からない
正規形( Normal Forms ) ● 第一正規形(1NF)~第六正規形(6NF) – より高次の正規形のほうが重複が少ない(望ましい)状態 になる。 – 3NF と4NFの間にBCNF というものがある。超重要。 – ただし最終目標は5NF ● 1NF ・・・テーブルがリレーションになっていること – スタート地点 ● 2NF~BCNF ・・・自明でない関数従属性( FD )を排除する ● 4NF~6NF ・・・自明でない結合従属性(JD )を排除する ● 自明でないFD とJDが重複の元
直交性 ● 正規化は個々のリレーションの内部の重複をテーマにしたも の ● リレーション同士の重複に焦点を当てたのが直交性 – 複数のリレーションにおいて同じ事実を述べていると、一 部だけを更新すると矛盾になる
リレーショナルモデルは 万能薬ではない
リレーショナルモデルでは 表現できないものがある ● グラフ ● ツリー ● 行列 ● 履歴 ● 全文検索 ● 正規表現 ● ソート ● 集計 ● 空間データ etc etc
グラフ ● グラフとは – ノード(頂点)をエッジ(辺)でつないだ構造を持つモデル b d c e エッジ ノードa ループ 多重辺
様々なグラフ 単純グラフ非連結グラフ 完全グラフ重み付きグラフ b d c f a e 8 3 7 9 3 5 3 4 8 8
データを格納するだけなら できなくはない ● グラフ = ノードの集合 + エッジの集合 Nodes Edges Node a b c d e f Node1 Node2 Weight a b 3 a e 8 b c 3 b d 8 b e 7 c d 4 c f 8 d e 5 d f 3 e f 9
問題はクエリ・・・ ● グラフ特有の問題をSELECT で表現できない – グラフが連結かどうか – 閉路はあるか – 2 つのノード間の最短距離はどれか – 全てのノードを通り、距離が最短になる経路はどれか ● グラフ特有の問題を解くためには・・・ – 論理演算でないアルゴリズムが必要 – ループと条件分岐 ● 解決策 – リレーショナルモデル上では解決策はない!! ● ストアドプロシージャ ● グラフデータベース
リレーショナルモデルの 外側の世界 ● 現実世界のアプリケーション – リレーショナルモデルに適合するデータと、そうでない データが入り乱れている。 – リレーショナルモデルには定石がある – リレーショナルモデル以外の領域に決定的なやりかた ( DB設計、クエリの書き方等)はない ● 創意工夫が必要 ● 外側の世界ではリレーショナルモデルを無理に実践すべき ではない!! – そもそも無理 – うまく行ったように見えても技術的負債に ● 両者の境界線を見極めることが重要。 – リレーショナルモデルで解決できる部分はリレーショナル モデルを適用すべし!! – そうでない部分はリレーショナルモデルを適用してはなら ない!!
リレーショナルモデルの 外側の世界 (つづき) ● SQL はリレーショナルモデル以外の分野も扱える – リレーショナルモデル≒ SQL ● 完全に同じではないから外側の世界も扱うことが可能 – 重複OK – NULL OK – 手続き型の処理すら可能 – SQL なら非常に容易なものもある ● 例)GROUP BY, ORDER BY – ストアドプロシージャは頼りになる ● NoSQL との連携もアリ – 餅は餅屋
NoSQL について ● リレーショナルデータベースが苦手とするようなデータを容 易に扱えるケースがある – リレーショナルモデルの外側の世界は、NoSQL のテリト リーかも知れない ● グラフデータベース ● ドキュメント型データベース etc ● リレーショナルモデルはNoSQL にとっては外側の世界 – 論理的なデータの整合性を担保するのは苦労する – 壮大な車輪の再発明が必要 ● 正規化 ● トランザクション etc
インデックスとは何か ● インデックスはリレーショナルモデルの一部ではない – リレーショナルモデル=データの論理的な表現 – インデックス=データの物理的なアクセス手段 ● =実装 ● 論理>物理 ● クエリ(何のデータが欲しいか)が決まってから、それを実現 するためのアクセス手段を考える – 良くある失敗:既にあるインデックスを使ってどういう風に クエリを書くかを考える – どのカラムの組み合わせに対してどんなインデックスが 必要なのかはクエリ次第
トランザクション ● データの整合性を保つために必須の機能 – リレーショナルモデルとは全く異なる理論 – 補完関係にある ● トランザクションが実現するものは2 つ – 同時実行制御(排他処理) – クラッシュリカバリ ● ACID特性 – 原子性( Atomicity ) – 一貫性(Consistency ) – 独立性( Isolation ) – 永続性( Durability ) 一貫性を考える上で データモデルが 重要になる
複雑さに立ち向かう ● アプリケーションの規模が大きくなるとデータが複雑に – スキーマの複雑化は避けられない ● アプリケーションのコードとの整合性 – スキーマばかりにとらわれがち ● データの整合性について見落としがち – トランザクションが重要だということはよく把握されている – 正規化は? ● 正規化が必要な理由はデータの整合性を保つ ● アプリケーションのコードではなくDB設計で整合性を担 保するのが正規化 ● スキーマレスにしてもデータの複雑さから解放されるわけで はない – むしろ問題点のほうが大きい ● スキーマの整合性を担保できない ● データの整合性を担保できない
まとめ:上手にRDB を使うために ● リレーショナルモデルを実践する – クエリがすっきりと表現できる – メンテナンス性向上 ● テーブルはきっちり正規化する – データの保全を考える – 複雑さへの対処 ● リレーショナルモデルの限界を知る – リレーショナルモデルのセオリーが通用しない世界がある – リレーショナルモデル以外の重要な機能について知る ● インデックス ● トランザクション
おすすめの書籍 ● SQL and Relational Theory – データベースの実践講義は内容が少ないし古いのでおす すめはしない。 ● The Art of SQL ● プログラマのためのSQL ● SQL アンチパターン ● WEB+DB PRESS – Vol.68 ~
宣伝:新書籍の紹介 ● リレーショナルデータベース実践入門 – リレーショナルモデル、SQL 、そしてDB 設計が主なテーマの書籍です。 – どうやってリレーショナルデータベースを使いこなすか! ● リレーショナルモデル基礎編 – SQL とリレーショナルモデル – 述語論理とリレーショナルモデル – 正規化1: 関数従属性 – 正規化2: 結合従属性 – 直交性 – ドメインの設計 etc ● アプリケーション開発実践編 基礎の基礎から よくある間違いを 指摘しつつ – 履歴 – グラフ – インデックスの設計 – ウェブアプリケーションのためのデータ構造 etc 応用まで
Q&A ご静聴ありがとうございました。

Recommended

PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
40歳過ぎてもエンジニアでいるためにやっていること
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
Where狙いのキー、order by狙いのキー
PDF
イミュータブルデータモデル(世代編)
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
イミュータブルデータモデル(入門編)
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
異次元のグラフデータベースNeo4j
PDF
ソーシャルゲームのためのデータベース設計
PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
SQLiteを手軽に・セキュアに
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PPTX
テストコードの DRY と DAMP
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PDF
InnoDBのすゝめ(仮)
PDF
SQL大量発行処理をいかにして高速化するか
PDF
Yahoo! JAPANにおけるApache Cassandraへの取り組み
PPTX
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
「今日から使い切る」 ための GNU Parallel による並列処理入門
PDF
低レイヤー入門
PDF
JVMのGCアルゴリズムとチューニング
PDF
今さらだけどMySQLとライセンス
PDF
分散トレーシング技術について(Open tracingやjaeger)
PDF
リレーショナルな正しいデータベース設計
PDF
データベース設計徹底指南

More Related Content

PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
40歳過ぎてもエンジニアでいるためにやっていること
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
Where狙いのキー、order by狙いのキー
PDF
イミュータブルデータモデル(世代編)
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
イミュータブルデータモデル(入門編)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
40歳過ぎてもエンジニアでいるためにやっていること
オブジェクト指向プログラミングのためのモデリング入門
Where狙いのキー、order by狙いのキー
イミュータブルデータモデル(世代編)
爆速クエリエンジン”Presto”を使いたくなる話
イミュータブルデータモデル(入門編)

What's hot

PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
異次元のグラフデータベースNeo4j
PDF
ソーシャルゲームのためのデータベース設計
PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
SQLiteを手軽に・セキュアに
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PPTX
テストコードの DRY と DAMP
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PDF
InnoDBのすゝめ(仮)
PDF
SQL大量発行処理をいかにして高速化するか
PDF
Yahoo! JAPANにおけるApache Cassandraへの取り組み
PPTX
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
「今日から使い切る」 ための GNU Parallel による並列処理入門
PDF
低レイヤー入門
PDF
JVMのGCアルゴリズムとチューニング
PDF
今さらだけどMySQLとライセンス
PDF
分散トレーシング技術について(Open tracingやjaeger)
ドメインオブジェクトの見つけ方・作り方・育て方
異次元のグラフデータベースNeo4j
ソーシャルゲームのためのデータベース設計
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
SQLiteを手軽に・セキュアに
新入社員のための大規模ゲーム開発入門 サーバサイド編
テストコードの DRY と DAMP
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
InnoDBのすゝめ(仮)
SQL大量発行処理をいかにして高速化するか
Yahoo! JAPANにおけるApache Cassandraへの取り組み
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
インフラエンジニアの綺麗で優しい手順書の書き方
「今日から使い切る」 ための GNU Parallel による並列処理入門
低レイヤー入門
JVMのGCアルゴリズムとチューニング
今さらだけどMySQLとライセンス
分散トレーシング技術について(Open tracingやjaeger)

Similar to あなたが知らない リレーショナルモデル

PDF
リレーショナルな正しいデータベース設計
PDF
データベース設計徹底指南
PPTX
SQLアンチパターン メンター用資料
PDF
Rあんなときこんなとき(tokyo r#12)
PPTX
サンプルで学ぶAlloy
PDF
Database smells
PDF
リレーショナルデータベースとの上手な付き合い方 long version
PDF
Rブートキャンプ
PPTX
Approximate Scalable Bounded Space Sketch for Large Data NLP
PDF
ハンドアウト(配布用資料:佐藤正美)
PDF
なぜ、いまリレーショナルモデルなのか
PDF
Rdbms qpstudy-okuno
PPT
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
PDF
Scalaプログラミング・マニアックス
DOCX
Ⅰ. Rの基礎 2017
PDF
初心者講習会資料(Osaka.r#6)
PDF
データ解析技術入門(R編)
PPTX
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューション
PPTX
Graph DB のユニークさについて考えてみた
PDF
社会ネットワーク分析第7回
リレーショナルな正しいデータベース設計
データベース設計徹底指南
SQLアンチパターン メンター用資料
Rあんなときこんなとき(tokyo r#12)
サンプルで学ぶAlloy
Database smells
リレーショナルデータベースとの上手な付き合い方 long version
Rブートキャンプ
Approximate Scalable Bounded Space Sketch for Large Data NLP
ハンドアウト(配布用資料:佐藤正美)
なぜ、いまリレーショナルモデルなのか
Rdbms qpstudy-okuno
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Scalaプログラミング・マニアックス
Ⅰ. Rの基礎 2017
初心者講習会資料(Osaka.r#6)
データ解析技術入門(R編)
Data-driven Design: 4つの技法 InfoPathを用いたスケーラブル SharePointソリューション
Graph DB のユニークさについて考えてみた
社会ネットワーク分析第7回

More from Mikiya Okuno

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

あなたが知らない リレーショナルモデル

  • 1.
    あなたが知らないリレーショナルモデル@dbtech showcase tokoy2014 奥野 幹也 Twitter: @nippondanji mikiya (dot) okuno (at) gmail (dot) com
  • 2.
  • 3.
    自己紹介 ● MySQLサポートエンジニア – 日々のしごと ● トラブルシューティング全般 ● Q&A回答 ● パフォーマンスチューニング など ● ライフワーク – 自由なソフトウェアの普及 ● オープンソースではない ● ブログ 今日は個人として 参加しています。 – 漢のコンピュータ道 – http://nippondanji.blogspot.com/
  • 4.
  • 5.
    リレーショナルモデルとは? ● テーブル同士の関係を表現する方法?● 2 次元のテーブルにデータを格納する? ● ER図を使ってモデリングすること? ● ストアドプロシージャを使ってナンボ? すべて誤解です!!
  • 6.
    リレーショナルモデルは 誤解されている!! ●リレーショナルデータベースは覚えることが多すぎる – データモデル – SQL – アプリケーションプログラムとの融合 – トランザクション – 実装、応用 – 製品もいっぱいある etc etc ● 言ってることがみんな違う – サロゲートキーvs ナチュラルキー – 正規化するべき派vs 正規化しなくても良い派 – NULL許容派vsNULL否定派 – ロジックは全部ストアドプロシージャで書け派vs ストアドプロシージャ使ったら負け派 etc etc
  • 7.
    目の前のタスクを優先した結果 ● SQLの構文とトランザクションだけとても詳しくなる – データモデル不在 ● データベースはタダの入れ物です。 – 正規化などどこ吹く風 ● せっかくのリレーショナルデータベースのパワーが・・ リレーショナルモデルが蔑ろに!!
  • 8.
    リレーショナルモデルとは! ● リレーションという名前のデータ構造を用いてデータを表現するデータモデル – データモデル ≠ モデリング – データモデル = データの表現方法 ● リレーションを単位として様々な演算を行う – リレーションはデータそのもの – テーブル同士の関係性(リレーションシップ)ではない
  • 9.
  • 10.
    集合の性質 ● 重複がない● NULL がない – 実際に存在する値のみ ● 要素間に順序がない – 例え数値でも 米国 ベトナム 日本 オーストラリア スウェーデン カメルーン 要素が含まれるか どうかだけが重要
  • 11.
    リレーションの構成部品 ● リレーション=見出し(ヘッダ)+本体(ボディ)● 見出し(ヘッダ、headding ) – 属性の集合 ● 属性(アトリビュート) – 名前と型(タイプ) ● 属性値 – 属性で定義された型を持つ値 – ≒列(カラム) ● 組(タプル) – 見出しに対応した属性値の集合 – ≒行(ロー) ● 本体(ボディ) – 組(タプル)の集合
  • 12.
    リレーションのイメージ 見出し国名/文字列国番号/整数 本体地域/文字列 国名:日本, 国番号:81, 地域:アジア 国番号:84, 国名:ベトナム 地域:アジア 国番号:61, 国名:オーストラリア, 地域:オセアニア 国名:米国, 国番号:1, 地域:北米 地域:アフリカ, 国名:カメルーン, 国番号:237 地域:欧州, 国名:スウェーデン, 国番号:46
  • 13.
    リレーションは2 次元ではない ●n 個の属性を持つリレーションは、n 次元空間にプロットさ れた点(のようなもの)の集合 – タプル = 点 ● 2次元に見えるのは縦横の軸がある表として表現するから – 紙に描かれた絵は2次元になる – 絵が表すものが2次元だとは限らない ● 風景や人物などはすべて3次元
  • 14.
    用語の対応 リレーショナルモデルSQL 関係(リレーション)表(テーブル) 属性[値] (アトリビュート) 列(カラム) 組(タプル) 行(ロー) 対応する概念だが性質は異なる。
  • 15.
    演算の単位はリレーション 入力出力 リレーションR1リレーションR2 ・・・ リレーションRX 演算
  • 16.
    リレーションの演算 ● 演算の入力も結果もリレーション– n 個のリレーションの演算の結果、1 個のリレーションが 返る ● クロージャ(閉包) ● 整数と整数の足し算の結果が整数なのと同じ – 演算結果に対して新たに別の演算を適用できる ● 集合操作に基づく演算 – 和、差、直積、射影、制限、結合etc
  • 17.
    リレーションのイメージ(再掲) 見出し国名/文字列国番号/整数 本体地域/文字列 国名:日本, 国番号:81, 地域:アジア 国番号:86, 国名:中華人民共和国, 地域:アジア 国番号:61, 国名:オーストラリア, 地域:オセアニア 国名:米国, 国番号:1, 地域:北米 地域:アフリカ, 国名:カメルーン, 国番号:237 地域:欧州, 国名:スウェーデン, 国番号:46
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
    属性名変更( RENAME )国名/文字列国番号/整数大陸/文字列
  • 23.
    属性名変更( RENAME )国名/文字列国番号/整数地域/文字列
  • 24.
    拡張( EXTEND )国名/文字列人口/整数 面積 / 実数 (km2)
  • 25.
    拡張( EXTEND )国名/文字列人口/整数 面積 / 実数 (km2) 人口密度 / 実数 (人/km2)
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
    直積( PRODUCT )a b x a b y a b z c d x c d y c d z
  • 34.
    結合(JOIN ) ax b y c z w 1 x 2 y 3
  • 35.
  • 36.
    豆知識 ● 直積(Product )と積( Intersect )はいずれも結合( Join) の特殊なケース – 直積・・・共通する属性がひとつも存在しないケース – 積・・・すべての属性がまったく同じケース ● リレーショナルモデルに存在するJoin はInner Join だけ
  • 37.
  • 38.
    SELECT の基本形 SELECTselect_list FROM table_reference WHERE where_condition
  • 39.
    SELECT の実態 =3 つのリレーション演算 SELECT 射影 FROM 直積 WHERE 制限
  • 40.
    リレーショナルモデルを 無視するとどうなるか ●データベース設計がぐだぐだになる。 – セオリー無視 – データとそれに対する操作はセット ● 結果、クエリもぐだぐだになる。 ● データベース設計が良くないと・・・ – クエリがすっきりと表現できない – クエリを書くのに様々なスーパーテクニックが必要に ● 他の人が見たら「なんじゃこりゃ!!?」 ● 自分が後から見ても「なんじゃこりゃ!!?」 ● 結果、メンテナンスが地獄 – ストアドプロシージャが颯爽と登場!! ● スーパーテクニックを駆使したクエリを手続き型で書き なおしただけ。 ● 状況はさらに悪化
  • 41.
    Ruby で配列を操作する a= Array.new # 要素の挿入 a.push('要素') # N番目の要素 a[N] スッキリ!!
  • 42.
    Ruby で配列を操作する 誤ったやり方a = '' # 要素の挿入 a = a << (a.size == 0 ? '要素' : “,#{要素}”) # N番目の要素 n = 0 s = '' a.each_char do |c| if c == ',' return s if n == N n += 1 s = '' else s << c end end return s if n == N ●無駄に長い ●何をしている処理なのかが一目で 分からない ●読みづらい ●間違い(バグ)を犯しやすい ●メンテナンスが大変
  • 43.
  • 44.
    クエリをすっきり表現するには ● 正しいデータ構造を用いる– リレーショナルデータベース上では正しいデータ構造は たったひとつ – リレーション!! ● テーブルがリレーションになっていること ● 矛盾がないこと ● 集合演算=論理演算に基づく表現 – SELECT 射影 FROM 直積 WHERE 制限
  • 45.
    述語論理 ● 命題– ある物事について記述した文章で、その意味が正しいかどうか、つま り真なのか偽なのかを問えるもののこと – 例)ポチは犬である ● 述語 – 命題の中の固有名詞をパラメータ化したもの – 例) x は犬である ● 命題関数 – 述語から意味を取り除いて関数化したもの。値を代入した場 合の評価結果は述語と同じ。 – 例) F(x) ● 閉世界仮説 – リレーションは事実の集合 ● 事実=真となる命題 – リレーションには述語がある ● リレーションに含まれる組の属性値を代入 → 真 ● それ以外の属性値を代入 → すべて偽
  • 46.
    宣言型vs 手続き型 ●SQL は宣言型で使うべき。 ● 宣言型=WHAT – 欲しいデータはSELECT一発でゲット!! – 論理演算で表現されたもの ● クエリによって欲しい解(集合)に対する述語は何か? ● 手続き型=HOW – 難解なテクニックを駆使したSELECT – ストアドプロシージャ – 論理演算で欲しい解を導出することができない ● 条件分岐 ● ループ
  • 47.
    何故手続き型になってしまうか ● データベース設計が間違っている!!– 欲しい解が論理演算で得られるのは、データベースがそ のように設計されているから – 集合として表現する ● 集合と述語は1:1 で対応 ● 集合として表現されていないと・・・ – 欲しい解は論理演算では得られない – カーソルをスクロールさせて探す羽目に ● 宣言型で書けない場合にはデータベース設計を見直す兆 候かも
  • 48.
    正しいデータベース設計 ● 集合=リレーションとして表現されたテーブル– NULL がない – 重複がない – 要素(タプル、属性)間に順序がない – 属性の値はドメインの要素のひとつ – 第1正規形 ● リレーションになっているからリレーションの演算が適用可能 – リレーションの演算=集合演算=論理演算 – リレーションでないものに対してリレーションの演算は適 用できない!
  • 49.
    正規化理論 ● リレーションから重複を排除するためのデータベース設計理論 – 重複は矛盾の原因になる。 ● 重複=同じ事実を複数回述べている ● 部分的に変更すると異なる事実を述べることになる – 矛盾が含まれていると、論理演算によって正しい答えが 導き出せない ● 矛盾は論理学の天敵 ● クエリの結果が正しくない可能性がある
  • 50.
    矛盾の例 名前格闘スタイル年齢 範馬刃牙総合格闘技19範馬勇次郎総合格闘技38 愚地独歩空手57 ビスケットオリバ怪力40 ビスケットオリバ柔道42 花山薫素手喧嘩19 烈海王中国拳法30 烈海王ボクシング30 どっちが 正しい? データそのものを見ただけでは どちらが正しいのかが分からない
  • 51.
    正規形( Normal Forms) ● 第一正規形(1NF)~第六正規形(6NF) – より高次の正規形のほうが重複が少ない(望ましい)状態 になる。 – 3NF と4NFの間にBCNF というものがある。超重要。 – ただし最終目標は5NF ● 1NF ・・・テーブルがリレーションになっていること – スタート地点 ● 2NF~BCNF ・・・自明でない関数従属性( FD )を排除する ● 4NF~6NF ・・・自明でない結合従属性(JD )を排除する ● 自明でないFD とJDが重複の元
  • 52.
    直交性 ● 正規化は個々のリレーションの内部の重複をテーマにしたもの ● リレーション同士の重複に焦点を当てたのが直交性 – 複数のリレーションにおいて同じ事実を述べていると、一 部だけを更新すると矛盾になる
  • 53.
  • 54.
    リレーショナルモデルでは 表現できないものがある ●グラフ ● ツリー ● 行列 ● 履歴 ● 全文検索 ● 正規表現 ● ソート ● 集計 ● 空間データ etc etc
  • 55.
    グラフ ● グラフとは– ノード(頂点)をエッジ(辺)でつないだ構造を持つモデル b d c e エッジ ノードa ループ 多重辺
  • 56.
  • 57.
    データを格納するだけなら できなくはない ●グラフ = ノードの集合 + エッジの集合 Nodes Edges Node a b c d e f Node1 Node2 Weight a b 3 a e 8 b c 3 b d 8 b e 7 c d 4 c f 8 d e 5 d f 3 e f 9
  • 58.
    問題はクエリ・・・ ● グラフ特有の問題をSELECTで表現できない – グラフが連結かどうか – 閉路はあるか – 2 つのノード間の最短距離はどれか – 全てのノードを通り、距離が最短になる経路はどれか ● グラフ特有の問題を解くためには・・・ – 論理演算でないアルゴリズムが必要 – ループと条件分岐 ● 解決策 – リレーショナルモデル上では解決策はない!! ● ストアドプロシージャ ● グラフデータベース
  • 59.
    リレーショナルモデルの 外側の世界 ●現実世界のアプリケーション – リレーショナルモデルに適合するデータと、そうでない データが入り乱れている。 – リレーショナルモデルには定石がある – リレーショナルモデル以外の領域に決定的なやりかた ( DB設計、クエリの書き方等)はない ● 創意工夫が必要 ● 外側の世界ではリレーショナルモデルを無理に実践すべき ではない!! – そもそも無理 – うまく行ったように見えても技術的負債に ● 両者の境界線を見極めることが重要。 – リレーショナルモデルで解決できる部分はリレーショナル モデルを適用すべし!! – そうでない部分はリレーショナルモデルを適用してはなら ない!!
  • 60.
    リレーショナルモデルの 外側の世界 (つづき)● SQL はリレーショナルモデル以外の分野も扱える – リレーショナルモデル≒ SQL ● 完全に同じではないから外側の世界も扱うことが可能 – 重複OK – NULL OK – 手続き型の処理すら可能 – SQL なら非常に容易なものもある ● 例)GROUP BY, ORDER BY – ストアドプロシージャは頼りになる ● NoSQL との連携もアリ – 餅は餅屋
  • 61.
    NoSQL について ●リレーショナルデータベースが苦手とするようなデータを容 易に扱えるケースがある – リレーショナルモデルの外側の世界は、NoSQL のテリト リーかも知れない ● グラフデータベース ● ドキュメント型データベース etc ● リレーショナルモデルはNoSQL にとっては外側の世界 – 論理的なデータの整合性を担保するのは苦労する – 壮大な車輪の再発明が必要 ● 正規化 ● トランザクション etc
  • 62.
    インデックスとは何か ● インデックスはリレーショナルモデルの一部ではない– リレーショナルモデル=データの論理的な表現 – インデックス=データの物理的なアクセス手段 ● =実装 ● 論理>物理 ● クエリ(何のデータが欲しいか)が決まってから、それを実現 するためのアクセス手段を考える – 良くある失敗:既にあるインデックスを使ってどういう風に クエリを書くかを考える – どのカラムの組み合わせに対してどんなインデックスが 必要なのかはクエリ次第
  • 63.
    トランザクション ● データの整合性を保つために必須の機能– リレーショナルモデルとは全く異なる理論 – 補完関係にある ● トランザクションが実現するものは2 つ – 同時実行制御(排他処理) – クラッシュリカバリ ● ACID特性 – 原子性( Atomicity ) – 一貫性(Consistency ) – 独立性( Isolation ) – 永続性( Durability ) 一貫性を考える上で データモデルが 重要になる
  • 64.
    複雑さに立ち向かう ● アプリケーションの規模が大きくなるとデータが複雑に– スキーマの複雑化は避けられない ● アプリケーションのコードとの整合性 – スキーマばかりにとらわれがち ● データの整合性について見落としがち – トランザクションが重要だということはよく把握されている – 正規化は? ● 正規化が必要な理由はデータの整合性を保つ ● アプリケーションのコードではなくDB設計で整合性を担 保するのが正規化 ● スキーマレスにしてもデータの複雑さから解放されるわけで はない – むしろ問題点のほうが大きい ● スキーマの整合性を担保できない ● データの整合性を担保できない
  • 65.
    まとめ:上手にRDB を使うために ●リレーショナルモデルを実践する – クエリがすっきりと表現できる – メンテナンス性向上 ● テーブルはきっちり正規化する – データの保全を考える – 複雑さへの対処 ● リレーショナルモデルの限界を知る – リレーショナルモデルのセオリーが通用しない世界がある – リレーショナルモデル以外の重要な機能について知る ● インデックス ● トランザクション
  • 66.
    おすすめの書籍 ● SQLand Relational Theory – データベースの実践講義は内容が少ないし古いのでおす すめはしない。 ● The Art of SQL ● プログラマのためのSQL ● SQL アンチパターン ● WEB+DB PRESS – Vol.68 ~
  • 67.
    宣伝:新書籍の紹介 ● リレーショナルデータベース実践入門– リレーショナルモデル、SQL 、そしてDB 設計が主なテーマの書籍です。 – どうやってリレーショナルデータベースを使いこなすか! ● リレーショナルモデル基礎編 – SQL とリレーショナルモデル – 述語論理とリレーショナルモデル – 正規化1: 関数従属性 – 正規化2: 結合従属性 – 直交性 – ドメインの設計 etc ● アプリケーション開発実践編 基礎の基礎から よくある間違いを 指摘しつつ – 履歴 – グラフ – インデックスの設計 – ウェブアプリケーションのためのデータ構造 etc 応用まで
  • 68.

[8]ページ先頭

©2009-2025 Movatter.jp