Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
もうひとつのアンチパターン
OTLT、あるいは如何にして私は
オレオレフレームワークを
忌み嫌うようになったか
2018.01.27(Sat)
『SQLアンチパターン』読書会スペシャル
(NSEG 勉強会 #96) @ GEEKLAB.NAGA...
自己紹介
●
春原 宏保 (すのはら ひろやす)
●
3案件を回すフリーランスプログラマー
● PHP + MariaDB (週4日常駐)
● C# + SQL Azure (受託)
● Delphi + SQLite (受託)
●
長野市在住...
閑話休題
こんなテーブル、見たことある?
●
コードとその値のペアをテーブルに持ちたい
● 都道府県コードと都道府県名
● 性別コードと性別名
● 電話番号種別と電話番号
● etc…
code name
1 北海道
2 青森県
3 岩手県
4 宮城県
5 秋田県
prefectures
code name
1 男性
2 女性
3 法人
4 未回答
genders
code name
1 固定電話
2 携帯電話
3 FAX
t...
似たようなテーブルが増殖する
●
「コードとその値のペア」という構造は
それぞれのテーブルで同じ
●
ならば統合しちゃえばラクじゃない?
こんなテーブルが爆誕する
code_type code name
pref 1 北海道
pref 2 青森県
pref 3 岩手県
pref 4 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
telep...
人呼んで「One True Lookup Table」
●
よく言えばKey-Value Store
●
テーブル数が減ってスッキリ!
● ER図もごちゃつかない!
● 新しいコード体系が加わってもテーブルを
増やす必要がない!
● 情報が集約...
code_type code name
pref 1 北海道
pref 2 青森県
pref 3 岩手県
pref 4 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
telep...
kbn kbn_cd kbn_name
pref 01 北海道
pref 02 青森県
pref 03 岩手県
pref 04 宮城県
: : :
gender 1 男性
gender 2 女性
: : :
telephone 1 固定電話
t...
テーブル設計のポイント
●
kbnは適度な大きさの文字列型で
●
kbn_cdは必要十分な大きさの文字列型で
● コード値として文字列を持つコード体系の
データが加わる可能性があるため
● コード値が数字であるコード体系のデータは
ゼロパディン...
いずれテーブル定義の変更が必要に
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 白...
ほかにも問題山積
●
kbn_cdの制約を設定できない
● 例えばvarchar(5)だとして、都道府県コードの
正しい書式は次のどれ? ( _ は空白)
• 01___
• _1___
• 1
• 01
● kbn_cdの定義がvarchar...
ほかにも問題山積
●
kbnの重複登録の危険性
● genderというkbnがあることに気づかず
kbn = sexのデータを投入するとか
● errorというkbnがあることに気づかず
kbn = messagesのデータを投入するとか
● ...
ほかにも問題山積
●
数値を返してほしい時でもvarchar
● kbn_nameがvarcharなので仕方ない
● 同じ値でも「1.0」「1」「+1.00」など複数の
書式で格納されうるのがキモい
私の携わったプロジェクトでは──
●
設計時点においてOTLTありき
● ほかのプロジェクトでもそうやってきた
●
値が何でもかんでも文字列で返ってくるのが
気に入らない (Java 1.4でした)
実はそんなことは問題ではなかった
ここにも現れるエクセル・ホーガン氏
●
テーブル定義書からDAOやJavaBeansを
自動生成するExcelマクロ
● 生成されるソースを見ると、オブジェクト
指向を理解していない人が作ったのは明らか
● それもバグ持ちで、特定のメソッドの返...
素晴らしきかな、Mr. Bean
●
データベースのカラムの型にかかわらず
返り値はString型
● OTLTとかどうとかに関係ない
● 受け取った値をJava側でその都度型変換
● データ登録時も当然Stringで渡す
● 二度○ねとか思う
そもそもの問題は
●
「同一種類のデータの集合をひとつの
テーブルにまとめる」という関係モデルの
原理に反する設計である
● 生まれた時から設計ミス
● 『SQLアンチパターン』の「EAV(5章)」や
「ポリモーフィック関連(6章)」にも似た
...
さらに知りたい方は
●
データベース技術者のミックさんの記事
gihyo.jp: SQLアタマアカデミー 第3回
「テーブル設計のグレーゾーン~毒と薬は
紙一重(1) 単一参照テーブル~
テーブルにポリモフィズムは必要か」
http://gih...
アンチパターンの見つけ方
以下のような会話を耳にしたら(ry
●
「都道府県コードの区分名、何だっけ?」
●
「区分値って、何文字まで入る?」
●
「区分値の階層っていくつだっけ? 3階層の
区分値って持てる?」
アンチパターンを用いてもよい場合
●
あなたが正社員であり、
●
上司やプロジェクトリーダーが元COBOLer
(もしくはそういう人から教育を受けた人)で
あり、
●
正しい設計を啓蒙することで貴方の職が
危ぶまれることが予想される場合
反論?
でもやっぱり
ER図が見にくい……
●
貴方の仕事はER図を眺めてニヤニヤする
ことですか?
● 実装しやすく不具合の起きにくいデータ構造を
作るのが第一でしょうに
● kbnの更新はちゃんとできるの?
● そもそもER図の更新なんてしてるの?
テーブルが多いと
SQLが遅くならない?
●
なりません。
● ちゃんとインデックスを張りさえすれば
● 不安に思うのなら計測しましょう
DAOをたくさん作りたく
ないから、テーブルは少ない
ほうがいいなあ……
●
Javaの方ですか?
● そもそもどうしてDAOなんて作るんですか。す
べてのテーブルにいちいちゲッターだのセッ
ターだのfindByFooBar()だのと、使うかど...
Eclipseなら、コマンド一発で
DAOを自動生成できるよ?
(・∀・) カエレ!
                      _ /- イ、_
           __        /: : : : : : : : : : : (
  ...
結論
●
清く正しいテーブル設計をしましょう
● 長い目で見れば正しい設計は貴方を
救います
●
旧態依然のSIerは爆発しろ
●
オレオレフレームワークも○ね
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
もうひとつのアンチパターン OTLT、あるいは如何にして私はオレオレフレームワークを忌み嫌うようになったか
Upcoming SlideShare
Loading in …5
×

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

556 views

Published on

2018/1/27 開催「『SQL アンチパターン』読書会スペシャル」(NSEG #96)での発表資料

Published in: Technology
  • Be the first to comment

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

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

×