Database Smells
データベースの不吉な臭い
                              @データベース・リファクタリング読書会




 奥野 幹也
 @nippondanji
 mikiya (dot) okuno (at) gmail (dot) com
免責事項
●   本プレゼンテーションにおいて示されている見解は、私自身
    の見解であって、オラクル・コーポレーションの見解を必ず
    しも反映したものではありません。ご了承ください。
自己紹介
●   今日は個人として来ています。
     –   http://nippondanji.blogspot.com/
     –   Twitter: @nippondanji
●   MySQL サポートエンジニア
     –   2000 年にサン・マイクロシステムズ入社
     –   2007 年に MySQL KK へ転職
     –   気付くとまたサン・マイクロシステムズに・・・
     –   現在は日本オラクルに在席。
     –   サポート一筋 12 年
●   日々のしごと
     –   MySQL トラブルシューティング全般
     –   Q&A 回答
         など
私の日々の仕事は
 サポートです。
困ったことがなければ
  特に必要ない
しかし世の中
そんなに甘くない
トラブルは日常!!
難問のラストリゾート・・・
  それがサポート!!
サポートの日常
●   そもそも既に困っているからサポートへ
    –   お客様が既に臭いに気づき・・・
    –   手に負えないからサポートへ!!
    –   既に手遅れな場合も
●   よくあるパターン
    –   個性的なテーブルを目にすること幾多
    –   ややこしいクエリ
    –   膨大なスロークエリログ
世界は
不吉な臭いで
充満している!
世界は不吉な臭いで充満している!!
●   全員が気づいていないことは誰も気付けない
    –   ベストでないプラクティスが慣習に
    –   みんなそれが普通だと思っている
●   日本的なるもの
    –   盲目的な前例主義
    –   変更を許さない官僚主義
    –   面子
          ●   間違いを指摘できない
          ●   指摘しても聴く耳を持たれない
うまい空気を吸いたいです・・・
腐海に入ってはならん・・・



           by ババ様
システム移行案件にて・・・
スキーマは既存システムのものを
    そのまま使います!!


         作りなおす意味あんのかよ・・・
ロジックの実装はすべて PL/SQL
なぜならアーキがそう決めたからです!


       処理の大半はデータの整合性チェックだったり。
       それって DB の制約でできるよね?
お見積もりは
  テーブルひとつにつき○○万円です。
   → じゃあテーブル数を減らそう!
http://sec.ipa.go.jp/std/ent01-c.html




                                        テーブル数が減れば良いってもんじゃ・・・
悲劇を避けるために
ほとんどの問題はテーブル設計に帰着する
●   ひと言で言うと、リレーショナルモデルを無視した設計に
    なっている場合は悲劇につながる。
    –   リレーショナルモデルを正しく使おう!!
          ●   知らない場合はまず勉強しよう!!
    –   リレーショナルモデルを知らずに RDBMS を使うのは、オブ
         ジェクト指向を知らずに Java を書くようなもの。 HTML
         を知らずにウェブプログラムを書くようなもの。運転の仕
         方を知らずにクルマを走らせるようなもの。超危険!!
●   リレーショナルモデル
    –   リレーションの演算
    –   集合論理
●   データベース設計理論
    –   正規化
    –   直交性
アンチパターンのストーリー
Press Enter■
http://el.jibun.atmarkit.co.jp/pressenter/all_entrylist.html

第 1 回より引用

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

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

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

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

                           〜中略〜

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



リレーショナルモデルなんて
実践では役に立たないなどと
  思わないでください。
RDBMS の落とし穴
●   リレーショナルモデルに従わなくても強力だったりする
    –   データに永続性がある
    –   データをメモリ上にキャッシュできる
    –   トランザクションがある
    –   SQL によって柔軟な検索がおこなえる
    –   インデックスにより高速な検索がおこなえる
    –   バックアップやレプリケーションなどのツールが充実
    –   超便利!!
●   単なるデータの入れ物として使っていませんか?
リレーショナルモデルの利点
●   開発・メンテの効率化
    –   Java に例えると・・・
           ●   例)オブジェクト指向を知らなくても Java は便利だが・・・
                 –   豊富な API やパッケージ
                 –   強力な開発環境
                     etc
           ●   待ち受けてるのは地獄
                 –   読みづらい、コードの重複がたくさん、バグだらけ
    –   リレーショナルモデルに従うと
           ●   アプリのコード量が減る
           ●   データの整合性をデータベースで保証できる
           ●   SELECT がストレートに
           ●   パフォーマンスの向上
           ●   データベースの変更が容易に
というわけでひっそりと連載しています
http://gihyo.jp/magazine/wdpress/archive/2012/vol69




                                          次回は正規化の
                                           お話です。
まとめ!
世界は不吉な臭いが充満している!
●   感覚が麻痺しているかも
     –   内輪の常識を疑う
     –   赤信号、みんなで渡れば怖くない?
           ●   みんな揃って地獄行き!!
     –   プログラムや運用でカバーする羽目になる
           ●   コスト大!!
●   目を覚まそう!!
     –   改善した結果どうなるか
     –   挫けず勇気をもって改善を。
危険を回避するために
●   リレーショナルモデルに従う。
     –   データベースの設計には必須の知識!!
           ●   しかしまともに学習する機会はほとんどないかも。
           ●   何はともあれリレーショナルモデルについての正しい理解
                を。
     –   RDBMS の基本機能だけで満足しない。
     –   正規化とはひと言でいうと重複を排除する作業
           ●   正規化していないとひとつの意味のレコードが複数の場
                所に出現してしまう
           ●   すべてを同時に更新しないと更新異常に!!
●   データベースをリファクタリングしよう!!
     –   世の中は危険な臭いで充満している!!
     –   勇気を持って改善を。
腐海に踏み込んだあなたへ。
●   ガスマスクをつけよう。
    –   適切な防御で身を守ります。
    –   無ければ即死?
●   毒ガスの正体を見極める。
    –   多くのコードはデータの整合性確認に費やされる
    –   逆に言うと・・・
          ●   整合性確認漏れに注意が必要
          ●   整合性は更新処理で問題になる
    –   例)テンポラリテーブルを活用
          ●   条件が複雑な場合にはスパゲティになりがち
          ●   ひとつの SELECT で解決するのではなく、短いクエリに区
               切る
          ●   ストアドプロシージャのほうが上手に書ける場合も
お勧め書籍
●   データベース・リファクタリング以外にも
    –   SQL and Relational Theory
    –   The Art of SQL
    –   SQL Antipatterns
    –   44 のアンチパターンに学ぶ DB システム
ご静聴ありがとうございました。

Database smells

  • 1.
    Database Smells データベースの不吉な臭い @データベース・リファクタリング読書会 奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com
  • 2.
    免責事項 ● 本プレゼンテーションにおいて示されている見解は、私自身 の見解であって、オラクル・コーポレーションの見解を必ず しも反映したものではありません。ご了承ください。
  • 3.
    自己紹介 ● 今日は個人として来ています。 – http://nippondanji.blogspot.com/ – Twitter: @nippondanji ● MySQL サポートエンジニア – 2000 年にサン・マイクロシステムズ入社 – 2007 年に MySQL KK へ転職 – 気付くとまたサン・マイクロシステムズに・・・ – 現在は日本オラクルに在席。 – サポート一筋 12 年 ● 日々のしごと – MySQL トラブルシューティング全般 – Q&A 回答 など
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 12.
    サポートの日常 ● そもそも既に困っているからサポートへ – お客様が既に臭いに気づき・・・ – 手に負えないからサポートへ!! – 既に手遅れな場合も ● よくあるパターン – 個性的なテーブルを目にすること幾多 – ややこしいクエリ – 膨大なスロークエリログ
  • 13.
  • 14.
    世界は不吉な臭いで充満している!! ● 全員が気づいていないことは誰も気付けない – ベストでないプラクティスが慣習に – みんなそれが普通だと思っている ● 日本的なるもの – 盲目的な前例主義 – 変更を許さない官僚主義 – 面子 ● 間違いを指摘できない ● 指摘しても聴く耳を持たれない
  • 15.
  • 16.
  • 17.
    システム移行案件にて・・・ スキーマは既存システムのものを そのまま使います!! 作りなおす意味あんのかよ・・・
  • 18.
    ロジックの実装はすべて PL/SQL なぜならアーキがそう決めたからです! 処理の大半はデータの整合性チェックだったり。 それって DB の制約でできるよね?
  • 19.
    お見積もりは テーブルひとつにつき○○万円です。 → じゃあテーブル数を減らそう! http://sec.ipa.go.jp/std/ent01-c.html テーブル数が減れば良いってもんじゃ・・・
  • 20.
  • 21.
    ほとんどの問題はテーブル設計に帰着する ● ひと言で言うと、リレーショナルモデルを無視した設計に なっている場合は悲劇につながる。 – リレーショナルモデルを正しく使おう!! ● 知らない場合はまず勉強しよう!! – リレーショナルモデルを知らずに RDBMS を使うのは、オブ ジェクト指向を知らずに Java を書くようなもの。 HTML を知らずにウェブプログラムを書くようなもの。運転の仕 方を知らずにクルマを走らせるようなもの。超危険!! ● リレーショナルモデル – リレーションの演算 – 集合論理 ● データベース設計理論 – 正規化 – 直交性
  • 22.
    アンチパターンのストーリー Press Enter■ http://el.jibun.atmarkit.co.jp/pressenter/all_entrylist.html 第 1回より引用 誰かが Java を教えている。地声なのか熱くなっているのか、講師の声はやたらと大き く、いつもより研修内容がよく聞こえていた。  唐突に、その言葉が響いた。  「オブジェクト指向など実業務では使い物にならない!」  私は思わず手を止めてしまい、壁を見つめた。 〜中略〜 「オブジェクト指向の本とかサイトとか見ると、さぞすごいもののように書かれているけ ど、ないからないから、そんなこと。 20 年選手のオレが言うんだから間違いない!」
  • 23.
  • 24.
    RDBMS の落とし穴 ● リレーショナルモデルに従わなくても強力だったりする – データに永続性がある – データをメモリ上にキャッシュできる – トランザクションがある – SQL によって柔軟な検索がおこなえる – インデックスにより高速な検索がおこなえる – バックアップやレプリケーションなどのツールが充実 – 超便利!! ● 単なるデータの入れ物として使っていませんか?
  • 25.
    リレーショナルモデルの利点 ● 開発・メンテの効率化 – Java に例えると・・・ ● 例)オブジェクト指向を知らなくても Java は便利だが・・・ – 豊富な API やパッケージ – 強力な開発環境 etc ● 待ち受けてるのは地獄 – 読みづらい、コードの重複がたくさん、バグだらけ – リレーショナルモデルに従うと ● アプリのコード量が減る ● データの整合性をデータベースで保証できる ● SELECT がストレートに ● パフォーマンスの向上 ● データベースの変更が容易に
  • 26.
  • 27.
  • 28.
    世界は不吉な臭いが充満している! ● 感覚が麻痺しているかも – 内輪の常識を疑う – 赤信号、みんなで渡れば怖くない? ● みんな揃って地獄行き!! – プログラムや運用でカバーする羽目になる ● コスト大!! ● 目を覚まそう!! – 改善した結果どうなるか – 挫けず勇気をもって改善を。
  • 29.
    危険を回避するために ● リレーショナルモデルに従う。 – データベースの設計には必須の知識!! ● しかしまともに学習する機会はほとんどないかも。 ● 何はともあれリレーショナルモデルについての正しい理解 を。 – RDBMS の基本機能だけで満足しない。 – 正規化とはひと言でいうと重複を排除する作業 ● 正規化していないとひとつの意味のレコードが複数の場 所に出現してしまう ● すべてを同時に更新しないと更新異常に!! ● データベースをリファクタリングしよう!! – 世の中は危険な臭いで充満している!! – 勇気を持って改善を。
  • 30.
    腐海に踏み込んだあなたへ。 ● ガスマスクをつけよう。 – 適切な防御で身を守ります。 – 無ければ即死? ● 毒ガスの正体を見極める。 – 多くのコードはデータの整合性確認に費やされる – 逆に言うと・・・ ● 整合性確認漏れに注意が必要 ● 整合性は更新処理で問題になる – 例)テンポラリテーブルを活用 ● 条件が複雑な場合にはスパゲティになりがち ● ひとつの SELECT で解決するのではなく、短いクエリに区 切る ● ストアドプロシージャのほうが上手に書ける場合も
  • 31.
    お勧め書籍 ● データベース・リファクタリング以外にも – SQL and Relational Theory – The Art of SQL – SQL Antipatterns – 44 のアンチパターンに学ぶ DB システム
  • 32.