Suche senden
Hochladen
SQLアンチパターン読書会 第10章 サーティワンフレーバー
•
3 gefällt mir
•
4,503 views
tkfuji
Folgen
2013年10月17日開催のSQLアンチパターン読書会 の資料。「第10章 サーティワンフレーバー(31のフレーバー)」。
Weniger lesen
Mehr lesen
Bildung
Melden
Teilen
Melden
Teilen
1 von 30
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
REST API のコツ
REST API のコツ
pospome
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
RDBでのツリー表現入門
RDBでのツリー表現入門
Kent Ohashi
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
Tomoaki Uchida
Empfohlen
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
REST API のコツ
REST API のコツ
pospome
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
RDBでのツリー表現入門
RDBでのツリー表現入門
Kent Ohashi
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
Tomoaki Uchida
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
BigQueryの課金、節約しませんか
BigQueryの課金、節約しませんか
Ryuji Tamagawa
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
Sqlアンチパターン(メタデータトリブル)
Sqlアンチパターン(メタデータトリブル)
Tomoaki Uchida
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Tomoya Kawanishi
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Masashi Shibata
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
日本マイクロソフト株式会社
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
PHP の GC の話
PHP の GC の話
y-uti
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
ファントムファイル
ファントムファイル
Akura Pi
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
makopi 23
Weitere ähnliche Inhalte
Was ist angesagt?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
BigQueryの課金、節約しませんか
BigQueryの課金、節約しませんか
Ryuji Tamagawa
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
Sqlアンチパターン(メタデータトリブル)
Sqlアンチパターン(メタデータトリブル)
Tomoaki Uchida
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Tomoya Kawanishi
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Masashi Shibata
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
日本マイクロソフト株式会社
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
PHP の GC の話
PHP の GC の話
y-uti
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
Was ist angesagt?
(20)
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
BigQueryの課金、節約しませんか
BigQueryの課金、節約しませんか
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Sqlアンチパターン(メタデータトリブル)
Sqlアンチパターン(メタデータトリブル)
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
データベース設計徹底指南
データベース設計徹底指南
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
SQLチューニング入門 入門編
SQLチューニング入門 入門編
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
Django REST Framework における API 実装プラクティス | PyCon JP 2018
Django REST Framework における API 実装プラクティス | PyCon JP 2018
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
PHP の GC の話
PHP の GC の話
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
Andere mochten auch
ファントムファイル
ファントムファイル
Akura Pi
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
makopi 23
DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門
Akira Shimosako
SQLアンチパターン読書会 4章 キーレスエンエントリ(外部キー嫌い)
SQLアンチパターン読書会 4章 キーレスエンエントリ(外部キー嫌い)
makopi 23
Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829
Rikiya Kawakami
SQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイル
Itabashi Masayuki
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリ
Itabashi Masayuki
Postgre sql9.3新機能 (OSC hiroshima 2013)
Postgre sql9.3新機能 (OSC hiroshima 2013)
Soudai Sone
フィア・オブ・ジ・アンノウン
フィア・オブ・ジ・アンノウン
Akura Pi
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
Tomofumi Yagi
Firebird.performance.testing
Firebird.performance.testing
Mind The Firebird
Firebirdの障害対策
Firebirdの障害対策
Tsutomu Hayashi
Wtm
Wtm
Soudai Sone
描ける!ER図
描ける!ER図
Masahiro NAKAYAMA
High-load performance testing: Firebird 2.5, 3.0, 4.0
High-load performance testing: Firebird 2.5, 3.0, 4.0
Alexey Kovyazin
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門
Akira Shimosako
Postgre sqlから見るnosql
Postgre sqlから見るnosql
Soudai Sone
qpstudy 2013.07 NoSQL
qpstudy 2013.07 NoSQL
Akihiro Okuno
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
Shinnosuke Akita
おじさん二人が語る OOW デビューのススメ! Oracle OpenWorld 2016参加報告 [検閲版] 株式会社コーソル 杉本 篤信, 河野 敏彦
おじさん二人が語る OOW デビューのススメ! Oracle OpenWorld 2016参加報告 [検閲版] 株式会社コーソル 杉本 篤信, 河野 敏彦
CO-Sol for Community
Andere mochten auch
(20)
ファントムファイル
ファントムファイル
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
DBパフォーマンスチューニングの基礎:インデックス入門
DBパフォーマンスチューニングの基礎:インデックス入門
SQLアンチパターン読書会 4章 キーレスエンエントリ(外部キー嫌い)
SQLアンチパターン読書会 4章 キーレスエンエントリ(外部キー嫌い)
Ruby用REST APIクライアントの紹介 20150829
Ruby用REST APIクライアントの紹介 20150829
SQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイル
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリ
Postgre sql9.3新機能 (OSC hiroshima 2013)
Postgre sql9.3新機能 (OSC hiroshima 2013)
フィア・オブ・ジ・アンノウン
フィア・オブ・ジ・アンノウン
LibreOffice を Windows 上でビルドする UPDATE2
LibreOffice を Windows 上でビルドする UPDATE2
Firebird.performance.testing
Firebird.performance.testing
Firebirdの障害対策
Firebirdの障害対策
Wtm
Wtm
描ける!ER図
描ける!ER図
High-load performance testing: Firebird 2.5, 3.0, 4.0
High-load performance testing: Firebird 2.5, 3.0, 4.0
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門
Postgre sqlから見るnosql
Postgre sqlから見るnosql
qpstudy 2013.07 NoSQL
qpstudy 2013.07 NoSQL
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
おじさん二人が語る OOW デビューのススメ! Oracle OpenWorld 2016参加報告 [検閲版] 株式会社コーソル 杉本 篤信, 河野 敏彦
おじさん二人が語る OOW デビューのススメ! Oracle OpenWorld 2016参加報告 [検閲版] 株式会社コーソル 杉本 篤信, 河野 敏彦
Kürzlich hochgeladen
My Inspire High Award 2024 「正義って存在するの?」
My Inspire High Award 2024 「正義って存在するの?」
inspirehighstaff03
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
inspirehighstaff03
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
Ken Fukui
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
Ken Fukui
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」
inspirehighstaff03
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
inspirehighstaff03
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
yukisuga3
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
Ken Fukui
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
inspirehighstaff03
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
inspirehighstaff03
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdf
oganekyokoi
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
inspirehighstaff03
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
inspirehighstaff03
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdf
oganekyokoi
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
Ken Fukui
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
inspirehighstaff03
My Inspire High Award 2024 「孤独は敵なのか?」
My Inspire High Award 2024 「孤独は敵なのか?」
inspirehighstaff03
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
inspirehighstaff03
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
inspirehighstaff03
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
ssusere0a682
Kürzlich hochgeladen
(20)
My Inspire High Award 2024 「正義って存在するの?」
My Inspire High Award 2024 「正義って存在するの?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdf
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdf
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024 「孤独は敵なのか?」
My Inspire High Award 2024 「孤独は敵なのか?」
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
SQLアンチパターン読書会 第10章 サーティワンフレーバー
1.
SQLアンチパターン読書会 第10章 サーティワンフレーバー(31のフレーバー) 2013/10/17 ふじもと たかひさ
Twitter:@tkfuji 1
2.
アンチパターンの目的 サーティワンフレーバーの目的は列を特定の値に限定 すること。 値リストを列のデータ型や制約の宣言時に行うことで (値リストにない)無効な文字列の入力を防止でき る。 2
3.
敬称列の例 値の種類が少ない列、連絡先情報テーブルの敬称 (salutation)列が典型。 31-Flavors/intro/create-table.sql CREATE TABLE PersonalContacts
( -- 他の列. . . salutation VARCHAR(4) CHECK (salutation IN ('Mr.', 'Mrs.', 'Ms.', 'Dr.', 'Rev.')), ); 3
4.
敬称列の例 上司からあなたに与えられたタスク:新しい敬称をサポート するために連絡先テーブルを変更せよ 敬称(salutation)列の現在の値 Mr. , Mrs.
, Ms. , Dr. (博士), Rev. (聖職者) フランスに支社を開設⇒フランス後の敬称が新たに必要。 M. , Mme, , Mlle. など 来月ブラジルにも支社を開設予定⇒ポルトガル語も必要? 無停止でテーブル定義が修正できるか? 4
5.
バスキン・ロビンス社のサーティワンアイスクリーム バスキン・ロビンス社が毎月日替わりで違う種類のアイスクリー ムが食べられる。キャッチフレーズ「31のフレーバー」 現在、21種類の定番フレーバー、12種類のシーズン限定フレー バー、16種類の地域限定フレーバー、今月のフレーバーと可変 になっている。 (何れも『SQLアンチパターン』の記述から) 5
6.
アンチパターン アンチパターン:限定する値を列定義で指定する。 有効なデータ値を列の定義時に指定する方法を取る。例えば、 CHECK制約を定義する。CHECK制約により制約条件がFALSE になる値の挿入や更新を拒否する。 31-Flavors/anti/create-table-check.sql CREATE TABLE Bugs
( -- 他の列. . . status VARCHAR(20) CHECK (status IN ('NEW', 'IN PROGRESS', 'FIXED')) ); 6
7.
アンチパターンの実現方法 CHECK制約を用いる。 ENUMと呼ばれる非標準のデータ型を用いる(MySQL固 有?)。 ドメイン(DOMAIN)を用いる。 ユーザー定義型(UDT)を用いる。 許可する値を指定したトリガーを記述する。 ⇒上記には共通の短所がある。 7
8.
アンチパターンの短所 シンプルなクエリでは完全なリストを取得できない場 合がある。 31-Flavors/anti/create-table-check.sql SELECT DISTINCT status
FROM Bugs; ⇒全てのバグのステータスがNEWの場合、NEWし か返って来ない。 8
9.
アンチパターンの短所 メタデータの定義を取得する。MySQLではシステム ビューinformation_schemaを検索する。 31-Flavors/anti/information-schema.sql SELECT column_type FROM information_schema.columns WHERE
table_schema = 'bugtracker_schema' AND table_name = 'bugs' AND column_name = 'status'; ⇒全てのバグのステータスを含んだ文字列が返って来 る。ENUMで定義した文字列「ENUM('NEW', 'IN PROGRESS', 'FIXED')」をアプリケーションで解析して、値を抽出する。 9
10.
新しいフレーバーの追加 ENUMやCHECK制約で値を追加、削除はできな い。 31-Flavors/anti/add-enum-value.sql ALTER TABLE Bugs
MODIFY COLUMN status ENUM('NEW', 'IN PROGRESS', 'FIXED', 'DUPLICATE'); 10
11.
アンチパターンは移植が困難 データベース製品間で仕様が異なる。 CHECK制約 ENUM ドメイン(DOMAIN) ユーザー定義型(UDT) トリガー 11
12.
アンチパターンは移植が困難 ふじもと調べ アンチパターンの対応状況(○:対応、 :非対応) ANSI Postgre SQL 標準 SQL CHECK制約 ENUM DOMAIN UDT SQL89で 標準化 なし SQL92で 標準化 SQL99で 標準化 MySQL Oracle SQL Server DB2 UDB ○ × ○ ○ ○ ○ × × × ○ ○ × × × × ○ × ○ ○ ○ 12
13.
CHECK制約の実装状況 ふじもと調べ PostgreSQL 特定の列の値がブーリアン(真の値)の式を満たすように指定できる。列制約またはテーブル制約と して指定可能。ただし、列制約として定義してもテーブル制約として管理される。 MySQL なし。「CHECK 条項は、全てのストレージ エンジンに解析されますが、無視されます。」(
マニ ュアルから) Oracle 特定の列の値がブーリアン(真の値)の式を満たすように指定できる。列制約またはテーブル制約と して指定可能。 SQL Server 特定の列の値がブーリアン(真の値)の式を満たすように指定できる。列制約またはテーブル制約と して指定可能。 DB2 UDB 列制約またはテーブル制約として指定可能。チェック条件は2MBのCLOBとして管理。 13
14.
CHECK制約の実装状況 ふじもと調べ SQL Serverのマニュアルから 「列に格納される値を制御するという点では、CHECK 制約は
FOREIGN KEY 制約に似ています。異なる点は、有効な値を決定する方法です。 FOREIGN KEY 制約では別のテーブルから有効な値の一覧が取得されます が、CHECK 制約では論理式から有効な値が決定されます。」 ⇒CHECK制約(アンチパターン)の代替として 参照テーブル(解決策)が提示されている。 14
15.
ENUMの実装状況 ふじもと調べ PostgreSQL 8.3からサポート。CREATE TYPEコマンドで実現。列挙型内の値の順序はその型が作成された時 に値を列挙した順番になる。 MySQL 文字列タイプのひとつ。文字列タイプにはCHAR、VARCHAR、BINARY、VARBINARY、 BLOB、TEXT、ENUM、SETがある。 ENUMはテーブルを作成する際カラム仕様の中で明確に列挙された許容値リストから選択された値を 持つ文字列オブジェクトである。ENUM('one', 'two',
'three') のように1つのENUMは最大 65,535エレメントを持つことができる。 許容値の文字列または1から始まるインデックス値(定義順)で挿入が可能。許容しない値は特別エ ラー値として空文字(インデックス値は0)が登録される(ストリクトSQLモードを有効にすること より挿入を禁止することも可能)。NULL値のインデックス値はNULL。 Oracle / SQL Server / DB2 UDB なし。 15
16.
ドメイン(DOMAIN)の 実装状況 ふじもと調べ PostgreSQL CREATE DOMAINコマンドで実現。DEFAULT句、NOT
NULL制約、 CHECK制約などを定義する。 CREATE DOMAIN name [ AS ] data_type [ COLLATE collation ] [ DEFAULT expression ] [ constraint [ ... ] ] constraintは、次のようになります。 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK (expression) } ※ COLLATEは9.1から、CHECKは7.4から MySQL / Oracle / SQL Server / DB2 UDB なし。 16
17.
ユーザー定義型( UDT)の 実装状況 ふじもと調べ PostgreSQL CREATE
TYPEコマンドで実現。定義が面倒。 MySQL なし。 Oracle CREATE TYPE文とCREATE TYPE BODY文を使用する。CREATE TYPE BODY文でPL/ SQLを使用して定義する。 SQL Server CREATE TYPEステートメントを使用する。C#やVBの.NETプログラミング言語で、UDT の作 成の仕様を満たすクラスまたは構造体を作成する。 DB2 UDB ユーザー定義の構造化タイプ。CREATE DISTINCT TYPEステートメントを使用する。既存のデ ータ・タイプを基に定義する。UDF(ユーザー定義関数)でUDTの振る舞いを定義する。 17
18.
アンチパターンの見つけ方 「アプリケーションメニューの選択肢を1つ追加するには、データベースを オフラインにしなければならない。すべてがうまくいけば、30分もかから ないはずだ」 ⇒列の定義時に値が指定されている。サービス中断は本来必要ない。 「status列は、以下の値のうちの1つを持つことができる。このリストの 修正が必要になることは、まずないはずだ」 ⇒曖昧な表現。状況が変われば修正が必要になるかも。 「アプリケーションコード側の値リストが、ビジネスルールと同期していな い。これで何度目だろう」 ⇒異なる場所で情報を二重管理していると生じるリスク。 18
19.
アンチパターンを用いてよい場合 有効値の変更が不要だと断言できる場合はアンチパターンを用い てよい。 例えば、相互排他的な2つの値(左/右、有効/無効、オン/ オフ、内部/外部)を指定する場合など。 19
20.
解決策:限定する値をデータ で指定する 参照するテーブルBugStatusを作成し、許可する値 をstatus列に格納する。Bugs.statusに BugStatusを参照する外部キー制約を宣言する。 31-Flavors/soln/create-lookup-table.sql CREATE TABLE BugStatus
( status VARCHAR(20) PRIMARY KEY ); INSERT INTO BugStatus (status) VALUES ('NEW'), ('IN PROGRESS'), ('FIXED'); CREATE TABLE Bugs ( -- 他の列. . . status VARCHAR(20), FOREIGN KEY (status) REFERENCES BugStatus(status) ON UPDATE CASCADE ); 20
21.
解決策での値セットの取得 シンプルなクエリで値リストを取得できる。 31-Flavors/soln/query-canonical-values.sql SELECT status FROM
BugStatus ORDER BY status; ⇒全てのバグのステータスがBugsでNEWの場合 でも全ての値が取得可能。 21
22.
解決策での値追加 INSERT文で値を追加できる。テーブルへのアクセス遮断も不 要。 31-Flavors/soln/insert-value.sql INSERT INTO BugStatus
(status) VALUES ('DUPLICATE'); 22
23.
解決策での値削除 Bugsテーブルから参照されている場合、削除できない。 BugStatusにactive列(有効/無効)を追加する。 31-Flavors/soln/inactive.sql ALTER TABLE BugStatus
ADD COLUMN active ENUM('INACTIVE', 'ACTIVE') NOT NULL DEFAULT 'ACTIVE'; DELETEではなくUPDATEを使う。 31-Flavors/soln/update-inactive.sql UPDATE BugStatus SET active = 'INACTIVE' WHERE status = 'DUPLICATE'; 有効なものだけ検索する。 31-Flavors/soln/select-active.sql SELECT status FROM BugStatus WHERE active = 'ACTIVE'; 23
24.
31のフレーバーなのか? ふじもと調べ バスキン・ロビンス社が毎月日替わりで違う種類のアイスクリー ムが食べられる。キャッチフレーズ「31のフレーバー」 現在、21種類の定番フレーバー、12種類のシーズン限定フレー バー、16種類の地域限定フレーバー、今月のフレーバーと可変 になっている。(上記は『SQLアンチパターン』の記述から) ⇒(日本)22種類の定番フレーバー、6種類のシーズン限定フレ ーバー、4種類の今月のフレーバー⇒合計32種類のフレーバー? ⇒(アメリカ)24種類の定番フレーバー、28種類のシーズン限 定フレーバー、5種類のチョイスフレーバー⇒合計57種類のフレ ーバー? (それぞれ日本とUSのWebサイトから) 24
25.
31のフレーバーか? サーティワンアイスクリーム行ってみた 南砂町店(江東区) 32種類でした!4 4(写真) 2 25
26.
バスキン・ロビンス社のサーティワンアイスクリームの 豆知識 ふじもと調べ(Wikipediaを参考) 創業者がバートン・バスキンとアーヴィン・ロビンス。 バートン・バスキンはアーヴィン・ロビンス の義理の兄(姉の夫)。 アーヴィン・ロビンスの父親がアイスクリーム店を経営し、二人にアイスクリーム店開業を勧める。 その後、その二つの店が合併した。 アメリカでは「バスキン・ロビンス(Baskin-Robbins)」で通じるが、「サーティワン (thirty-one)」では通じない(thirty-oneの呼称自体無い)。日本と台湾では「サーティワ ン」で通じるが、「バスキン・ロビンス」では通じにくい。「サーティーワン」ではなく「サーティ ワン」。 日本ではアメリカのバスキン・ロビンス社日本法人と不二家(各43.27%の出資比率)の合弁会社が 経営。年間売上200億円(平均単価400円として5000万個の売上。1100店として一日当たり 125個の売上)。サーティワンアイスクリームが不二家との合弁であることが知られていないため、 「不二家の期限切れ原材料使用問題」による影響は比較的小さかった。 フレーバーの種類は1000種類以上。フレーバーは世界どこでも大抵32種 類から選べる(高速道路施設などの小規模店は除く)。 26
27.
アンチパターンを31のフレーバーに用 いてはいけない理由 ふじもと考察 1000種類以上の開発済みのフレーバーから32種類のフレーバ ーが販売される。 今月のフレーバーは月単位で入れ替えあり。 シーズン限定フレーバーは季節単位で入れ替えあり。 定番フレーバーすら入れ替えが想定される。 32種類より少ないフレーバーを販売する店もある。 種別(定番・シーズン限定・今月)も管理したいだろう。 27
28.
31のフレーバーは解決策参照テーブル で実現するべき どうやって実現 するかは宿題! 28
29.
31のフレーバーは解決策参照テーブル で実現するべきヒント(≒答え) 販売明細テーブルにフレーバーを示すカラムがある。これをアンチパターン (フレーバーを示すカラムに値リストを設定)を用いないで解決する。 1000種類以上の開発済みのフレーバーを管理するフレーバーテーブル。フレー バー種別カラムを持つ。 地域フレーバーテーブル。地域テーブルとフレーバーテーブルと従属関係にある 子テーブル。年月を主キーとして加える(有効開始年月日でもよい)。 店舗フレーバーテーブル。地域フレーバーテーブルと店舗テーブルと従属関係に ある子テーブル。年月を主キーとして加える(有効開始年月日でもよい)。 販売明細は地域フレーバーテーブル(通常店の場合)か店舗フレーバーテーブル (小規模店の場合)と参照関係を持つ。 29
30.
おまけ:SQLデモ 本のサンプルコードを基に ENUMとCHECK制約のアンチパタ ーンのSQL作成。 本のサンプルコードは実行可能でないものも含まれるため。 http://www.oreilly.co.jp/books/ 9784873115894/ PostgreSQLで実行。MySQLは(サンプルコードにある) CHECK制約が実行できないため。 30
Jetzt herunterladen