SlideShare a Scribd company logo
1 of 15
Download to read offline
インプリシットカラム(暗黙の列)
2014/4/25 SQLアンチパターン読書会
大中浩行(@setoazusa)
Copyright 2014 Hiroyuki Ohnaka
自己紹介
• 大中浩行 (Ohnaka, Hiroyuki)
• 泣き笑いせつなポップ中年。
• yokohama.devtesting / devtesting-ja
• @setoazusa
• http://blog.fieldnotes.jp/
• Javaプログラマ
• グロースエクスパートナーズ(株)所属
Copyright 2014 Hiroyuki Ohnaka
• シンプルなクエリー
SELECT * FROM Books b INNER JOIN Authors a ON
b.author_id = a.author_id;
• 全ての書籍の書名にNULLを返す
• データベースのBooksテーブルとAuthorsテーブルには、
どちらにも、title列があります。
Copyright 2014 Hiroyuki Ohnaka
• 列にエイリアスを宣言してどちらかのtitle列に別の名前を与
える
SELECT b.title, a.title AS salutation
FROM Books b INNER JOIN Authors a ON b.author_id =
a.author_id;
• 「1つの列にはエイリアスを付けて、かつ他の列もすべて取
得するにはどうすればいいか?」
Copyright 2014 Hiroyuki Ohnaka
目的:タイプ数を減らす
• ソフトウェア開発者は概して、キーをたくさん打つ
ことを好みません。
• ワイルドカード記号のアスタリクス(*)を使うと、
列名のリストは明示的ではなく暗黙的に指定されま
す。
Copyright 2014 Hiroyuki Ohnaka
アンチパターン:ショートカットの罠に陥る
• テーブルに列を追加した結果、エラーを返すようにな
るinsert文
• 列を(列名でなく)添え字で参照していたため、列を削
除した結果動かなくなるselect文
• パフォーマンスとスケーラビリティーの問題
• O/Rフレームワークでは、オブジェクトのフィールドに値
を代入するために、ワイルドカードがデフォルトで使われ
ていることがあります。
Copyright 2014 Hiroyuki Ohnaka
• 求めなければ得られない
• SQLでは「不要な列以外のすべての列」を意味する構文はサ
ポートされていません。
アンチパターンの見つけ方
• 「アプリケーションに障害が発生した。」
• 「何日もかけて、ようやくネットワークのボトルネック
を突き詰めた。」
Copyright 2014 Hiroyuki Ohnaka
アンチパターンを用いてもよい場合
• アドホックなSQLを用いてもいい場合
Copyright 2014 Hiroyuki Ohnaka
解決策:列名を明示的に指定する
SELECT bug_id, date_reported, summary, description, resolution,
reported_by, assigned_to, verified_by, status, priority, hours
FROM Bugs;
• 列を明示的に指定することで、本章で見てきたエラーや混乱が発生しにく
くなります。
• ワイルドカードを使えない局面はいずれ訪れる
Copyright 2014 Hiroyuki Ohnaka
おまけ:某O/Rマッパーの話
• 自動生成するSQLで当初は、ワイルドカードを使っていた
• joinを当初サポートしておらず、
• テーブルとEntityのプロパティの関係を、フレームワーク側で完全に制
御できるため。
• 取得する列を制限する機能は、フレームワーク側から見ると、余
りやりたくない
• DB側のモデリングとアプリケーション側のモデリングに不整合が起き
る(not nullなカラムに対応するプロパティにnullが入る)
• APIのインターフェースが複雑になる
Copyright 2014 Hiroyuki Ohnaka
• ところが、その後の仕様変更でjoinをサポートするように
なったため、ワイルドカードが使えなくなった
• Entityにマッピングするときに、テーブル名とカラム名
の対応を取れるようにするため、別名をつけてSQLを生
成するようにした
Copyright 2014 Hiroyuki Ohnaka
select
emp.empno as emp_empno,
emp.ename as emp_ename,
(略)
dept.deptno as dept_deptno,
dept.dname as dept_dname,
(略)
from
emp
left outer join
dept
on emp.deptno = dept.deptno
Copyright 2014 Hiroyuki Ohnaka
• しかし、テーブル名と列名をそのままつなげて別名を生
成していたため、Oracleの識別子の長さ制限にひっか
かってしまいました...
• 最終的に、次のようになりました。
Copyright 2014 Hiroyuki Ohnaka
select
emp.empno as T1_C1,
emp.ename as T1_C2,
(略)
dept.deptno as T2_C1,
dept.dname as T2_C2,
(略)
from
emp
left outer join
dept
on emp.deptno = dept.deptno

More Related Content

More from Hiroyuki Ohnaka

ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話Hiroyuki Ohnaka
 
「WindowsデスクトップでWeb開発 改訂版」サンプル
「WindowsデスクトップでWeb開発 改訂版」サンプル「WindowsデスクトップでWeb開発 改訂版」サンプル
「WindowsデスクトップでWeb開発 改訂版」サンプルHiroyuki Ohnaka
 
Microsoft DocsにContributeした話
Microsoft DocsにContributeした話Microsoft DocsにContributeした話
Microsoft DocsにContributeした話Hiroyuki Ohnaka
 
Azure functions+typescript
Azure functions+typescriptAzure functions+typescript
Azure functions+typescriptHiroyuki Ohnaka
 
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
 技術書典4  く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版 技術書典4  く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版Hiroyuki Ohnaka
 
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版Hiroyuki Ohnaka
 
仮想通貨始めました~GethではじめるEthereum~
仮想通貨始めました~GethではじめるEthereum~仮想通貨始めました~GethではじめるEthereum~
仮想通貨始めました~GethではじめるEthereum~Hiroyuki Ohnaka
 
錬金術MeetUpへのお誘い
錬金術MeetUpへのお誘い錬金術MeetUpへのお誘い
錬金術MeetUpへのお誘いHiroyuki Ohnaka
 
Mackerelではじめる お手軽サーバー監視
Mackerelではじめる お手軽サーバー監視Mackerelではじめる お手軽サーバー監視
Mackerelではじめる お手軽サーバー監視Hiroyuki Ohnaka
 
「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」Hiroyuki Ohnaka
 
TDDはじめて物語Second Season(updated)
TDDはじめて物語Second Season(updated)TDDはじめて物語Second Season(updated)
TDDはじめて物語Second Season(updated)Hiroyuki Ohnaka
 
TDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbcTDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbcHiroyuki Ohnaka
 
XP祭り2017 LT 「DevOps再考」(改題)
XP祭り2017 LT 「DevOps再考」(改題)XP祭り2017 LT 「DevOps再考」(改題)
XP祭り2017 LT 「DevOps再考」(改題)Hiroyuki Ohnaka
 
JDK9の真の目玉機能はこれだ!
JDK9の真の目玉機能はこれだ!JDK9の真の目玉機能はこれだ!
JDK9の真の目玉機能はこれだ!Hiroyuki Ohnaka
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Hiroyuki Ohnaka
 
「すいーとみゅーじっく」のできるまで
「すいーとみゅーじっく」のできるまで「すいーとみゅーじっく」のできるまで
「すいーとみゅーじっく」のできるまでHiroyuki Ohnaka
 
pact-jvmではじめるコンシューマー駆動契約
pact-jvmではじめるコンシューマー駆動契約pact-jvmではじめるコンシューマー駆動契約
pact-jvmではじめるコンシューマー駆動契約Hiroyuki Ohnaka
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記Hiroyuki Ohnaka
 
TDDのこれまで、そしてこれから
TDDのこれまで、そしてこれからTDDのこれまで、そしてこれから
TDDのこれまで、そしてこれからHiroyuki Ohnaka
 

More from Hiroyuki Ohnaka (20)

ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
ChefとItamaeをニコイチしてAnsibleにマイグレーションした話
 
「WindowsデスクトップでWeb開発 改訂版」サンプル
「WindowsデスクトップでWeb開発 改訂版」サンプル「WindowsデスクトップでWeb開発 改訂版」サンプル
「WindowsデスクトップでWeb開発 改訂版」サンプル
 
Mackerelの薄い本
Mackerelの薄い本Mackerelの薄い本
Mackerelの薄い本
 
Microsoft DocsにContributeした話
Microsoft DocsにContributeした話Microsoft DocsにContributeした話
Microsoft DocsにContributeした話
 
Azure functions+typescript
Azure functions+typescriptAzure functions+typescript
Azure functions+typescript
 
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
 技術書典4  く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版 技術書典4  く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
技術書典4 く-35「錬金術MeetUp」 Alchemist Vol.1 サンプル版
 
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
4/22 技術書典4 か-16「ふぃーるどのーつ」 新刊「すいーとみゅーじっく vol.5Mackerelではじめるお手軽サーバー監視」サンプル版
 
仮想通貨始めました~GethではじめるEthereum~
仮想通貨始めました~GethではじめるEthereum~仮想通貨始めました~GethではじめるEthereum~
仮想通貨始めました~GethではじめるEthereum~
 
錬金術MeetUpへのお誘い
錬金術MeetUpへのお誘い錬金術MeetUpへのお誘い
錬金術MeetUpへのお誘い
 
Mackerelではじめる お手軽サーバー監視
Mackerelではじめる お手軽サーバー監視Mackerelではじめる お手軽サーバー監視
Mackerelではじめる お手軽サーバー監視
 
「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」「GebとSpockではじめるシステムテスト自動化」
「GebとSpockではじめるシステムテスト自動化」
 
TDDはじめて物語Second Season(updated)
TDDはじめて物語Second Season(updated)TDDはじめて物語Second Season(updated)
TDDはじめて物語Second Season(updated)
 
TDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbcTDDはじめて物語 Second Season #tddbc
TDDはじめて物語 Second Season #tddbc
 
XP祭り2017 LT 「DevOps再考」(改題)
XP祭り2017 LT 「DevOps再考」(改題)XP祭り2017 LT 「DevOps再考」(改題)
XP祭り2017 LT 「DevOps再考」(改題)
 
JDK9の真の目玉機能はこれだ!
JDK9の真の目玉機能はこれだ!JDK9の真の目玉機能はこれだ!
JDK9の真の目玉機能はこれだ!
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
 
「すいーとみゅーじっく」のできるまで
「すいーとみゅーじっく」のできるまで「すいーとみゅーじっく」のできるまで
「すいーとみゅーじっく」のできるまで
 
pact-jvmではじめるコンシューマー駆動契約
pact-jvmではじめるコンシューマー駆動契約pact-jvmではじめるコンシューマー駆動契約
pact-jvmではじめるコンシューマー駆動契約
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記
 
TDDのこれまで、そしてこれから
TDDのこれまで、そしてこれからTDDのこれまで、そしてこれから
TDDのこれまで、そしてこれから
 

Sqlアンチパターン読書会 インプリシットカラム

  • 2. Copyright 2014 Hiroyuki Ohnaka 自己紹介 • 大中浩行 (Ohnaka, Hiroyuki) • 泣き笑いせつなポップ中年。 • yokohama.devtesting / devtesting-ja • @setoazusa • http://blog.fieldnotes.jp/ • Javaプログラマ • グロースエクスパートナーズ(株)所属
  • 3. Copyright 2014 Hiroyuki Ohnaka • シンプルなクエリー SELECT * FROM Books b INNER JOIN Authors a ON b.author_id = a.author_id; • 全ての書籍の書名にNULLを返す • データベースのBooksテーブルとAuthorsテーブルには、 どちらにも、title列があります。
  • 4. Copyright 2014 Hiroyuki Ohnaka • 列にエイリアスを宣言してどちらかのtitle列に別の名前を与 える SELECT b.title, a.title AS salutation FROM Books b INNER JOIN Authors a ON b.author_id = a.author_id; • 「1つの列にはエイリアスを付けて、かつ他の列もすべて取 得するにはどうすればいいか?」
  • 5. Copyright 2014 Hiroyuki Ohnaka 目的:タイプ数を減らす • ソフトウェア開発者は概して、キーをたくさん打つ ことを好みません。 • ワイルドカード記号のアスタリクス(*)を使うと、 列名のリストは明示的ではなく暗黙的に指定されま す。
  • 6. Copyright 2014 Hiroyuki Ohnaka アンチパターン:ショートカットの罠に陥る • テーブルに列を追加した結果、エラーを返すようにな るinsert文 • 列を(列名でなく)添え字で参照していたため、列を削 除した結果動かなくなるselect文 • パフォーマンスとスケーラビリティーの問題 • O/Rフレームワークでは、オブジェクトのフィールドに値 を代入するために、ワイルドカードがデフォルトで使われ ていることがあります。
  • 7. Copyright 2014 Hiroyuki Ohnaka • 求めなければ得られない • SQLでは「不要な列以外のすべての列」を意味する構文はサ ポートされていません。
  • 9. Copyright 2014 Hiroyuki Ohnaka アンチパターンを用いてもよい場合 • アドホックなSQLを用いてもいい場合
  • 10. Copyright 2014 Hiroyuki Ohnaka 解決策:列名を明示的に指定する SELECT bug_id, date_reported, summary, description, resolution, reported_by, assigned_to, verified_by, status, priority, hours FROM Bugs; • 列を明示的に指定することで、本章で見てきたエラーや混乱が発生しにく くなります。 • ワイルドカードを使えない局面はいずれ訪れる
  • 11. Copyright 2014 Hiroyuki Ohnaka おまけ:某O/Rマッパーの話 • 自動生成するSQLで当初は、ワイルドカードを使っていた • joinを当初サポートしておらず、 • テーブルとEntityのプロパティの関係を、フレームワーク側で完全に制 御できるため。 • 取得する列を制限する機能は、フレームワーク側から見ると、余 りやりたくない • DB側のモデリングとアプリケーション側のモデリングに不整合が起き る(not nullなカラムに対応するプロパティにnullが入る) • APIのインターフェースが複雑になる
  • 12. Copyright 2014 Hiroyuki Ohnaka • ところが、その後の仕様変更でjoinをサポートするように なったため、ワイルドカードが使えなくなった • Entityにマッピングするときに、テーブル名とカラム名 の対応を取れるようにするため、別名をつけてSQLを生 成するようにした
  • 13. Copyright 2014 Hiroyuki Ohnaka select emp.empno as emp_empno, emp.ename as emp_ename, (略) dept.deptno as dept_deptno, dept.dname as dept_dname, (略) from emp left outer join dept on emp.deptno = dept.deptno
  • 14. Copyright 2014 Hiroyuki Ohnaka • しかし、テーブル名と列名をそのままつなげて別名を生 成していたため、Oracleの識別子の長さ制限にひっか かってしまいました... • 最終的に、次のようになりました。
  • 15. Copyright 2014 Hiroyuki Ohnaka select emp.empno as T1_C1, emp.ename as T1_C2, (略) dept.deptno as T2_C1, dept.dname as T2_C2, (略) from emp left outer join dept on emp.deptno = dept.deptno