Database smells

32
Database Smells Database Smells データベースの不吉な臭い データベースの不吉な臭い 奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com @データベース・リファクタリング読書会

Transcript of Database smells

Page 1: Database smells

Database SmellsDatabase Smellsデータベースの不吉な臭いデータベースの不吉な臭い

奥野 幹也@nippondanjimikiya (dot) okuno (at) gmail (dot) com

@データベース・リファクタリング読書会

Page 2: Database smells

免責事項

● 本プレゼンテーションにおいて示されている見解は、私自身の見解であって、オラクル・コーポレーションの見解を必ずしも反映したものではありません。ご了承ください。

Page 3: Database smells

自己紹介

● 今日は個人として来ています。– http://nippondanji.blogspot.com/– Twitter: @nippondanji

● MySQL サポートエンジニア– 2000 年にサン・マイクロシステムズ入社– 2007 年に MySQL KK へ転職– 気付くとまたサン・マイクロシステムズに・・・– 現在は日本オラクルに在席。– サポート一筋 12 年

● 日々のしごと– MySQL トラブルシューティング全般– Q&A 回答

など

Page 4: Database smells

私の日々の仕事はサポートです。

Page 5: Database smells

困ったことがなければ特に必要ない

Page 6: Database smells

しかし世の中そんなに甘くない

Page 7: Database smells

トラブルは日常!!

Page 8: Database smells

難問のラストリゾート・・・それがサポート!!

Page 9: Database smells
Page 10: Database smells
Page 11: Database smells
Page 12: Database smells

サポートの日常

● そもそも既に困っているからサポートへ– お客様が既に臭いに気づき・・・– 手に負えないからサポートへ!!– 既に手遅れな場合も

● よくあるパターン– 個性的なテーブルを目にすること幾多– ややこしいクエリ– 膨大なスロークエリログ

Page 13: Database smells

世界は不吉な臭いで充満している!

Page 14: Database smells

世界は不吉な臭いで充満している!!

● 全員が気づいていないことは誰も気付けない– ベストでないプラクティスが慣習に– みんなそれが普通だと思っている

● 日本的なるもの– 盲目的な前例主義– 変更を許さない官僚主義– 面子

● 間違いを指摘できない● 指摘しても聴く耳を持たれない

Page 15: Database smells

うまい空気を吸いたいです・・・

Page 16: Database smells

腐海に入ってはならん・・・

by ババ様

Page 17: Database smells

システム移行案件にて・・・スキーマは既存システムのものを

そのまま使います!!

作りなおす意味あんのかよ・・・

Page 18: Database smells

ロジックの実装はすべて PL/SQLなぜならアーキがそう決めたからです!

処理の大半はデータの整合性チェックだったり。それって DB の制約でできるよね?

Page 19: Database smells

お見積もりはテーブルひとつにつき○○万円です。→じゃあテーブル数を減らそう!

http://sec.ipa.go.jp/std/ent01-c.html

テーブル数が減れば良いってもんじゃ・・・

Page 20: Database smells

悲劇を避けるために

Page 21: Database smells

ほとんどの問題はテーブル設計に帰着する

● ひと言で言うと、リレーショナルモデルを無視した設計になっている場合は悲劇につながる。

– リレーショナルモデルを正しく使おう!!● 知らない場合はまず勉強しよう!!

– リレーショナルモデルを知らずに RDBMS を使うのは、オブジェクト指向を知らずに Java を書くようなもの。HTMLを知らずにウェブプログラムを書くようなもの。運転の仕方を知らずにクルマを走らせるようなもの。超危険!!

● リレーショナルモデル– リレーションの演算– 集合論理

● データベース設計理論– 正規化– 直交性

Page 22: Database smells

アンチパターンのストーリー

Press Enter■http://el.jibun.atmarkit.co.jp/pressenter/all_entrylist.html

第 1 回より引用

誰かが Java を教えている。地声なのか熱くなっているのか、講師の声はやたらと大きく、いつもより研修内容がよく聞こえていた。

 唐突に、その言葉が響いた。

 「オブジェクト指向など実業務では使い物にならない!」

 私は思わず手を止めてしまい、壁を見つめた。

〜中略〜

「オブジェクト指向の本とかサイトとか見ると、さぞすごいもののように書かれているけど、ないからないから、そんなこと。 20 年選手のオレが言うんだから間違いない!」

Page 23: Database smells

くれぐれも・・・

リレーショナルモデルなんて実践では役に立たないなどと

思わないでください。

Page 24: Database smells

RDBMS の落とし穴

● リレーショナルモデルに従わなくても強力だったりする– データに永続性がある– データをメモリ上にキャッシュできる– トランザクションがある– SQL によって柔軟な検索がおこなえる– インデックスにより高速な検索がおこなえる– バックアップやレプリケーションなどのツールが充実– 超便利!!

● 単なるデータの入れ物として使っていませんか?

Page 25: Database smells

リレーショナルモデルの利点

● 開発・メンテの効率化– Java に例えると・・・

● 例)オブジェクト指向を知らなくても Java は便利だが・・・– 豊富な APIやパッケージ– 強力な開発環境

etc● 待ち受けてるのは地獄

– 読みづらい、コードの重複がたくさん、バグだらけ– リレーショナルモデルに従うと

● アプリのコード量が減る● データの整合性をデータベースで保証できる● SELECT がストレートに● パフォーマンスの向上● データベースの変更が容易に

Page 26: Database smells

というわけでひっそりと連載しています

http://gihyo.jp/magazine/wdpress/archive/2012/vol69

次回は正規化のお話です。

Page 27: Database smells

まとめ!

Page 28: Database smells

世界は不吉な臭いが充満している!

● 感覚が麻痺しているかも– 内輪の常識を疑う– 赤信号、みんなで渡れば怖くない?

● みんな揃って地獄行き!!– プログラムや運用でカバーする羽目になる

● コスト大!!● 目を覚まそう!!

– 改善した結果どうなるか– 挫けず勇気をもって改善を。

Page 29: Database smells

危険を回避するために

● リレーショナルモデルに従う。– データベースの設計には必須の知識!!

● しかしまともに学習する機会はほとんどないかも。● 何はともあれリレーショナルモデルについての正しい理解

を。– RDBMS の基本機能だけで満足しない。– 正規化とはひと言でいうと重複を排除する作業

● 正規化していないとひとつの意味のレコードが複数の場所に出現してしまう

● すべてを同時に更新しないと更新異常に!!● データベースをリファクタリングしよう!!

– 世の中は危険な臭いで充満している!!– 勇気を持って改善を。

Page 30: Database smells

腐海に踏み込んだあなたへ。

● ガスマスクをつけよう。– 適切な防御で身を守ります。– 無ければ即死?

● 毒ガスの正体を見極める。– 多くのコードはデータの整合性確認に費やされる– 逆に言うと・・・

● 整合性確認漏れに注意が必要● 整合性は更新処理で問題になる

– 例)テンポラリテーブルを活用● 条件が複雑な場合にはスパゲティになりがち● ひとつの SELECT で解決するのではなく、短いクエリに区切る

● ストアドプロシージャのほうが上手に書ける場合も

Page 31: Database smells

お勧め書籍

● データベース・リファクタリング以外にも– SQL and Relational Theory– The Art of SQL– SQL Antipatterns– 44のアンチパターンに学ぶDB システム

Page 32: Database smells

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