makopi23のブログ

makopi23が日々の生活で感じたことを気ままに綴るブログです。

SQLアンチパターン読書会 「サーティーワンフレーバー」に参加しました

2013/10/17(木) SQLアンチパターン読書会 「サーティーワンフレーバー」に参加してきました。

DoorKeeper
http://sqlap.doorkeeper.jp/events/6643

以下の書籍をターゲットとした読書会なのです。
SQLアンチパターンSQLアンチパターン
(2013/01/26)
Bill Karwin

商品詳細を見る


場所はいつもの湯島、株式会社アルティネットさんです。
いつも会場提供ありがとうございます。

参加者は10人かな。
おなじみの顔ぶれです。

実はDoorKeeperのタイトルが「サーティーワンフレーバー」となってますが、正式には「サーティワンフレーバー」。
私も今まで、「サーティーワン」だと思ってましたが、違った。。。
ちなみに書籍はちゃんと「サーティワン」となってます。

サーティワンアイスクリームと言えば、子供のころ、スイミングスクールの帰りにオカンによく買ってもらったなぁ。
と、昔のことを思い出してとても懐かしくなりました・・・
生まれてから小学校3年生まで、愛知県春日井市というトコに住んでたんですが、その町の一番のショッピングモールにスイミングスクールも、31アイスクリームもあったのです。

ということでGoogle先生で検索してみたら、まだあった・・・!
サーティワンアイスクリーム アピタ高蔵寺店

超・懐かしい!
makopi23はこの後ブログ書くのしばし放置し、Googleストリートビューで懐かしき故郷を探検したのであった。。。


■アジェンダ
今回は @tkfuji さんがスライドを作って説明してくださいました。

SQLアンチパターン読書会 第10章 サーティワンフレーバー from tkfuji


スライドが大変充実していて、とても勉強になると共に小ネタも多くて笑いありw
あと、今回のスライドを作るために31アイスクリームを実際に店に買いに行ったそうです。素晴らしい!
ちなみに @t_wada さんも書籍執筆時に31アイスクリーム買いに行ったそうなw


■ディスカッション
今回もディスカッションしたいネタを付箋に書き出しました。
20131017_sqlap1.jpg

■サーティワンフレーバーをやってしまう場合
・そもそも、サーティワンフレーバーな設計を考える前に、10.5の解決策を思いつくのが普通では。
・キーレスエントリー(4章)な設計をしている場合はサーティワンフレーバーは有り得るのでは。
 → そうともいえない。例えキーレスエントリーだったとしても参照テーブルを用意すればINNER JOINで使うことで恩恵を受けられる。
・ENUMとかCHECK制約とか駆使してサーティワンフレーバーな設計をして足元をすくわれるのは、DB信仰者が多い。
・逆にキーレスエントリーな設計をする人は、DBMSを信用してない人たちが多い。

■ドメイン(DOMAIN)やユーザ定義(UDT)による制約
・DOMAIN やUDTは、UMLが出始めた時から出始めた。
・ドライバが高機能になってきたC/S時代は使用が多かったかも。

■アンチパターンを使ってもよい場合(10.4節)
・相互排他的な場合でもダメな場合がある。
 → 例えばISO 5218では「性別」の標準規格として、「不明」「男性」「女性」「適用不能」の4種類を定義している。
 → コード値を勝手に振るのは最後の手段とすべき。
(ISO 5218: http://ja.wikipedia.org/wiki/ISO_5218

■ENUMデータ型
・ENUMデータ型を指定したカラムには、値ではなくインデックスが入っている。
 → ソートした時に文字列順にならない。

・しかもインデックスが0始まりじゃないので、罠でしかない!
 → 「0=男性、1=女性」のような割り当てをアプリ側でしていると、DBのENUM列とズレが発生する。
 → データ移行の際に問題となることが多い。
 → というのもENUMデータ型を指定したカラムの中だけ見ても、中身はインデックス値が入っているので気づかない。。。

■値設計
・データ中心アプローチを実践しているエンジニアは、値設計を3種類に分けている。
 (1) フラグ
 (2) 区分
 (3) コード
・値設計はそんな単純じゃない。
・どういうライフサイクルを持っているかを考えて、設計する必要がある。
・そう考えて設計すれば、ENUMデータ型になるカラムはだいぶ減るはず。
・フラグとして使えるBoolean型はSQL標準じゃない。
・勝手に採番すると、国際化対応で破綻することになる。

■値の廃止(10.5.3節)
・BugsテーブルのstatusカラムにDEFAULT 'NEW'と設定し、かつBugsStatusテーブルのstatusカラムに外部参照制約を付与した場合、BugsStatusテーブルのstatusカラムから'NEW'を消したり更新したらどうなる?
 → たぶんDBMSが参照を管理してて、変更出来ないんじゃないか。
・DEFAULT値の変更自体は、ALTER文で行ける。
 → ロードバランシングして、リネームテーブルを用意して本物と偽物を一瞬で入れ替えるとかで対応可。
 → ただ、ALTER文はロックが掛かるので一瞬DBが止まる。

■「プログラマのためのSQL 第4版」のP.70の注釈
・↑が凄い BY @t_wada さん
プログラマのためのSQL 第4版プログラマのためのSQL 第4版
(2013/05/24)
ジョー・セルコ、Joe Celko 他

商品詳細を見る


■サーティワンフレーバーとこれまでのアンチパターンとの類似性
・サーティワンフレーバーって、これまでの1~9章のどれかと似てる気がする。。。
・固定情報を割り当てるという点では、8章の「メタデータトリブル」に似てるかも。
・5章のEAVに一番似てるかも。


★感想:
サーティワンフレーバーを最初読んだとき、この設計は無いわー、と私は思いました。
というのも、ふつーに第三正規系を思い浮かべると、この設計にはならないなぁ、と。
CHECK制約とかENUMとか思いつく方が珍しい気がする。

んでも、この日の読書会でいろいろな話を聞いて、このパターンを取りえる場合もあるのだなぁ、とあらためて勉強になりました。
あと、DBMSっていろんな機能をデフォで持ってるんやなぁ、と改めて気付かされた。
DOMEINとかCHECKとかENUMとか、これまで使ったことないし、存在さえ知らなかった。
上手に使えば、なんか使い道ありそうだ。

主催者の @natsu_nanana さん、参加者の皆さん、ありがとうございました~

★オマケ
勉強会の後、みんなでアイスクリームを買って帰るの巻。







関連記事
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://makopi23.blog.fc2.com/tb.php/115-a42bc4e4
この記事にトラックバックする(FC2ブログユーザー)

ケノーベルからリンクのご案内(2013/10/28 09:02)

春日井市エージェント:貴殿の記事ダイジェストをGoogle Earth(TM)とGoogle Map(TM)のエージェントに掲載いたしました。訪問をお待ちしています。

  • 2013/10/28(月) 09:02:11 |
  • ケノーベル エージェント