Slide 1

Slide 1 text

RDB THE Right Way ~壮大なるRDBリファクタリング物語~ builderscon tokyo 2018

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

What is it? 待望の続編

Slide 4

Slide 4 text

What is it? RDB THE Right Way?

Slide 5

Slide 5 text

What is it? RDBの正しい道

Slide 6

Slide 6 text

What is it? RDBの正しい設計

Slide 7

Slide 7 text

What is it? RDBの歩き方

Slide 8

Slide 8 text

What is it? データベースの寿命は アプリケーションより長い

Slide 9

Slide 9 text

What is it? 特定のRDBMSに依存した話 では無く、RDB一般的な話

Slide 10

Slide 10 text

What is it? RDBの正しい設計と それを目指す歩き方をご紹介します

Slide 11

Slide 11 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 12

Slide 12 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 13

Slide 13 text

自己紹介 名前 : 曽根 壮大(そね たけとも) 年齢 : 33歳(3人の子供がいます) 職業 : 副社長/CTO 所属 : 株式会社 オミカレ 日本PostgreSQLユーザ会(JPUG) 勉強会担当 技術的にはLL系言語やRDBが好きです

Slide 14

Slide 14 text

自己紹介 名前 : 曽根 壮大(そね たけとも) 年齢 : 33歳(3人の子供がいます) 職業 : 副社長/CTO 所属 : 株式会社 オミカレ 日本PostgreSQLユーザ会(JPUG) 勉強会担当 技術的にはLL系言語やRDBが好きです

Slide 15

Slide 15 text

婚活といえばオミカレ https://party-calendar.net/

Slide 16

Slide 16 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 17

Slide 17 text

THE Right Way 正しい設計とは?

Slide 18

Slide 18 text

THE Right Way 論理設計と物理設計

Slide 19

Slide 19 text

THE Right Way 論理設計と物理設計

Slide 20

Slide 20 text

THE Right Way

Slide 21

Slide 21 text

THE Right Way Entity Relationship Diagram (実体関連図)

Slide 22

Slide 22 text

THE Right Way ERDを考える

Slide 23

Slide 23 text

THE Right Way ERDを考える ↓ モデリングする

Slide 24

Slide 24 text

THE Right Way ERDを作る || 論理設計

Slide 25

Slide 25 text

THE Right Way モデリングするために 必ず知るべきこと

Slide 26

Slide 26 text

THE Right Way データと情報は違う

Slide 27

Slide 27 text

SQLアンチパターン “さて、皆さんは「情報」と「データ」の違いをご存知でしょ うか。この二者の関係は「多くの情報を秘めた貴重なデー タ」という表現で言い尽くせます。いつでも我々が欲しいの は、意味のある(目的を持った)正しい情報なのです。一方、 データは単なる各種の事実の値(何らかの、名称とか日付とか 金額とか)であってそれ自体に目的はありません。” SQLアンチパターンのまえがき 和田 省二

Slide 28

Slide 28 text

SQLアンチパターン “「データ」を永続化して蓄えるのに適している のがRDBであり、それから「情報」を生成する のに適しているのがSQLなのです。” SQLアンチパターンのまえがき 和田 省二

Slide 29

Slide 29 text

THE Right Way データ(事実) と 情報(見たい内容)

Slide 30

Slide 30 text

THE Right Way データベースで扱うのがデータ アプリケーションで扱うのが情報

Slide 31

Slide 31 text

THE Right Way データ設計と情報設計は 分けることが大事

Slide 32

Slide 32 text

THE Right Way データ設計

Slide 33

Slide 33 text

THE Right Way データ設計 ↓ どのように事実を保存するか

Slide 34

Slide 34 text

THE Right Way 情報設計

Slide 35

Slide 35 text

THE Right Way 情報設計 ↓ 事実を如何に加工・利用するか

Slide 36

Slide 36 text

THE Right Way アンケートフォーム

Slide 37

Slide 37 text

• 全て必須とします • 名前は一意とします

Slide 38

Slide 38 text

THE Right Way どんなデータ設計をしますか?

Slide 39

Slide 39 text

THE Right Way 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird

Slide 40

Slide 40 text

THE Right Way ほんとに?

Slide 41

Slide 41 text

THE Right Way 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server foo hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird アプリケーションのバグで入る

Slide 42

Slide 42 text

THE Right Way 名前 トーク評価 理由 好きなDB 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 名前 その他 Fuga Firebird 「その他」のときだけ 別テーブルに切り出す

Slide 43

Slide 43 text

THE Right Way ほんとに?

Slide 44

Slide 44 text

THE Right Way 名前 トーク評価 理由 好きなDB 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 名前 その他 Fuga Firebird Soudai foo アプリケーションのバグで入る

Slide 45

Slide 45 text

THE Right Way 情報優先でデータ設計をすると データに矛盾が生まれる

Slide 46

Slide 46 text

THE Right Way どうやって設計していくか?

Slide 47

Slide 47 text

THE Right Way どうやって設計していくか? ↓ まずモデリングをする

Slide 48

Slide 48 text

THE Right Way どうやって設計していくか? ↓ まずモデリングをする いきなりデータ設計しない!

Slide 49

Slide 49 text

THE Right Way Entity Relationship Diagram (実体関連図)

Slide 50

Slide 50 text

THE Right Way Entityを定義する

Slide 51

Slide 51 text

THE Right Way Entity ↓ イベント(コト)とリソース(モノ)

Slide 52

Slide 52 text

THE Right Way イベント

Slide 53

Slide 53 text

THE Right Way イベント ↓ 実際に発生したコト

Slide 54

Slide 54 text

イベントとは? • 事実、つまり過去しかない • 定期的に繰り返される • Entityをとらえるには、5W2H

Slide 55

Slide 55 text

5W2H • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ)

Slide 56

Slide 56 text

THE Right Way イベントは WhenとHow to

Slide 57

Slide 57 text

5W2H • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ) 過去であるかどうか

Slide 58

Slide 58 text

5W2H • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ) 何が行われるか 繰り返されるか

Slide 59

Slide 59 text

THE Right Way リソース

Slide 60

Slide 60 text

THE Right Way リソース ↓ 登録するモノ

Slide 61

Slide 61 text

リソースとは? • 事実を生み出す元 • 未来も定義できる • 概念も定義出来る

Slide 62

Slide 62 text

5W2H • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ)

Slide 63

Slide 63 text

THE Right Way リソースは WhenとHow to 以外

Slide 64

Slide 64 text

THE Right Way Entityを定義する

Slide 65

Slide 65 text

• 全て必須とします • 名前は一意とします • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ)

Slide 66

Slide 66 text

• 全て必須とします • 名前は一意とします • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ) アンケート結果は事実 ↓ イベント

Slide 67

Slide 67 text

• 全て必須とします • 名前は一意とします • When(いつ) • Where(どこで) • Who(誰が) • What(何を) • Why(なぜ) • How(どうする) • How Much、How Many (いくら、いくつ) アンケートの項目自体は?

Slide 68

Slide 68 text

• 全て必須とします • 名前は一意とします Whoだからリソース

Slide 69

Slide 69 text

THE Right Way 回答 回答者 好きなデータベース トーク評価 評価理由 データベースの種類

Slide 70

Slide 70 text

THE Right Way Entityを関連付ける ↓ Relationship ↓ 正規化

Slide 71

Slide 71 text

THE Right Way Entityを関連付ける ↓ Relationship ↓ 正規化

Slide 72

Slide 72 text

THE Right Way 回答 回答者 好きなデータベース トーク評価 評価理由 データベースの種類

Slide 73

Slide 73 text

THE Right Way 回答 回答者 好きなデータベース トーク評価 評価理由 データベースの種類 評価の理由だから 親子関係がある

Slide 74

Slide 74 text

THE Right Way 回答 回答者 好きなデータベース トーク評価 評価理由 データベースの種類 データベースの種類がない時、 その他ってリソースが必要では?

Slide 75

Slide 75 text

THE Right Way まず現実をモデリングする

Slide 76

Slide 76 text

THE Right Way まず現実をモデリングする ↓ Entity Relationshipすることで 必要なデータが見えてくる

Slide 77

Slide 77 text

THE Right Way まず現実をモデリングする ↓ Entity Relationshipすることで 必要なデータが見えてくる

Slide 78

Slide 78 text

THE Right Way リレーショナルモデルで定義する

Slide 79

Slide 79 text

THE Right Way リレーショナルモデルで定義する ↓ 正規化

Slide 80

Slide 80 text

THE Right Way データに矛盾がある

Slide 81

Slide 81 text

THE Right Way データに矛盾がある ↓ 関係従属は自明ではない

Slide 82

Slide 82 text

THE Right Way 正規化出来ていない

Slide 83

Slide 83 text

THE Right Way 名前 好きなDB 曽根 壮大 PostgreSQL soudai1025 MySQL Soudai SQL Server hoge Oracle Fuga Firebird 名前 選択肢 Firebird その他 PostgreSQL PostgreSQL MySQL MySQL Oracle Oracle SQL Server SQL Server SQLite その他 Db2 その他 ※DBのところだけ注目して正規化をした場合 データベースの種類 アンケート

Slide 84

Slide 84 text

THE Right Way 名前 好きなDB 曽根 壮大 PostgreSQL soudai1025 MySQL Soudai SQL Server hoge Oracle Fuga Firebird 名前 選択肢 Firebird その他 PostgreSQL PostgreSQL MySQL MySQL Oracle Oracle SQL Server SQL Server SQLite その他 DB2 その他 回答の事実はその他ではなく、DB名 データベースの種類 アンケート ※DBのところだけ注目して正規化をした場合

Slide 85

Slide 85 text

THE Right Way 名前 好きなDB 曽根 壮大 PostgreSQL soudai1025 MySQL Soudai SQL Server hoge Oracle Fuga Firebird 名前 選択肢 Firebird その他 PostgreSQL PostgreSQL MySQL MySQL Oracle Oracle SQL Server SQL Server SQLite その他 DB2 その他 ※DBのところだけ注目して正規化をした場合 主キーなので一意 データベースの種類 アンケート

Slide 86

Slide 86 text

THE Right Way 事実を正しく保存して 正しいデータを作る

Slide 87

Slide 87 text

THE Right Way

Slide 88

Slide 88 text

THE Right Way 理論を正しく理解して RDBを使いこなす

Slide 89

Slide 89 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 90

Slide 90 text

正しい道の歩き方 考えたモデルから 正しいデータ設計を考える

Slide 91

Slide 91 text

正しい道の歩き方 論理設計と物理設計

Slide 92

Slide 92 text

正しい道の歩き方 物理設計

Slide 93

Slide 93 text

正しい道の歩き方 物理設計 ↓ データをシステムとして どのように保存するか

Slide 94

Slide 94 text

正しい道の歩き方 正規化した結果で 問題がない場合

Slide 95

Slide 95 text

正しい道の歩き方 正規化した結果で 問題がない場合 データ設計もほぼ完成

Slide 96

Slide 96 text

正しい道の歩き方 正規化した結果で 問題がない場合 データ設計もほぼ完成 参照したい情報とINDEXの相談

Slide 97

Slide 97 text

正しい道の歩き方 正規化した結果で 問題がない場合 データ設計もほぼ完成 参照したい情報とINDEXの相談 多くのケースはここ

Slide 98

Slide 98 text

正しい道の歩き方 正規化した結果だけでは 問題がある場合

Slide 99

Slide 99 text

正規化だけで解決しない例 • パフォーマンス問題 • アプリケーションの制約 • システムアーキテクチャの制約

Slide 100

Slide 100 text

正規化だけで解決しない例 • パフォーマンス問題 • アプリケーションの制約 • システムアーキテクチャの制約 • 正規化が細かく、JOINが多段 • テーブルサイズが大きい • 参照の条件が多い • 書き込み・更新がとても多い • INDEXが効かない …etc

Slide 101

Slide 101 text

正規化だけで解決しない例 • パフォーマンス問題 • アプリケーションの制約 • システムアーキテクチャの制約 • ID必須 • DBマイグレーションが外部キー制約に 対応していない • JSONとか使いたい …etc

Slide 102

Slide 102 text

正規化だけで解決しない例 • パフォーマンス問題 • アプリケーションの制約 • システムアーキテクチャの制約 • データストアが複数ある • セキュリティの制約がある • マイクロサービス化

Slide 103

Slide 103 text

正規化だけで解決しない例 • パフォーマンス問題 • アプリケーションの制約 • システムアーキテクチャの制約 困る時の多くのケースはここ

Slide 104

Slide 104 text

正しい道の歩き方 RDBMSの機能を使う

Slide 105

Slide 105 text

RDBMSの機能の利用例 • 制約を使ってデータを担保する • 特殊なINDEXを使って複雑なクエリを対処する • 拡張機能を利用して特別なケースに対応する

Slide 106

Slide 106 text

RDBMSの機能の利用例 • 制約を使ってデータを担保する • 特殊なINDEXを使って複雑なクエリを対処する • 拡張機能を利用して特別なケースに対応する

Slide 107

Slide 107 text

THE Right Way 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird 「その他」の時だけ許可する CREATE TABLE enquete (“その他” text CHECK(“好きなDB” = ‘その他’), …);

Slide 108

Slide 108 text

No content

Slide 109

Slide 109 text

RDBMSの機能の利用例 • 制約を使ってデータを担保する • 特殊なINDEXを使って複雑なクエリを対処する • 拡張機能を利用して特別なケースに対応する • 式INDEX • 列指向INDEX • フルテキスト INDEX • GIN INDEX …etc

Slide 110

Slide 110 text

RDBMSの機能の利用例 • 制約を使ってデータを担保する • 特殊なINDEXを使って複雑なクエリを対処する • 拡張機能を利用して特別なケースに対応する • DBlinkやFDWで外のDB(NoSQLを含む)を参照する • パーテーションでテーブルを分割する • マテリアライズド・ビューで集計結果をキャシュする

Slide 111

Slide 111 text

正しい道の歩き方 データは常に成長する

Slide 112

Slide 112 text

正しい道の歩き方 データは常に成長する ↓ 量は増え、質は変化する

Slide 113

Slide 113 text

正しい道の歩き方 今日が正しかったことが 来年は正しいとは限らない

Slide 114

Slide 114 text

正しい道の歩き方 だからこそ常に正しさを問う

Slide 115

Slide 115 text

正しい道の歩き方 だからこそ常に正しさを問う ↓ 正しい設計は常に変化する

Slide 116

Slide 116 text

正しい道の歩き方

Slide 117

Slide 117 text

正しい道の歩き方 データベースの問題は 忘れた頃にやってくる

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

https://speakerdeck.com/soudai/rdb-antipattern-refactoring?slide=94

Slide 120

Slide 120 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 121

Slide 121 text

壮大なるリファクタリング 変化するデータベースに 対応していく

Slide 122

Slide 122 text

壮大なるリファクタリング データベースの不吉な匂い

Slide 123

Slide 123 text

壮大なるリファクタリング データベースの不吉な匂い ↓ 技術的負債

Slide 124

Slide 124 text

壮大なるリファクタリング DBリファクタリングの勘所

Slide 125

Slide 125 text

No content

Slide 126

Slide 126 text

壮大なるリファクタリング 動画も資料もあるので 去年の資料を見てくれ!

Slide 127

Slide 127 text

壮大なるリファクタリング スーパーテーブル 作ってませんか?

Slide 128

Slide 128 text

壮大なるリファクタリング テーブルの責務

Slide 129

Slide 129 text

壮大なるリファクタリング テーブルの責務 ↓ クラスの責務に似てる

Slide 130

Slide 130 text

壮大なるリファクタリング • 行毎に複数の状態を持っている • 値によって意味が変わる • 特定の列の値で、他の列の値の意味が変わる • 一つのテーブルが色んな用途で使われる …etc

Slide 131

Slide 131 text

壮大なるリファクタリング • 行毎に複数の状態を持っている • 値によって意味が変わる • 特定の列の値で、他の列の値の意味が変わる • 一つのテーブルが色んな用途で使われる …etc delete_flagとか

Slide 132

Slide 132 text

壮大なるリファクタリング • 行毎に複数の状態を持っている • 値によって意味が変わる • 特定の列の値で、他の列の値の意味が変わる • 一つのテーブルが色んな用途で使われる …etc スマートIDとか (先頭の数値が9だと管理者とか)

Slide 133

Slide 133 text

壮大なるリファクタリング • 行毎に複数の状態を持っている • 値によって意味が変わる • 特定の列の値で、他の列の値の意味が変わる • 一つのテーブルが色んな用途で使われる …etc EAV (Entity Attribute Value)

Slide 134

Slide 134 text

壮大なるリファクタリング • 行毎に複数の状態を持っている • 値によって意味が変わる • 特定の列の値で、他の列の値の意味が変わる • 一つのテーブルが色んな用途で使われる …etc B to CのサービスでUserテーブルに 会員と管理者が混在するなど

Slide 135

Slide 135 text

壮大なるリファクタリング

Slide 136

Slide 136 text

壮大なるリファクタリング とにかく読んで欲しい

Slide 137

Slide 137 text

壮大なるリファクタリング テーブルの責務を分ける

Slide 138

Slide 138 text

https://soudai.hatenablog.com/entry/2018/05/01/204442

Slide 139

Slide 139 text

壮大なるリファクタリング テーブルのスコープを小さくする

Slide 140

Slide 140 text

壮大なるリファクタリング 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird

Slide 141

Slide 141 text

壮大なるリファクタリング 名前 トーク 評価 理由 好きなDB 曽根 壮大 最高 ベストスピーカー PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server hoge 普通 普通だった Oracle Fuga 悪い その他 名前 選択肢 Firebird その他 PostgreSQL PostgreSQL MySQL MySQL Oracle Oracle SQL Server SQL Server SQLite その他 DB2 その他 DBの種類 アンケート

Slide 142

Slide 142 text

壮大なるリファクタリング トリガーで分ける

Slide 143

Slide 143 text

壮大なるリファクタリング アンケート アンケート トリガー アプリ DBの種類

Slide 144

Slide 144 text

壮大なるリファクタリング

Slide 145

Slide 145 text

壮大なるリファクタリング 担当のデータベース テーブルを全て把握してますか?

Slide 146

Slide 146 text

壮大なるリファクタリング データベース考古学

Slide 147

Slide 147 text

壮大なるリファクタリング TABLE一覧を眺める会

Slide 148

Slide 148 text

壮大なるリファクタリング Batchから紐解く

Slide 149

Slide 149 text

壮大なるリファクタリング 現状をまず把握する

Slide 150

Slide 150 text

壮大なるリファクタリング 現状をまず把握する ↓ 正しい姿の設計をする

Slide 151

Slide 151 text

壮大なるリファクタリング 現在地とゴールまでの距離を測る

Slide 152

Slide 152 text

壮大なるリファクタリング 現在地とゴールまでの距離を測る ↓ あとは少しづつ改善していく

Slide 153

Slide 153 text

壮大なるリファクタリング 問題は先送りすると より大きな問題を連れてくる

Slide 154

Slide 154 text

あじぇんだ 1 自己紹介 2 THE Right Way 3 正しい道の歩き方 4 壮大なるリファクタリング 5 まとめ

Slide 155

Slide 155 text

まとめ データベースの寿命は アプリケーションよりも長い

Slide 156

Slide 156 text

まとめ データは失うと取り戻せないし、 情報はデータが無いと作れない

Slide 157

Slide 157 text

まとめ だからこそ正しい事実を保存する

Slide 158

Slide 158 text

まとめ 解決した問題の大きさが エンジニアの価値

Slide 159

Slide 159 text

https://speakerdeck.com/soudai/rdb-antipattern-refactoring?slide=94

Slide 160

Slide 160 text

まとめ 覚悟を決めるには根拠が必要

Slide 161

Slide 161 text

まとめ 覚悟を決めるには根拠が必要 ↓ 根拠は技術で解決できる

Slide 162

Slide 162 text

まとめ 数冊の本を読むだけで 充分な知識がつくのがRDB

Slide 163

Slide 163 text

まとめ 技術で問題を解決していく

Slide 164

Slide 164 text

まとめ 技術で問題を解決する ↓ 解決までの歩んだ轍が道になる

Slide 165

Slide 165 text

まとめ RDB THE Right Way

Slide 166

Slide 166 text

まとめ RDB THE Right Way ↓ あなたの道を歩くのはあなた自身

Slide 167

Slide 167 text

まとめ 技術で問題を解決していく

Slide 168

Slide 168 text

ご清聴ありがとうございました