Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Soudai Sone
PDF, PPTX
51,613 views
PostgreSQLアンチパターン
・OSC徳島 ・PostgreSQLカンファレンス ・JJUG CCC の登壇資料です
Data & Analytics
◦
Read more
112
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 196
2
/ 196
3
/ 196
4
/ 196
5
/ 196
6
/ 196
7
/ 196
8
/ 196
9
/ 196
10
/ 196
11
/ 196
12
/ 196
13
/ 196
14
/ 196
15
/ 196
16
/ 196
17
/ 196
18
/ 196
19
/ 196
20
/ 196
21
/ 196
22
/ 196
23
/ 196
24
/ 196
25
/ 196
26
/ 196
27
/ 196
28
/ 196
29
/ 196
30
/ 196
31
/ 196
32
/ 196
33
/ 196
34
/ 196
35
/ 196
36
/ 196
37
/ 196
38
/ 196
39
/ 196
40
/ 196
41
/ 196
42
/ 196
43
/ 196
44
/ 196
45
/ 196
46
/ 196
47
/ 196
48
/ 196
49
/ 196
50
/ 196
51
/ 196
52
/ 196
53
/ 196
54
/ 196
55
/ 196
56
/ 196
57
/ 196
58
/ 196
59
/ 196
60
/ 196
61
/ 196
62
/ 196
63
/ 196
64
/ 196
65
/ 196
66
/ 196
67
/ 196
68
/ 196
69
/ 196
70
/ 196
71
/ 196
72
/ 196
73
/ 196
74
/ 196
75
/ 196
76
/ 196
77
/ 196
78
/ 196
79
/ 196
80
/ 196
81
/ 196
82
/ 196
83
/ 196
84
/ 196
85
/ 196
86
/ 196
87
/ 196
88
/ 196
89
/ 196
90
/ 196
91
/ 196
92
/ 196
93
/ 196
94
/ 196
95
/ 196
96
/ 196
97
/ 196
98
/ 196
99
/ 196
100
/ 196
101
/ 196
102
/ 196
103
/ 196
104
/ 196
105
/ 196
106
/ 196
107
/ 196
108
/ 196
109
/ 196
110
/ 196
111
/ 196
112
/ 196
113
/ 196
114
/ 196
115
/ 196
116
/ 196
117
/ 196
118
/ 196
119
/ 196
120
/ 196
121
/ 196
122
/ 196
123
/ 196
124
/ 196
125
/ 196
126
/ 196
127
/ 196
128
/ 196
129
/ 196
130
/ 196
131
/ 196
132
/ 196
133
/ 196
134
/ 196
135
/ 196
136
/ 196
137
/ 196
138
/ 196
139
/ 196
140
/ 196
141
/ 196
142
/ 196
143
/ 196
144
/ 196
145
/ 196
146
/ 196
147
/ 196
148
/ 196
Most read
149
/ 196
150
/ 196
Most read
151
/ 196
152
/ 196
153
/ 196
154
/ 196
155
/ 196
156
/ 196
157
/ 196
158
/ 196
159
/ 196
160
/ 196
161
/ 196
162
/ 196
163
/ 196
164
/ 196
165
/ 196
166
/ 196
167
/ 196
168
/ 196
169
/ 196
170
/ 196
171
/ 196
172
/ 196
173
/ 196
174
/ 196
175
/ 196
176
/ 196
177
/ 196
178
/ 196
179
/ 196
180
/ 196
181
/ 196
182
/ 196
183
/ 196
184
/ 196
185
/ 196
186
/ 196
187
/ 196
188
/ 196
189
/ 196
190
/ 196
191
/ 196
192
/ 196
193
/ 196
194
/ 196
195
/ 196
196
/ 196
Most read
More Related Content
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
PDF
例外設計における大罪
by
Takuto Wada
PDF
Where狙いのキー、order by狙いのキー
by
yoku0825
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
by
Miki Shimogai
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
例外設計における大罪
by
Takuto Wada
Where狙いのキー、order by狙いのキー
by
yoku0825
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
by
Miki Shimogai
What's hot
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
PDF
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
by
Yoshiki Hayama
PDF
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PDF
MySQLで論理削除と正しく付き合う方法
by
yoku0825
PDF
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
PDF
こわくない Git
by
Kota Saito
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
by
Yahoo!デベロッパーネットワーク
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
ドメイン駆動設計 基本を理解する
by
増田 亨
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PDF
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
PDF
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
PDF
雑なMySQLパフォーマンスチューニング
by
yoku0825
PDF
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
by
Takahiro YAMADA
PDF
Easybuggy(バグ)の召し上がり方
by
広平 田村
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
by
Yoshiki Hayama
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
MySQLで論理削除と正しく付き合う方法
by
yoku0825
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
こわくない Git
by
Kota Saito
ヤフー社内でやってるMySQLチューニングセミナー大公開
by
Yahoo!デベロッパーネットワーク
マイクロサービス 4つの分割アプローチ
by
増田 亨
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
ドメイン駆動設計 基本を理解する
by
増田 亨
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
雑なMySQLパフォーマンスチューニング
by
yoku0825
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
by
Takahiro YAMADA
Easybuggy(バグ)の召し上がり方
by
広平 田村
Similar to PostgreSQLアンチパターン
PDF
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
PDF
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
by
Satoshi Yamada
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
by
Hironobu Suzuki
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
PDF
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
by
Satoshi Yamada
PDF
PostgreSQL運用管理入門
by
Yoshiyuki Asaba
PDF
Sql基礎の基礎
by
Satomi Tsujita
PPTX
設計をする上で役にたった制約について
by
Ikki Takahashi
PDF
PostgreSQL Unconference #26 No Error on PostgreSQL
by
Noriyoshi Shinoda
PDF
削除フラグのはなし
by
Shigetaka Yachi
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
by
Takuto Wada
PDF
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
by
Insight Technology, Inc.
PDF
A Tour of PostgreSQL
by
EDB
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
by
Satoshi Nagayasu
PDF
SQLQL は GraphQL にとってなんなのか
by
yancya
PDF
Database smells
by
Mikiya Okuno
PDF
Wtm
by
Soudai Sone
PDF
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
by
Yoshiyuki Asaba
PDF
Chugokudb18_1
by
Kosuke Kida
PDF
20181110 fok2018-pg-extension
by
Toshi Harada
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
by
Satoshi Yamada
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
by
Hironobu Suzuki
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
by
Satoshi Yamada
PostgreSQL運用管理入門
by
Yoshiyuki Asaba
Sql基礎の基礎
by
Satomi Tsujita
設計をする上で役にたった制約について
by
Ikki Takahashi
PostgreSQL Unconference #26 No Error on PostgreSQL
by
Noriyoshi Shinoda
削除フラグのはなし
by
Shigetaka Yachi
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
by
Takuto Wada
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
by
Insight Technology, Inc.
A Tour of PostgreSQL
by
EDB
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
by
Satoshi Nagayasu
SQLQL は GraphQL にとってなんなのか
by
yancya
Database smells
by
Mikiya Okuno
Wtm
by
Soudai Sone
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
by
Yoshiyuki Asaba
Chugokudb18_1
by
Kosuke Kida
20181110 fok2018-pg-extension
by
Toshi Harada
More from Soudai Sone
PDF
Web エンジニアが postgre sql を選ぶ 3 つの理由
by
Soudai Sone
PDF
PostgreSQLの冗長化について
by
Soudai Sone
PDF
Webで役立つRDBの使い方
by
Soudai Sone
PDF
知って得するWebで便利なpostgre sqlの3つの機能
by
Soudai Sone
PDF
今すぐ使えるクラウドとPostgreSQL
by
Soudai Sone
PDF
地方エンジニアがPostgreSQLを通じて成長した話
by
Soudai Sone
PDF
PostgreSQLとpython
by
Soudai Sone
PDF
Postgre sqlから見るnosql
by
Soudai Sone
PDF
DBの闇を書くにはこの余白は狭すぎる
by
Soudai Sone
PDF
Ansibleで始めるpostgre sqlの冗長化
by
Soudai Sone
PDF
レガシーな環境からモダンへの挑戦
by
Soudai Sone
PDF
聞いたら参加したくなるJjug cccの報告
by
Soudai Sone
PDF
中国地方Db勉強会
by
Soudai Sone
PDF
DDDハンズオン
by
Soudai Sone
PDF
Web で変わったクラウドと postgre sql の今と昔
by
Soudai Sone
PDF
実務で役立つデータベースの活用法
by
Soudai Sone
PDF
すぐ始めれるクラウド
by
Soudai Sone
PDF
Postgre sql9.3新機能 (OSC hiroshima 2013)
by
Soudai Sone
PDF
Osh2014
by
Soudai Sone
PDF
Osc2014
by
Soudai Sone
Web エンジニアが postgre sql を選ぶ 3 つの理由
by
Soudai Sone
PostgreSQLの冗長化について
by
Soudai Sone
Webで役立つRDBの使い方
by
Soudai Sone
知って得するWebで便利なpostgre sqlの3つの機能
by
Soudai Sone
今すぐ使えるクラウドとPostgreSQL
by
Soudai Sone
地方エンジニアがPostgreSQLを通じて成長した話
by
Soudai Sone
PostgreSQLとpython
by
Soudai Sone
Postgre sqlから見るnosql
by
Soudai Sone
DBの闇を書くにはこの余白は狭すぎる
by
Soudai Sone
Ansibleで始めるpostgre sqlの冗長化
by
Soudai Sone
レガシーな環境からモダンへの挑戦
by
Soudai Sone
聞いたら参加したくなるJjug cccの報告
by
Soudai Sone
中国地方Db勉強会
by
Soudai Sone
DDDハンズオン
by
Soudai Sone
Web で変わったクラウドと postgre sql の今と昔
by
Soudai Sone
実務で役立つデータベースの活用法
by
Soudai Sone
すぐ始めれるクラウド
by
Soudai Sone
Postgre sql9.3新機能 (OSC hiroshima 2013)
by
Soudai Sone
Osh2014
by
Soudai Sone
Osc2014
by
Soudai Sone
PostgreSQLアンチパターン
1.
PostgreSQLアンチパターン
2.
What is it? RDBの限界を感じた事ありませんか?
3.
What is it? PostgreSQLは銀の弾丸ではありません
4.
What is it? アンチパターン
5.
What is it? アンチパターン ↓ 良かれと思ってした事が後々に苦しみを生む
6.
What is it? アンチパターンを知る
7.
What is it? アンチパターンを知る ↓ 同じ過ちを繰り返さない
8.
What is it? 愚者は経験に学び、賢者は歴史に学ぶ オットー・フォン・ビスマルク
9.
What is it?
10.
What is it? SQLアンチパターンは厳選された失敗集
11.
What is it? SQLアンチパターンは厳選された失敗集 ↓ DBのノウハウが詰まった名著
12.
What is it? しかしMySQLがベース
13.
What is it? 今日はPostgreSQLの失敗例をご紹介します
14.
What is it? SQLアンチパターン本の内容 とは全く関係ありません
15.
What is it? 俺の屍を越えて行け
16.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
17.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
18.
自己紹介 名前:曽根 壮大(そね たけとも) 年齢:31歳(三人の子供がいます) 職業:Webエンジニア 所属:日本PostgreSQLユーザ会 中国支部 支部長 技術的にはLL系言語とかRDBが好きです
19.
中国地方DB勉強会 https://dbstudychugoku.github.io/
20.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
21.
とりあえず削除フラグ http://www.slideshare.net/t_wada/ronsakucasual
22.
とりあえず削除フラグ こんなカラム名を 作ったことありませんか?
23.
とりあえず削除フラグ hoge_delete_flag
24.
とりあえず削除フラグ 会員削除フラグ… 顧客削除フラグ… hogeデータ削除フラグ…
25.
とりあえず削除フラグ 論理削除と言う名の闇
26.
とりあえず削除フラグ
27.
とりあえず削除フラグ 論理削除はなぜダメなのか?
28.
とりあえず削除フラグ 論理削除の理由
29.
とりあえず削除フラグ • エンドユーザから見えなくしたいがデータは消したくない • 削除したデータを検索したい •
データを消さずにログに残したい • 誤った操作をなかったことにしたい、直ぐに元に戻したい
30.
とりあえず削除フラグ そして生まれるDELETE_FLAG
31.
とりあえず削除フラグ 論理削除のデメリット
32.
とりあえず削除フラグ • 積み重なるWHERE delete_flag
= 0 • Unique制約が使えなくなる • 複雑な表示条件(Query)の原因
33.
とりあえず削除フラグ • 積み重なるWHERE delete_flag
= 0 • Unique制約が使えなくなる • 複雑な表示条件(Query)の原因
34.
積み重なるWHERE句 -- ブログを取ってきたい場合 SELECT * FROM blog WHERE blog.delete_flag =
0
35.
積み重なるWHERE句 -- ブログを取ってきたい場合 SELECT * FROM blog WHERE blog.delete_flag =
0 ブログの削除フラグを見る
36.
積み重なるWHERE句 -- ブログを取ってきたい場合 SELECT * FROM blog WHERE blog.delete_flag =
0 ブログの削除フラグを見る 更新者アカウントが削除されてたら?
37.
積み重なるWHERE句 -- 有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 WHERE blog.delete_flag = 0
38.
積み重なるWHERE句 -- 有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 WHERE blog.delete_flag = 0 ユーザの削除フラグを見る
39.
積み重なるWHERE句 -- 有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 WHERE blog.delete_flag = 0 ユーザの削除フラグを見る 所属が削除されてたら?
40.
積み重なるWHERE句 -- 有効な所属の有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 INNER JOIN customers ON customers.id = users.customer_id AND customers.delete_flag = 0 WHERE blog.delete_flag = 0
41.
積み重なるWHERE句 -- 有効な所属の有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 INNER JOIN customers ON customers.id = users.customer_id AND customers.delete_flag = 0 WHERE blog.delete_flag = 0 JOINがどんどん積み重なる
42.
積み重なるWHERE句 -- 有効な所属の有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 INNER JOIN customers ON customers.id = users.customer_id AND customers.delete_flag = 0 WHERE blog.delete_flag = 0 JOINがどんどん積み重なる Queryがボトルネックに
43.
とりあえず削除フラグ Queryの複雑度に対する対策
44.
とりあえず削除フラグ Queryの複雑度に対する対策 ↓ 有効なデータのViewを作る
45.
とりあえず削除フラグ Queryの複雑度に対する対策 ↓ 有効なデータのViewを作る Queryの高速化にはならない
46.
とりあえず削除フラグ 全てのINDEXのセカンダリに DELETE_FLAGを入れる必要がある
47.
とりあえず削除フラグ 全てのINDEXのセカンダリに DELETE_FLAGを入れる必要がある INDEXの肥大化よりも そもそもINDEXを効かせる 複数のQueryを書くのが大変
48.
とりあえず削除フラグ PostgreSQLには マテリアライズド・ビューがある
49.
とりあえず削除フラグ マテビューで有効データViewを作る
50.
とりあえず削除フラグ マテビューで有効データViewを作る ↓ 高速でQueryもシンプル
51.
とりあえず削除フラグ マテビューで有効データViewを作る ↓ 高速でQueryもシンプル SELECT * FROM
active_blog
52.
とりあえず削除フラグ それ、シンプルになるの参照だけ
53.
とりあえず削除フラグ それ、シンプルになるの参照だけ ↓ 更新系で生まれる悪夢
54.
とりあえず削除フラグ 更新したらマテビューを更新
55.
とりあえず削除フラグ 更新したらマテビューを更新 ↓ customersでもusersでもblogでも 更新があればマテビューも更新
56.
とりあえず削除フラグ 更新したらマテビューを更新 ↓ customersでもusersでもblogでも 更新があればマテビューも更新 頻発する REFRESH MATERIALIZED VIEW
57.
とりあえず削除フラグ 実際にはdeleteされないので データは増え続ける
58.
とりあえず削除フラグ 実際にはdeleteされないので データは増え続ける ↓ マテビューの更新コストが肥大
59.
とりあえず削除フラグ 実際にはdeleteされないので データは増え続ける ↓ マテビューの更新コストが肥大 そして第三章の問題へ…
60.
とりあえず削除フラグ • 積み重なるWHERE delete_flag
= 0 • Unique制約が使えなくなる • 複雑な表示条件(Query)の原因
61.
とりあえず削除フラグ • 積み重なるWHERE delete_flag
= 0 • Unique制約が使えなくなる • 複雑な表示条件(Query)の原因 つまり外部Key制約も死ぬ
62.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0
63.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0
64.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 同じユーザが2名いるので Unique制約できない
65.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 同じユーザが2名いるので Unique制約できない もちろん外部キー制約もできない
66.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 サロゲートキーで外部キー制約した場合は 関連したデータは別人扱いになる
67.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 サロゲートキーで外部キー制約した場合は 関連したデータは別人扱いになる ナチュラルキーの場合は死ぬ
68.
とりあえず削除フラグ PostgreSQLには Unique制約にWHERE句がある
69.
Unique制約が使えなくなる -- deletedが0の時にUnique制約をかける CREATE UNIQUE
INDEX user_idx ON users (name) WHERE deleted = 0;
70.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0
71.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0
72.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0
73.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 deletedが1なのでUnique制約対象外
74.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 nameでUnique制約をかけれる
75.
とりあえず削除フラグ id name age
deleted 1 soudai 30 1 2 soudai 30 0 3 sone 20 0 4 taketomo 31 0 nameでUnique制約をかけれる しかし外部キー制約は死ぬ
76.
とりあえず削除フラグ Unique制約にWHERE句 ↓ 結局は外部キー制約は死ぬ
77.
とりあえず削除フラグ 外部キー制約が死ぬ
78.
とりあえず削除フラグ 外部キー制約が死ぬ ↓ テーブルの関連性の担保が死ぬ
79.
とりあえず削除フラグ データの不整合を防げない
80.
とりあえず削除フラグ データの不整合を防げない ↓ バグの温床になる
81.
とりあえず削除フラグ • 積み重なるWHERE delete_flag
= 0 • Unique制約が使えなくなる • 複雑な表示条件(Query)の原因
82.
とりあえず削除フラグ 正しいデータを 表示させる条件が多い
83.
積み重なるWHERE句 -- 有効な所属の有効なアカウントのブログを取ってきたい場合 SELECT * FROM blog INNER JOIN
users ON users.id = blog.user_id AND users.delete_flag = 0 INNER JOIN customers ON customers.id = users.customer_id AND customers.delete_flag = 0 WHERE blog.delete_flag = 0 表示させるために 3つのテーブルが関係している
84.
とりあえず削除フラグ 1つのデータを取るために 関係するTABLEが多すぎる
85.
とりあえず削除フラグ 「あのデータ取るには○○と☓☓と △△をJOINしてWHEREしてSELECT 句にASで別名を付けて…」 みたいな事が頻発する
86.
とりあえず削除フラグ 仕様変更の時の影響範囲が広い
87.
とりあえず削除フラグ 仕様変更の時の影響範囲が広い ↓ つまりバグの温床になる
88.
とりあえず削除フラグ 論理削除は使わないほうが良い
89.
とりあえず削除フラグ 論理削除は使わないほうが良い ↓ TABLEに状態を持たせない
90.
とりあえず削除フラグ 論理削除は使わないほうが良い ↓ TABLEに状態を持たせない リレーショナルモデルで表現する
91.
とりあえず削除フラグ 処方箋
92.
とりあえず削除フラグ 有効なデータのみを残す
93.
とりあえず削除フラグ 有効なデータのみを残す ↓ 例えば削除済みTABLEを作る
94.
とりあえず削除フラグ deleted_usersusers
95.
とりあえず削除フラグ deleted_usersusers soudai sone taketomo
96.
とりあえず削除フラグ deleted_usersusers soudai sone taketomo 削除(DELETE文)
97.
とりあえず削除フラグ deleted_usersusers soudai sone taketomo soudai トリガーで移す
98.
とりあえず削除フラグ deleted_usersusers sone taketomo soudai テーブルには実際のデータのみが残る
99.
とりあえず削除フラグ 注意点
100.
とりあえず削除フラグ 注意点 ↓ トリガーは仕様変更に弱い
101.
とりあえず削除フラグ 注意点 ↓ トリガーは仕様変更に弱い 例えばALTER文でカラムを増やすと トリガーが死ぬ
102.
とりあえず削除フラグ ケースバイケースで手法は選ぶこと
103.
とりあえず削除フラグ ケースバイケースで手法は選ぶこと ↓ 論理削除は使わない
104.
とりあえず削除フラグ 関連したテーブルは?
105.
とりあえず削除フラグ 関連したテーブルは? ↓ 必要なら削除済みTABLEを作る 不要ならDELETEする
106.
とりあえず削除フラグ 関連したテーブルは? ↓ 必要なら削除済みTABLEを作る 不要ならDELETEする 外部キー制約が使えればCASCADEも出来る
107.
とりあえず削除フラグ 関連したテーブルは? ↓ 必要なら削除済みTABLEを作る 不要ならDELETEする 外部キー制約が使えればCASCADEも出来る 事実のみを保存する
108.
とりあえず削除フラグ •ユーザの状態(statusカラム) •課金状態(与信、請求済み) •カート情報(カゴの中、購入済み) 類似例
109.
とりあえず削除フラグ DBに状態を持たせるのは危ない
110.
とりあえず削除フラグ DBに状態を持たせるのは危ない ↓ DBには事実のみを保存する
111.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
112.
困ったときの配列型とJSON型 PostgreSQLは型が豊富
113.
困ったときの配列型とJSON型 配列型やJSON型を使うと
114.
困ったときの配列型とJSON型 配列型やJSON型を使うと ↓ 1:Nを1つのカラムで表現出来る
115.
困ったときの配列型とJSON型 id title body 1
初めてのポスグレ … 2 pg9.5 beta リリース … 3 篠崎愛 「おしのブログ」 … blog_id tag 1 postgres 1 beginner 3 魂 blog tag
116.
困ったときの配列型とJSON型 id title body 1
初めてのポスグレ … 2 pg9.5 beta リリース … 3 篠崎愛 「おしのブログ」 … blog_id tag 1 postgres 1 beginner 3 魂 blog tag 1:N
117.
困ったときの配列型とJSON型 id title body
tag 1 初めてのポスグレ … [ postgres , beginner ] 2 pg9.5 beta リリース … null 3 篠崎愛 「おしのブログ」 … [ 魂 ] blog(配列型の使用例)
118.
困ったときの配列型とJSON型 テーブルを減らす事が出来る
119.
困ったときの配列型とJSON型 テーブルを減らす事が出来る ↓ しかもINDEXも効く
120.
困ったときの配列型とJSON型 JSON型の場合
121.
困ったときの配列型とJSON型 JSON型の場合 ↓ KeyValueを表現できる
122.
困ったときの配列型とJSON型 id title body
properties 1 初めてのポスグレ … {tag:[ postgres , beginner ]} 2 pg9.5 beta リリース … null 3 篠崎愛 「おしのブログ」 … {tag:[ 魂 ]} blog(JSON型の使用例)
123.
困ったときの配列型とJSON型 id title body
properties 1 初めてのポスグレ … {tag:[ postgres , beginner ]} 2 pg9.5 beta リリース … null 3 篠崎愛 「おしのブログ」 … {tag:[ 魂 ], event:[ 握手会 ]} blog(JSON型の使用例)
124.
困ったときの配列型とJSON型 id title body
properties 1 初めてのポスグレ … {tag:[ postgres , beginner ]} 2 pg9.5 beta リリース … null 3 篠崎愛 「おしのブログ」 … {tag:[ 魂 ], event:[ 握手会 ]} blog(JSON型の使用例) JSON型はドキュメント指向なスキーマレスを表現できる →つまりDB構造を変更すること無く項目を追加できる
125.
とりあえず削除フラグ 注意点 ↓ トリガーは仕様変更に弱い 例えばALTER文でカラムを増やすと トリガーが死ぬ
126.
とりあえず削除フラグ 注意点 ↓ トリガーは仕様変更に弱い 例えばALTER文でカラムを増やすと トリガーが死ぬ JSON型ならDB構造を変えない →仕様変更時にトリガーが死なない
127.
困ったときの配列型とJSON型 JSON型はデータに柔軟性を与える
128.
困ったときの配列型とJSON型 JSON型はデータに柔軟性を与える ↓ それは整合性を犠牲にする
129.
困ったときの配列型とJSON型 配列型もJSON型も データを守る機能が弱い
130.
困ったときの配列型とJSON型 外部キー制約→使えない CHECK制約→使えない
131.
困ったときの配列型とJSON型 外部キー制約→使えない CHECK制約→使えない 該当のカラムが 紐づくテーブルを関連付けなれない
132.
困ったときの配列型とJSON型 外部キー制約→使えない CHECK制約→使えない 該当のカラムに 入るデータを制限出来ない
133.
困ったときの配列型とJSON型 UPDATE文に弱い
134.
困ったときの配列型とJSON型 UPDATE文に弱い ↓ 特定の要素のみの更新が難しい
135.
困ったときの配列型とJSON型 仕様が曖昧な時にJSON型
136.
困ったときの配列型とJSON型 仕様が曖昧な時にJSON型 ↓ 仕様変更には強いので有効だが 運用時にデータが守れない
137.
困ったときの配列型とJSON型 処方箋
138.
困ったときの配列型とJSON型 ちゃんと正規化する
139.
困ったときの配列型とJSON型 ちゃんと正規化する ↓ 面倒でも正規化すれば 運用フェーズで必ず救われる
140.
困ったときの配列型とJSON型 ちゃんと正規化する ↓ 面倒でも正規化すれば 運用フェーズで必ず救われる 逆説的にリソースが許されるなら 困ってから正規化の選択肢もアリ
141.
困ったときの配列型とJSON型 使っていい場合
142.
困ったときの配列型とJSON型 • UPDATEが無い(INSERTのみ) • データを守る必要が無い(制約を使わない) •
データを関連付けない(JOINしない) • UPDETE時は対象カラムをまるっと更新 • 集約関数等の対象にならない
143.
困ったときの配列型とJSON型 •ブログのTags •可変なプロパティ •外部のWebAPIの結果 具体例
144.
困ったときの配列型とJSON型 •ブログのTags •可変なプロパティ •外部のWebAPIの結果 具体例 例えばServerのOS情報などは ディストリビューションの違いを 気にしなくても良くなる
145.
困ったときの配列型とJSON型 •ブログのTags •可変なプロパティ •外部のWebAPIの結果 具体例 いつ仕様変更が来るかわからない →その変更に柔軟に対応できる
146.
困ったときの配列型とJSON型 ご利用は計画的に
147.
困ったときの配列型とJSON型 ご利用は計画的に ↓ 基本的に正規化しましょう
148.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
149.
マテビューの功罪 マテビューはPostgreSQL 9.3から
150.
マテビューの功罪 •複雑なテーブルをシンプルに •遅いクエリを高速に •INDEXチューニングも可能 メリット
151.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット
152.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット
153.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット実体を持つのでデータファイルが作成される 作った分だけディスクスペースを圧迫する
154.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット実体を持つのでデータファイルが作成される 作った分だけディスクスペースを圧迫する 参照元のテーブルの増加と合わせてマテビューが増えれば 指数的にディスクスペースの使用量が増える
155.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット
156.
マテビューの功罪 集計済み表課金log 計算結果をマテビューにする
157.
マテビューの功罪 集計済み表課金log 課金1 計算結果をマテビューにする 課金2
158.
マテビューの功罪 集計済み表課金log 課金1 計算結果をマテビューにする 課金2 リフレッシュ
159.
マテビューの功罪 集計済み表課金log 課金1 集計結果 計算結果をマテビューにする 課金2 リフレッシュ
160.
マテビューの功罪 集計済み表課金log 課金1 集計結果 計算結果をマテビューにする 課金2 集計結果を参照するので高速でシンプル!!
161.
マテビューの功罪 集計済み表課金log 課金1 集計結果 計算結果をマテビューにする 課金2 課金3
162.
マテビューの功罪 集計済み表課金log 課金1 集計結果 計算結果をマテビューにする 課金2 課金3 ☓ 更新失敗
163.
マテビューの功罪 集計済み表課金log 課金1 集計結果 計算結果をマテビューにする 課金2 課金3 ☓ 更新失敗 前回の更新結果のままなので不整合
164.
マテビューの功罪 更新が失敗した際の処理が必要
165.
マテビューの功罪 更新が失敗した際の処理が必要 ↓ 自動更新の場合に アプリケーションで制御出来ない
166.
マテビューの功罪 更新が失敗した際の処理が必要 ↓ 自動更新の場合に アプリケーションで制御出来ない DBはテストの自動化も大変 未然にバグを検知しにくい
167.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット
168.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット PostgreSQLには差分更新は無い →データがクエリの実行速度が遅ければ更新も遅い
169.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット PostgreSQLには差分更新は無い →データがクエリの実行速度が遅ければ更新も遅い データが大きくなるにつれ、負荷も上がる →特に集約関数を使ったようなクエリは メモリに乗らなくなった瞬間に急激に遅くなる
170.
マテビューの功罪 •表領域を使う •リフレッシュが必要 •リフレッシュのコストが高い デメリット PostgreSQLには差分更新は無い →データがクエリの実行速度が遅ければ更新も遅い データが大きくなるにつれ、負荷も上がる →特に集約関数を使ったようなクエリは メモリに乗らなくなった瞬間に急激に遅くなる 更新が遅くなった事に気づきにくい
171.
マテビューの功罪 処方箋
172.
マテビューの功罪 DB状態を監視する
173.
マテビューの功罪 DB状態を監視する ↓ 死活監視だけでは無く レコードの増加量やCPU使用率など
174.
マテビューの功罪 DB状態を監視する ↓ 死活監視だけでは無く レコードの増加量やCPU使用率など Zabbixを使っているならpg_monzなどを使う
175.
マテビューの功罪 にも角にもマテビューはしない
176.
マテビューの功罪 にも角にもマテビューはしない ↓ マテビューを集計してマテビュー のような闇を作らない
177.
マテビューの功罪 マテビューは便利だが銀の弾丸ではない ↓ 必要になった時、それは多くの場合 設計に問題を抱えている
178.
マテビューの功罪 マテビューは便利だが銀の弾丸ではない ↓ 必要になった時、それは多くの場合 設計に問題を抱えている
179.
マテビューの功罪 マテビューは便利だが銀の弾丸ではない ↓ 必要になった時、それは多くの場合 設計に問題を抱えている 根本的な解決策が必要なので マテビューが必要になった時は設計を見直す
180.
マテビューの功罪 使わないに越した事は無い
181.
マテビューの功罪 使わないに越した事は無い ↓ 積極的に使うものではない
182.
マテビューの功罪 使わないに越した事は無い ↓ 積極的に使うものではない 新機能は使いたくなるけども
183.
あじぇんだ 1 自己紹介 2 とりあえず削除フラグ 3 困ったときの配列型とJSON型 4 マテビューの功罪 5 まとめ
184.
まとめ PostgreSQLは高機能
185.
まとめ PostgreSQLは高機能 ↓ 設計の不備を 機能でカバー出来てしまう
186.
まとめ 機能に依存し過ぎない
187.
まとめ 機能に依存し過ぎない ↓ シンプルな設計は全てに勝る
188.
まとめ 愚者は経験に学び、賢者は歴史に学ぶ
189.
まとめ 周囲の経験談から学ぶ
190.
まとめ 周囲の経験談から学ぶ ↓ 積極的にコミュニティを利用する
191.
参考資料 ・公式ドキュメント(日本語) https://www.postgresql.jp/document/9.4/html/postgres-fdw.html ・postgresql-jp Slack(チャットルーム) https://postgresql-hackers-jp.herokuapp.com/
192.
まとめ データの寿命はコードよりも長い
193.
まとめ 一度作ったDBは消せない
194.
まとめ 一度作ったDBは消せない ↓ 設計が大事
195.
まとめ より良い設計を 一緒に考えて行きましょう
196.
ご静聴ありがとうございました。
Download