Slide 1

Slide 1 text

アンチパターンから学ぶ RDBの正しい設計 PHPerKaigi 2019

Slide 2

Slide 2 text

What is it? みなさん失敗したことありますか?

Slide 3

Slide 3 text

What is it? みなさん失敗したことありますか? ↓ 私は沢山あります

Slide 4

Slide 4 text

What is it? あの時、どうすればよかったか…

Slide 5

Slide 5 text

What is it? “愚者は経験に学び、賢者は歴史に学ぶ。” --オットー・ビスマルク

Slide 6

Slide 6 text

What is it? 他人の失敗を知ることで 自分の失敗を未然に防ぐことが出来る

Slide 7

Slide 7 text

本を書きました https://www.amazon.co.jp/exec/obidos/ASIN/4297104083/maple036-22/

Slide 8

Slide 8 text

What is it? RDBMSの失敗例集

Slide 9

Slide 9 text

What is it? 今日はこの本の中から 厳選された内容をお伝えします

Slide 10

Slide 10 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 11

Slide 11 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 12

Slide 12 text

自己紹介 曽根 壮大(34歳) 株式会社オミカレ 副社長/CTO • 日本PostgreSQLユーザ会 勉強会分科会 座長 • 3人の子供がいます • 技術的にはWeb/LL言語/RDBが好きです そ ね た け と も

Slide 13

Slide 13 text

自己紹介 曽根 壮大(34歳) 株式会社オミカレ 副社長/CTO • 日本PostgreSQLユーザ会 勉強会分科会 座長 • 3人の子供がいます • 技術的にはWeb/LL言語/RDBが好きです そ ね た け と も

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

フレームワーク依存症 アプリケーションを使う時 フレームワークを使うことが当たり前

Slide 18

Slide 18 text

フレームワーク依存症 フレームワークを使う

Slide 19

Slide 19 text

フレームワーク依存症 フレームワークを使う ↓ フレームワークの制約を受け入れる

Slide 20

Slide 20 text

フレームワーク依存症 フレームワークの制約?

Slide 21

Slide 21 text

フレームワーク依存症 フレームワークの制約? ↓ 例えばORM

Slide 22

Slide 22 text

RDBMS Model フレームワーク View 情報をやり取りする Modelが事実を加工し、 情報に変更する 事実をやり取りする SQLでやり取りする プログラミング言語 でやり取りする ORM リレーショナルモデルをプログラミング言語が 扱うオブジェクトモデルに変換する またはその逆を行う

Slide 23

Slide 23 text

フレームワーク依存症 ORMは漏れのある抽象化

Slide 24

Slide 24 text

N+1問題 foreach ($blogs as $id => $blog) { echo $blog->get(); } もしget()の度にSQLが発行されたら?

Slide 25

Slide 25 text

http://soudai1025.blogspot.com/2016/11/rdbantipattern1.html

Slide 26

Slide 26 text

フレームワーク依存症 フレームワークは 強い制約と規約によって 高い生産性を与えてくれる

Slide 27

Slide 27 text

フレームワーク依存症 Active Record パターン ↓ Viewがテーブル設計に影響を与える

Slide 28

Slide 28 text

フレームワーク依存症 制約によって生まれる Viewとテーブルのミスマッチ

Slide 29

Slide 29 text

フレームワーク依存症 制約によって生まれる Viewとテーブルのミスマッチ

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

フレームワーク依存症 フレームワークの制約が ときにはRDBMSにとって毒になる

Slide 34

Slide 34 text

フレームワーク依存症 これがフレームワーク依存症

Slide 35

Slide 35 text

フレームワーク依存症 SQLアンチパターンに出てくる フレームワーク依存の話

Slide 36

Slide 36 text

フレームワーク依存症 • マジックビーンズ • ポリモーフィック関連 • IDリクワイアド • キーレスエントリー

Slide 37

Slide 37 text

まだ読んでないなら絶対読んだほうがいい 本著はSQLアンチパターンを読んでる前提の説明も多い

Slide 38

Slide 38 text

アンチパターンを防ぐには? ORMもフレームワークも絶対悪では無い

Slide 39

Slide 39 text

アンチパターンを防ぐには? ORMもフレームワークも絶対悪では無い ↓ 漏れのある抽象化と付き合う よりよい抽象化を目指す

Slide 40

Slide 40 text

アンチパターンを防ぐには? 例えばRepositoryパターン

Slide 41

Slide 41 text

RDBMS View 会員ページ 会員テーブル 会員サービス 会員データ Model ORM SQL 会員リポジトリ サービスに必要な ビジネスロジック キャッシュ ストレージ フレームワーク データクラスはサービスが必要な会員の データを取り出し、加工する。 場合によってはキャッシュから取り出し たり、RDBMSから取り出したりする リポジトリクラスはデータのCRUD部分 だけを担う。 ORM経由でもSQLでもサービスクラスか らは関係ない

Slide 42

Slide 42 text

アンチパターンを防ぐには? フレームワークに依存しない 最適な設計を常に模索する

Slide 43

Slide 43 text

アンチパターンのポイント • フレームワークもORMも必要なツールで あることを意識して上手く付き合う • その上で受けたメリットと支払った デメリットを把握する • ビジネスロジックとデータの責務を 上手く分離する→抽象化を意識する

Slide 44

Slide 44 text

アンチパターンのポイント これを見てORM禁止などは本末転倒

Slide 45

Slide 45 text

アンチパターンのポイント アプリケーションの設計力 ビジネスロジックをコードにする実現力

Slide 46

Slide 46 text

アンチパターンのポイント 視野の広さは 継続的な学習と経験で 必ず身につく

Slide 47

Slide 47 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

知らないロック トランザクションは データを守るために大切な仕組み

Slide 50

Slide 50 text

ロックのレベル 排他ロック(eXcluded lock) 共有ロック(Shared lock) ロック対象へのすべての アクセスを禁止する ロック対象への参照以外の アクセスを禁止する SELECT、INSERT、UPDATE、 DELETE、すべて実行できない ほかのトランザクションから参照 (SELECT)でアクセス可能 書き込みロック、X lock と呼ばれることもある 読み込みロック、S lock と呼ばれることもある

Slide 51

Slide 51 text

ロックの粒度 表ロック 行ロック テーブル(表)を対象にロックするため 該当のテーブル内の行は全て対象になる 行単位で対象をロックする。 1行の場合もあれば、複数行にまたがる 場合もあり、全ての行を対象にすると表 ロックと同義になる テーブルロックと呼ばれることもある レコードロックと呼ばれることもある

Slide 52

Slide 52 text

知らないロック しかし意図しないロックは デッドロックなど新たな問題を生み出す

Slide 53

Slide 53 text

知らないロック デッドロックの例

Slide 54

Slide 54 text

トランザクションA トランザクションB 2巻を確保 「本の1巻と2巻が揃ったら読む」場合のデッドロック SELECT * FROM book WHERE id = 2 FOR UPDATE; SELECT * FROM book WHERE id = 1 FOR UPDATE; 1巻を確保 2巻を確保 1巻を確保 SELECT * FROM book WHERE id = 2 FOR UPDATE; SELECT * FROM book WHERE id = 1 FOR UPDATE; デッドロック発生!

Slide 55

Slide 55 text

知らないロック ロックはとにかく取得するのではなく 順番も大切

Slide 56

Slide 56 text

知らないロック ロックは知らないうちに取っている ↓ 暗黙的ロック

Slide 57

Slide 57 text

知らないロック これらのSQL構文は共有ロックを取る • INSERT…SELECT構文 • CREATE TABLE…AS SELECT構文

Slide 58

Slide 58 text

知らないロック ロックは色んなところで取得されている

Slide 59

Slide 59 text

アンチパターンを防ぐには? ロックを知る RDBMSでのロックの違いを知る

Slide 60

Slide 60 text

アンチパターンを防ぐには? MySQLとPostgreSQLでも違う

Slide 61

Slide 61 text

アンチパターンを防ぐには? MySQLの ギャップロックとネクストキーロック 時間が無いので割愛しますが、 書籍で詳しく解説してます

Slide 62

Slide 62 text

アンチパターンを防ぐには? 基本的な機能は一緒でも 細かい振る舞いが違うことは多々ある

Slide 63

Slide 63 text

アンチパターンを防ぐには? 基本的な機能は一緒でも 細かい振る舞いが違うことは多々ある

Slide 64

Slide 64 text

アンチパターンのポイント • このRDBMSでは○○だから 別のRDBMSでも一緒のはずだ。は危険 • ロックに対する無知は パフォーマンスの問題に直結 • ときにはクリティカルなバグを生み、 最悪のケースではサービス停止もある

Slide 65

Slide 65 text

アンチパターンのポイント ドキュメントを読み、手を実際に動かし、 正しい知識を身に付けましょう

Slide 66

Slide 66 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

キャッシュ中毒 キャッシュの利用は 劇的なパフォーマンス向上をもたらす

Slide 69

Slide 69 text

キャッシュ中毒 この成功体験は かなり強い中毒性がある

Slide 70

Slide 70 text

キャッシュ中毒 キャッシュは麻薬

Slide 71

Slide 71 text

キャッシュ中毒 使い始めると辞めにくく システムの複雑度が上がり トラブルシューティングの難易度が上がる

Slide 72

Slide 72 text

キャッシュ中毒 しかし適切に使えば 多くのパフォーマンスの問題を解決する

Slide 73

Slide 73 text

キャッシュ中毒 キャッシュは麻薬

Slide 74

Slide 74 text

キャッシュの種類 • クエリキャッシュ • マテリアライズド・ビュー (サマリーテーブル) • アプリケーションキャッシュ

Slide 75

Slide 75 text

クエリキャッシュ RDBMS アプリケーション RDBMS アプリケーション キャッシュ 1回目はクエリの結果を返す 結果に変化がない場合、 キャッシュから結果を返す SELECT * FROM hoge SELECT * FROM hoge

Slide 76

Slide 76 text

マテリアライズド・ビュー アプリケーション マテリアライズド・ビュー テーブル CREATE MATERIALIZED VIEW ビュー名 AS SELECT文; マテリアライズド・ビューは実体な のでINDEXを作成することもできる RDBMS SELECT * FROM マテビュー名 マテリアライズド・ビューを REFRESHするまで作成時の状態

Slide 77

Slide 77 text

アプリケーションキャッシュ RDBMS アプリケーション データを取り出す SELECT * FROM hoge キャッシュ ファイル キャッシュ memcached キャッシュ Redis 任意のデータストアに 取り出したデータを保存する アプリケーションの処理結果を保存することで アプリケーションの再計算処理を省略することもできる

Slide 78

Slide 78 text

アプリケーションキャッシュ RDBMS アプリケーション RDBMSへのアクセス を減らせる キャッシュ ファイル キャッシュ memcached キャッシュ Redis アプリケーションがキャッシュの 振る舞いをコントロールできる RDBMSより高速に取り出せるデータストアに アクセスするため高速に処理できる

Slide 79

Slide 79 text

キャッシュ中毒 キャッシュのトラブルはクリティカル

Slide 80

Slide 80 text

キャッシュ中毒 消えたキャッシュの悪夢 「mixi大規模障害について」 https://alpha.mixi.co.jp/entry/2010/10731/

Slide 81

Slide 81 text

キャッシュ中毒 見えてはいけないデータ 「CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして」 https://tech.mercari.com/entry/2017/06/22/204500

Slide 82

Slide 82 text

キャッシュ中毒 キャッシュの障害は テストやモニタリングが難しい

Slide 83

Slide 83 text

キャッシュ中毒 しかし障害はクリティカル

Slide 84

Slide 84 text

アンチパターンを防ぐには? キャッシュ戦略をしっかりと立てる

Slide 85

Slide 85 text

アンチパターンを防ぐには? キャッシュは銀の弾丸では無い ↓ キャッシュヒットしない場合は 逆にボトルネックになる

Slide 86

Slide 86 text

アンチパターンを防ぐには? キャッシュヒット率や更新頻度は サービスの成長と共に変化する

Slide 87

Slide 87 text

アンチパターンを防ぐには? キャッシュは取り出しやすさが大事 つまりキーが大切

Slide 88

Slide 88 text

アンチパターンのポイント • キャッシュヒット率や更新頻度を推測、計 測する • キャッシュの対象と範囲を見極める • キャッシュのキーを決める • キャッシュの生存期間と更新方法を決める

Slide 89

Slide 89 text

アンチパターンのポイント キャッシュを使わなくて良い場合は 使わない

Slide 90

Slide 90 text

アンチパターンのポイント “よほど正当な理由がない限り、 マテリアライズド・ビューの多段化はやめましょう。 これは筆者が最も後悔したRDBの設計の1つで、 間違いなくアンチパターンです” --失敗から学ぶ-RDBの正しい歩き方 16章 キャッシュ中毒

Slide 91

Slide 91 text

アンチパターンのポイント キャッシュの多段は危険 必要だと感じたら設計を見直すべき

Slide 92

Slide 92 text

あじぇんだ 1 自己紹介 2 フレームワーク依存症 3 知らないロック 4 キャッシュ中毒 5 まとめ

Slide 93

Slide 93 text

まとめ “愚者は経験に学び、賢者は歴史に学ぶ。” --オットー・ビスマルク

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

まとめ 他人の失敗から学び、 正しくRDBを使いこなす

Slide 97

Slide 97 text

まとめ 今、あるデータベースと向き合うには?

Slide 98

Slide 98 text

まとめ 今、あるデータベースと向き合うには? ↓ 自分たちで直すしかない

Slide 99

Slide 99 text

https://builderscon.io/tokyo/2017/session/c8f36693-32aa-4bf1-816a-4966f3859926

Slide 100

Slide 100 text

まとめ 諦めず、仕組みで解決する

Slide 101

Slide 101 text

まとめ 諦めず、仕組みで解決する ↓ 仕組みは技術力で解決できる

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

まとめ 技術で問題を解決する

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

まとめ RDB THE Right Way

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

まとめ 自分自身で改善のサイクルを回す

Slide 108

Slide 108 text

まとめ 技術で解決した問題の価値が エンジニアの価値

Slide 109

Slide 109 text

まとめ 自分自身で問題を解決していきましょう

Slide 110

Slide 110 text

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