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