Doorkeeper
http://sqlap.doorkeeper.jp/events/16740
以下の書籍をターゲットとした読書会なのです。
![]() | SQLアンチパターン (2013/01/26) Bill Karwin 商品詳細を見る |
場所は前回同様、秋葉原のクラスメソッド株式会社さんでした。
参加者は11人かな。
今回は冒頭で、@t_wada さんから素敵なサプライズが!
「SQLアンチパターン」の誤植系を報告したということで、今日の読書会で @t_wada さんからの第6刷を直々に戴きました!第6刷はまだほとんど出回っていない、大変レアな版とのこと。感謝! #sqlap pic.twitter.com/sngUzJ0C1h
— makopi23 (@makopi23) 2014, 10月 27
感謝!私の他に、@meijik さんも戴きました。
第6刷sqlap http://t.co/15knQknfPw #jugem_blog
— 明治@Beyer28 (@meijik) 2014, 10月 28
■ 発表
今回は @setoazusa さんが発表担当でした。
この発表の真髄はデモにありました。デモで紹介してくださった各種情報はこちら~
・MyBatis Migrations
http://mybatis.github.io/migrations/
・SchemaSpy
http://schemaspy.sourceforge.net/
・CIサーバーとSchemaSpyでデータベースのドキュメント作成を自動化
(※SchemaSpyについて発表した時のスライド)
http://www.slideshare.net/setoazusa/schema-spypublic
・上記スライドのデモ用レポジトリ
https://github.com/azusa/schemaspy-demo
・SchemaSpyで出力するドキュメントのサンプル
http://azusa.github.io/schemaspy-demo/schema/index.html
各種ツールや環境は、git cloneですべて取得できるよう、1つのリポジトリにすべて入れているとのことでした。
■ ディスカッション
今回もディスカッションしたいネタをみんなで付箋に書き出しました。

以下、個人メモ。
---
■DBマイグレーション
- DBのマイグレーションを普及させたのがRails。
- Martin Fowlerが「データベースの進化的設計」(日本語訳は @t_wada さん!)を書いて、そのあと、Scott W. Amblerの「データベースリファクタリング」が出てきた。
![]() | データベース・リファクタリング (2008/03/26) スコット W アンブラー、ピラモド・サダラージ 他 商品詳細を見る |
■ 読書会参加者のうち、DBマイグレーションツールを使ってる人の割合
- 使ってる: 6人 使ってない: 5人
- 使ってる人の意見: 「無いと話にならない」、「使わないと怖くて仕方がない」等
■ DSL型 vs SQL型
- DSLで書く方法と、SQLで書く方法の2パターンある。Railsは前者で、プログラムの中でモリモリ書く。
- フレームワークがマイグレーションの機能を持っているなら、それを使うべき。
- フレームワークが持っていないなら、独立系のマイグレーションツールを検討すべき。
- 参考サイト1: DB Migration 入門 vol.1 #CDStudy を開催しました。 うさぎ組
- 右側が多く、Alter前提のやり方。
- 上側は言語非依存で、下側は言語依存。
- 参考サイト2: DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい! from kwatch
■ DBマイグレーションのTIPS
- チームメンバ全員がDBAという状況はヤバい。みんながDBを変え始めると統制が取れなくなる。
- そこでDBマイグレーションツールが登場するようになった。
- DBマイグレーションツールを使ってもらえるようにするには・・・
- 相手にメリットを伝える。
- 始めやすいように環境を最初から用意しておくと良い。
- DBマイグレーション中に失敗するのは最悪。。。
- UpとDownのテストは必ず実施する。
- 切り戻しのリハーサルをやる。
- DBマイグレーションで、本番系でDownをやることはほとんどない。
- その場合は、逆向きのUpをもう1回実施する。逆向きのUpをサポートするツールが最近は多い。
- マスタデータの差異が生じないように、デプロイ時にシード(初期データ)を指定するのが一般的。
- DBマイグレーションにinsertを使うな、という考えもある。どのデータがどのタイミングで入るか追えなくなるので。。。
■ DBマイグレーションの可逆性と不可逆性
- DBマイグレーションのUpでテーブルをDROPすると、Downで戻せない。(不可逆性)
- 不可逆性の他の例としては、テーブルやカラムを結合したあと、分離することはできなかったり。
- 不可逆性を考慮して、DBバックアップをどこで取るか、ログは諦めるとか、検討が必要。
- DBバックアップのやり方は書籍「データベースリファクタリング」でも言及されている。
- DBマイグレーションの指針の1つ: 「サービスイン前は大胆に。サービスイン後は保守的に。」
■ DDLのロールバック
- DDLのロールバックが可能なDBMSは以下。
- PostgreSQL
- SQLServer
- DB2
- Firebird
- DDLのロールバックができないDBMSは以下。
- MySQL
■ DB設計のドキュメント化
- 最近はマイグレーションが主だが、大規模プロジェクトではER図が主で、ER図からDDLを生成することが多い。
- ER図からテーブル定義書を出力して、それに追記すると、ER図とテーブル定義書の同期が取れなくなってくる。。。
- Excelの設計書とは別に、ER図やDDLにはコメントを入れましょう。
■ SIerにありがちな「JOIN禁止令」
- SQLチューニングのオプティマイザには「ルールベース」と「コストベース」の2種類がある。
- コストベースの場合、JOINするとアクセスパスが悪い方に倒れることがあり、バッチ突き抜けなどが生じることがあった。
- JOINを禁止するとアクセスパスがシンプルになるので、遅くても、処理時間が見積もれるようになる。
- でもオンライン処理は、大量データによるバッチ突き抜けとは別次元なので、JOIN禁止は合わないことが多い。
- 最近は理由も知らずに「JOIN禁止」と言う人が多くて困る。。。
■ DBマイグレーションの利点と欠点
- 利点: DBの整合性が合う。
- 欠点: データと設計が混ざって、よくわからなくなる。。。
■ DBマイグレーションの粒度
- 粒度は細かい方がいいとは限らず、機能追加の粒度と合わせるのが一般的。
- 一番最初のマイグレーションは、粒度が大きい。
- MyBatisは1トランザクションが1マイグレーションになる。
★感想:
ちょうどこの読書会の当日、DBのバージョン管理に関する議論が会社であって、ピンポイントなテーマでした。
以前、データベースリファクタリング読書会に参加したときは、DBマイグレーションツールはほとんど無い、というお話を聞きましたが、この日のディスカッションを通じて、ここ数年でずいぶん改善されてきたように感じました。
ちなみにそんときの読書会について書いたブログはこちら。
やっぱ、最近はDevOpsやらアジャイルやらテスト自動化やら、DBマイグレーションの思想が必要となる場面がだいぶ増えた気がします。
私は仕事でDBマイグレーションツールを使ったことがないので、今日のテーマは斬新でとても参考になりました。
参加者の皆様、会場提供のクラスメソッド様、ありがとうございました。
■おまけ:過去の「SQLアンチパターン読書会」ブログ
1章:SQLアンチパターン読書会 「ジェイウォーク」に参加しました
http://makopi23.blog.fc2.com/blog-entry-65.html
2章:SQLアンチパターン読書会 「ナイーブツリー」に参加しました
http://makopi23.blog.fc2.com/blog-entry-70.html
3章:SQLアンチパターン読書会 「IDリクワイアド」に参加しました
http://makopi23.blog.fc2.com/blog-entry-73.html
3章:SQLアンチパターン読書会 「続・IDリクワイアド」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-77.html
4章;SQLアンチパターン読書会 「キーレスエントリー」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-84.html
5章:SQLアンチパターン読書会 「EAV(エンティティ・アトリビュート・バリュー)」に参加しました
http://makopi23.blog.fc2.com/blog-entry-90.html
6章:SQLアンチパターン読書会 「ポリモーフィック関連」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-94.html
7章:SQLアンチパターン読書会 「マルチカラムアトリビュート」に参加しました
http://makopi23.blog.fc2.com/blog-entry-97.html
8章:SQLアンチパターン読書会 「メタデータトリブル」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-105.html
9章:SQLアンチパターン読書会 「ラウンディングエラー」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-109.html
10章:SQLアンチパターン読書会 「サーティーワンフレーバー」に参加しました
http://makopi23.blog.fc2.com/blog-entry-115.html
11章:SQLアンチパターン読書会 「ファントムファイル」に参加しました
http://makopi23.blog.fc2.com/blog-entry-118.html
12章:SQLアンチパターン読書会 「インデックスショットガン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-121.html
13章:SQLアンチパターン読書会 「フィア・オブ・ジ・アンノウン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-128.html
14章:SQLアンチパターン読書会 「アンビギュアスグループ」に参加しました
http://makopi23.blog.fc2.com/blog-entry-130.html
15章:SQLアンチパターン読書会 「ランダムセレクション」に参加しました
http://makopi23.blog.fc2.com/blog-entry-133.html
16章:SQLアンチパターン読書会 「プアマンズ・サーチエンジン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-134.html
17章:SQLアンチパターン読書会 「スパゲッティクエリ」に参加しました
http://makopi23.blog.fc2.com/blog-entry-136.html
18章:SQLアンチパターン読書会 「インプリシットカラム」に参加しました
http://makopi23.blog.fc2.com/blog-entry-138.html
19章:SQLアンチパターン読書会 「リーダブルパスワード」に参加しました
http://makopi23.blog.fc2.com/blog-entry-140.html
20章:SQLアンチパターン読書会 「SQLインジェクション」に参加しました
http://makopi23.blog.fc2.com/blog-entry-144.html
21章:SQLアンチパターン読書会 「シュードキー:ニートフリーク(疑似キー潔癖症)」に参加しました
http://makopi23.blog.fc2.com/blog-entry-147.html
22章:SQLアンチパターン読書会 「シー・ノー・エビル(臭いものに蓋)」に参加しました
http://makopi23.blog.fc2.com/blog-entry-151.html