狠狠撸

狠狠撸Share a Scribd company logo
もうひとつのアンチパターン
OTLT、あるいは如何にして私は
オレオレフレームワークを
忌み嫌うようになったか
2018.01.27(Sat)
『SQLアンチパターン』読書会スペシャル
(NSEG 勉強会 #96) @ GEEKLAB.NAGANO
自己紹介
●
春原 宏保 (すのはら ひろやす)
●
3案件を回すフリーランスプログラマー
● PHP + MariaDB (週4日常駐)
● C# + SQL Azure (受託)
● Delphi + SQLite (受託)
●
長野市在住、しかし平日は新宿区住まい
●
苦手なモノ: テストコードを書くこと
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
闲话休题
こんなテーブル、見たことある?
●
コードとその値のペアをテーブルに持ちたい
● 都道府県コードと都道府県名
● 性別コードと性別名
● 電話番号種別と電話番号
● etc…
code name
1 北海道
2 青森県
3 岩手県
4 宮城県
5 秋田県
prefectures
code name
1 男性
2 女性
3 法人
4 未回答
genders
code name
1 固定電話
2 携帯電話
3 FAX
telephone_types
似たようなテーブルが増殖する
●
「コードとその値のペア」という構造は
それぞれのテーブルで同じ
●
ならば統合しちゃえばラクじゃない?
こんなテーブルが爆誕する
code_type code name
pref 1 北海道
pref 2 青森県
pref 3 岩手県
pref 4 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
telephone 2 携帯電話
コードタイプ コード値 内容
人呼んで「One True Lookup Table」
●
よく言えばKey-Value Store
●
テーブル数が減ってスッキリ!
● ER図もごちゃつかない!
● 新しいコード体系が加わってもテーブルを
増やす必要がない!
● 情報が集約されていて便利!
●
SIer、もしくはSIer出身の技術者が好んで
使うイメージ
(※個人の感想です)
code_type code name
pref 1 北海道
pref 2 青森県
pref 3 岩手県
pref 4 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
telephone 2 携帯電話
あんまりSIerの臭いがしない? ならば──
kbn kbn_cd kbn_name
pref 01 北海道
pref 02 青森県
pref 03 岩手県
pref 04 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
telephone 2 携帯電話
これで一気にSIer風味に!!
テーブル設計のポイント
●
kbnは適度な大きさの文字列型で
●
kbn_cdは必要十分な大きさの文字列型で
● コード値として文字列を持つコード体系の
データが加わる可能性があるため
● コード値が数字であるコード体系のデータは
ゼロパディングする (例: 都道府県コード)
●
kbn_nameももちろん文字列型で
いずれテーブル定義の変更が必要に
kbn kbn_cd kbn_name
error E01495678B01
予期しないエラーが
発生しました。カス
タマーサポートに連
絡してください。
想定より長い
kbn_cdが
現れた!
いずれテーブル定義の変更が必要に
kbn kbn_cd sub_kbn_cd kbn_name
office japan nagano 長野本社
office japan matsumoto 松本本社
office japan hakuba 白馬支社
office japan karuizawa 軽井沢営業所
区分値の
下位要素が
追加に!
ほかにも問題山積
●
kbn_cdの制約を設定できない
● 例えばvarchar(5)だとして、都道府県コードの
正しい書式は次のどれ? ( _ は空白)
? 01___
? _1___
? 1
? 01
● kbn_cdの定義がvarchar(10)に変更されたら、
都道府県コードの書式も変える?
バグの元!!
ほかにも問題山積
●
kbnの重複登録の危険性
● genderというkbnがあることに気づかず
kbn = sexのデータを投入するとか
● errorというkbnがあることに気づかず
kbn = messagesのデータを投入するとか
● こういうミスをなくすため、kbnの管理を
エクセル?ホーガン氏に依頼
ほかにも問題山積
●
数値を返してほしい時でもvarchar
● kbn_nameがvarcharなので仕方ない
● 同じ値でも「1.0」「1」「+1.00」など複数の
書式で格納されうるのがキモい
私の携わったプロジェクトでは──
●
設計時点においてOTLTありき
● ほかのプロジェクトでもそうやってきた
●
値が何でもかんでも文字列で返ってくるのが
気に入らない (Java 1.4でした)
実はそんなことは問題ではなかった
ここにも現れるエクセル?ホーガン氏
●
テーブル定義書からDAOやJavaBeansを
自動生成するExcelマクロ
● 生成されるソースを見ると、オブジェクト
指向を理解していない人が作ったのは明らか
● それもバグ持ちで、特定のメソッドの返り値が
おかしい
→知らずに使っていてしばらく悩んだが、
 上司に相談したら「あ、それバグだよ」
● しかもそのツールの名前が「Mr. Bean」
● ○ねとか思う
素晴らしきかな、Mr. Bean
●
データベースのカラムの型にかかわらず
返り値はString型
● OTLTとかどうとかに関係ない
● 受け取った値をJava側でその都度型変換
● データ登録時も当然Stringで渡す
● 二度○ねとか思う
そもそもの問題は
●
「同一種類のデータの集合をひとつの
テーブルにまとめる」という関係モデルの
原理に反する設計である
● 生まれた時から設計ミス
● 『SQLアンチパターン』の「EAV(5章)」や
「ポリモーフィック関連(6章)」にも似た
きな臭さを感じる
さらに知りたい方は
●
データベース技術者のミックさんの記事
gihyo.jp: SQLアタマアカデミー 第3回
「テーブル設計のグレーゾーン~毒と薬は
紙一重(1) 単一参照テーブル~
テーブルにポリモフィズムは必要か」
http://gihyo.jp/dev/serial/01/sql_academy2/000301
アンチパターンの見つけ方
以下のような会話を耳にしたら(ry
●
「都道府県コードの区分名、何だっけ?」
●
「区分値って、何文字まで入る?」
●
「区分値の階層っていくつだっけ? 3階層の
区分値って持てる?」
アンチパターンを用いてもよい場合
●
あなたが正社員であり、
●
上司やプロジェクトリーダーが元COBOLer
(もしくはそういう人から教育を受けた人)で
あり、
●
正しい設計を啓蒙することで貴方の職が
危ぶまれることが予想される場合
反论?
でもやっぱり
ER図が見にくい……
●
貴方の仕事はER図を眺めてニヤニヤする
ことですか?
● 実装しやすく不具合の起きにくいデータ構造を
作るのが第一でしょうに
● kbnの更新はちゃんとできるの?
● そもそも贰搁図の更新なんてしてるの?
テーブルが多いと
SQLが遅くならない?
●
なりません。
● ちゃんとインデックスを張りさえすれば
● 不安に思うのなら計測しましょう
DAOをたくさん作りたく
ないから、テーブルは少ない
ほうがいいなあ……
●
Javaの方ですか?
● そもそもどうしてDAOなんて作るんですか。す
べてのテーブルにいちいちゲッターだのセッ
ターだのfindByFooBar()だのと、使うかどうかも
分からないメソッドやフィールドを作りまくっ
て保守性を下げて何が嬉しいんですか。何も考
えずにDAOだのJavaBeansだのを作るのと、何
も考えずにOTLTを作るのと、本質的に何が違う
んですか。思考停止じゃありませんか。そんな
Eclipseなら、コマンド一発で
DAOを自動生成できるよ?
(???) カエレ!
                      _ /- イ?_
           __        /: : : : : : : : : : : (
          〈〈〈〈 ヽ     /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
          〈?  }     {:: : : :ノ --‐' ?_\: : ::}
   ∩___∩  |   |      {:: : :ノ ,_;:;:;ノ? ェ? ヾ: :::}
   | ノ      ヽ !   !   、  l: :? /二―-? |: ::?
  /  ●   ● |  /   ,,?_  | //   ̄7/ /::ノ
  |    ( _●_)  ミ/ , ’,∴ ? ¨  〉(_二─-┘{/
 彡?   |∪|  /  ??∵ ’  /?//|  ̄ ̄ヽ
/ __  ヽノ /         /   // |//\ 〉
(___)   /         /    //   /\ /
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
結論
●
清く正しいテーブル設計をしましょう
● 長い目で見れば正しい設計は貴方を
救います
●
旧態依然のSIerは爆発しろ
●
オレオレフレームワークも○ね

More Related Content

もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか