SlideShare a Scribd company logo
1 of 18
Download to read offline
SQLアンチパターン
読書会
2013/08/08
第7章
マルチカラムアトリビュート
アジェンダ
1. 目的:複数の値を持つ属性を格納する
2. アンチパターン:複数の値を定義する
3. アンチパターンの見つけ方
4. アンチパターンを用いてもよい場合
5. 解決策:従属テーブルを作成する
 
目的:複数の値を持つ属性を格納する
1つのテーブルに属するべきと思える属性に複数の
値がある場合にそれをどうやって格納するか。
あれ? 第1章「ジェイウォーク(信号無視)」と同じこと
なの?
 例) アンチパターンの一例として、あるカラムに複数の値を格
納するためにカンマ区切りの値を格納してた。
今回の場合は、複数のカラムを用意して
それぞれに値を格納するパターン。
例)
アンチパターン:複数の列を定義する
アンチパターンとなる所以
【検索が大変】
 複数のカラムに検索対象となる値を比較しに行く
のでSQLが複雑かつ見難くなる。
多少見やすくもなるけど....
SELECT * FROM Bugs
WHERE (tag1 = ‘crash’ OR tag2 = ‘crash’ OR tag3 = ‘crash’)
AND (tag1 = ‘hdd’ OR tag2 = ‘hdd’ OR tag3 = ‘hdd’)
SELECT * FROM Bugs
WHERE ‘crash’ IN (tag1, tag2, tag3)
AND ‘hdd’ IN (tag1, tag2, tag3)
アンチパターンとなる所以2
【値の追加と削除が大変】
例)タグ”Soon”を追加したい。
アンチパターンとなる所以
■対処法
※値のない空いているカラムは、目視やアプリケーション内で確
認する必要がある。
また、外の処理からの横槍(上書きとか)の考慮も必要。
1. 空のカラムを探して
2. UPDATE文実行
アンチパターンとなる所以2
なら
 ・NULLIFを使って同時更新!
・WHEN〜THEN句を使って更新!
UPDATE Bugs
SET tag1 = NULLIF(tag1, ‘performance’),
tag2= NULLIF(tag2, ‘performance’),
tag3= NULLIF(tag3, ‘performance’);
UPDATE Bugs
SET tag1 = CASE
WHEN ‘performance’ IN (tag2, tag3) THEN tag1
ELSE COALESCE (tag1, ‘persormance’) END
アンチパターンとなる所以3
【一意性の保証が持てない】
制約を入れられる手段がないから、用意したカラム
(tag1,tag2,tag3....)に同じ値を入れることも可能。
INSERT INTO Bugs (description, tag1, tag2, tag3)
VALUES (‘印刷が遅い’, ‘printing’,’performance’,’performance’)
アンチパターンとなる所以4
【え?もっと入れるんですか?】
カラム(列数)が固定となるため、状況によっては用
意したカラムの数では足りなくなることもある。
  ならカラム増やせばいいじゃん
   (ALTER TABLE 〜 ADD COLUMN文の発行)
えっ!?(´・ω`・)エッ?
アンチパターンとなる所以4
えっ!?(´・ω`・)エッ?
 
 テーブルの構造を変えると、外部からのアクセスを一時的に遮
断する必要がある。
 カラムを追加した新テーブルを用意して、旧テーブルから内容
をコピーする方法もある。
が、場合によってはデータ転送に時間がかかる。
 カラムを追加したテーブルを参照するすべてのSQL(クライア
ント)に対して、追加したカラムも扱うように知り必要もある。
(バグの匂いがプンプンするぜ)
アンチパターンの見つけ方
ユーザインタフェースやプロジェクトの
ドキュメント(仕様書)に、複数の値を割り当てるもの
の、上限が決められているような記述・説明があっ
た場合。
 
例) タグ  :「タグは最大5つまで記述が可能」
   電話番号:自宅、携帯、FAX、日中の連絡先・・・
対話の中で「サポートすべきxxxxの数っていくつまで?」
「SQLで複数の列を同時に検索する方法って知ってる」
が出てきた時。
アンチパターンを用いてもいい場合
【列の順番が意味を成すとき】
例)各列にはユーザ名が入るが、それぞれに
「発見者」「修正者」「承認者」と意味を持つ場合。
(カラム名そのものを関連する意味を持つようにさせるとベター)
アンチパターンを用いてもいい場合
【従属テーブルを作成するとき】
例)BugsテーブルからAccountテーブルへ複数の関連を持つ従
属テーブルを作成するとき。
(ただしEAVパターンでの””問題が発生することもあるので注意)
解決策:従属テーブルを作成する
属性を格納する列を1つ持つ従属テーブルを作成
し、属性を格納する。
例)
更新や削除対象が従属テーブル側になるので楽チン。
PRIMARYキーの制約もつければ、重複も防げる。
解決策:従属テーブルを作成する
ちなみに、第1章「ジェイウォーク」での解決方法は
交差テーブルを作る。 でした。
まとめ
おなじ意味を持つ値は、
1つの列に格納するようにしましょう
そして私見
今回のタグ名の用意、1〜∞のような事例が想定されるなら従属
テーブルを用意して対応。
電話番号程度の3つくらいまでなら設計・運用でカバーすれば
いいんじゃない?
以上。
ご清聴、ありがとうございました。
[@naopi]

More Related Content

Viewers also liked

SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」makopi 23
 
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)Developers Summit
 
夏サミ2013【A1】基礎からわかるDevOps
夏サミ2013【A1】基礎からわかるDevOps夏サミ2013【A1】基礎からわかるDevOps
夏サミ2013【A1】基礎からわかるDevOpsDevelopers Summit
 
Sqlアンチパターン読書会 インプリシットカラム
Sqlアンチパターン読書会 インプリシットカラムSqlアンチパターン読書会 インプリシットカラム
Sqlアンチパターン読書会 インプリシットカラムHiroyuki Ohnaka
 
実践!データベースリファクタリングツール
実践!データベースリファクタリングツール実践!データベースリファクタリングツール
実践!データベースリファクタリングツールTatsunori Matoba
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章nihon buson
 
20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回都元ダイスケ Miyamoto
 
第4章 自動比較
第4章 自動比較第4章 自動比較
第4章 自動比較toku toku
 
WooCommerce & Apple TV
WooCommerce & Apple TVWooCommerce & Apple TV
WooCommerce & Apple TVMarko Heijnen
 
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグアジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグDai FUJIHARA
 
テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523dnoguchi
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章aomori ringo
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料Masatoshi Itoh
 
文芸的プログラミング
文芸的プログラミング文芸的プログラミング
文芸的プログラミングShoko Sasaki
 
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜gree_tech
 
20150418 システムテスト自動化 第二章
20150418 システムテスト自動化 第二章20150418 システムテスト自動化 第二章
20150418 システムテスト自動化 第二章atsushi ishiji
 
LeanCustomerDevelopment
LeanCustomerDevelopmentLeanCustomerDevelopment
LeanCustomerDevelopmentKouki Kawagoi
 
TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)none_toka
 

Viewers also liked (20)

SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン読書会 「スパゲッティクエリ」
 
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)
夏サミ2013 基調講演 「DevOpsは開発現場とビジネスの間に何を生むか?」(新野淳一氏)
 
夏サミ2013【A1】基礎からわかるDevOps
夏サミ2013【A1】基礎からわかるDevOps夏サミ2013【A1】基礎からわかるDevOps
夏サミ2013【A1】基礎からわかるDevOps
 
Sqlアンチパターン読書会 インプリシットカラム
Sqlアンチパターン読書会 インプリシットカラムSqlアンチパターン読書会 インプリシットカラム
Sqlアンチパターン読書会 インプリシットカラム
 
実践!データベースリファクタリングツール
実践!データベースリファクタリングツール実践!データベースリファクタリングツール
実践!データベースリファクタリングツール
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章システムテスト自動化標準ガイド第7章
システムテスト自動化標準ガイド第7章
 
20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回20120830 DBリファクタリング読書会第三回
20120830 DBリファクタリング読書会第三回
 
第4章 自動比較
第4章 自動比較第4章 自動比較
第4章 自動比較
 
WooCommerce & Apple TV
WooCommerce & Apple TVWooCommerce & Apple TV
WooCommerce & Apple TV
 
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグアジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
アジャイルリーダーシップと組織改革 ~楽天のアジャイル開発というリアル~ エピローグ
 
テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料
 
文芸的プログラミング
文芸的プログラミング文芸的プログラミング
文芸的プログラミング
 
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜[デブサミ2015] スクラムならうまくいく?〜グリーのネイティブゲーム作りの歴史をひもとく、そして未来へ〜
[デブサミ2015] スクラムならうまくいく? 〜グリーのネイティブゲーム作りの歴史をひもとく、 そして未来へ〜
 
20150418 システムテスト自動化 第二章
20150418 システムテスト自動化 第二章20150418 システムテスト自動化 第二章
20150418 システムテスト自動化 第二章
 
LeanCustomerDevelopment
LeanCustomerDevelopmentLeanCustomerDevelopment
LeanCustomerDevelopment
 
TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)TAPL勉強会 第1章 (2012-07-17)
TAPL勉強会 第1章 (2012-07-17)
 

Sqlアンチパターン読書会 #7スライド資料