Submit Search
Upload
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
•
194 likes
•
59,957 views
K
kwatch
Follow
(PgDay2012発表資料) SQLにとって、なぜO/Rマッパーが重要かを説明した資料です。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 46
Recommended
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
Amazon Redshiftによるリアルタイム分析サービスの構築
Amazon Redshiftによるリアルタイム分析サービスの構築
Minero Aoki
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Recommended
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
Amazon Redshiftによるリアルタイム分析サービスの構築
Amazon Redshiftによるリアルタイム分析サービスの構築
Minero Aoki
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
Keita Tsukamoto
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Satoyuki Tsukano
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
インフラCICDの勘所
インフラCICDの勘所
Toru Makabe
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Kazumi IWANAGA
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
MQ入門
MQ入門
HIRA
データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
Railsエンジニアのためのウェブセキュリティ入門
Railsエンジニアのためのウェブセキュリティ入門
Hiroshi Tokumaru
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
Narami Kiyokura
テスト自動化の現場から~落とし穴に気を付けよう~
テスト自動化の現場から~落とし穴に気を付けよう~
Satsuki Urayama
More Related Content
What's hot
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
Keita Tsukamoto
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Satoyuki Tsukano
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
インフラCICDの勘所
インフラCICDの勘所
Toru Makabe
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Kazumi IWANAGA
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
MQ入門
MQ入門
HIRA
データベース設計徹底指南
データベース設計徹底指南
Mikiya Okuno
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
Railsエンジニアのためのウェブセキュリティ入門
Railsエンジニアのためのウェブセキュリティ入門
Hiroshi Tokumaru
What's hot
(20)
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
MongoDBの監視
MongoDBの監視
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
インフラCICDの勘所
インフラCICDの勘所
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
MQ入門
MQ入門
データベース設計徹底指南
データベース設計徹底指南
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Railsエンジニアのためのウェブセキュリティ入門
Railsエンジニアのためのウェブセキュリティ入門
Viewers also liked
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
Narami Kiyokura
テスト自動化の現場から~落とし穴に気を付けよう~
テスト自動化の現場から~落とし穴に気を付けよう~
Satsuki Urayama
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術
Ryo Mitoma
WalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block Devices
uchan_nos
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jumpei Miyata
Viewers also liked
(6)
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
テスト自動化の現場から~落とし穴に気を付けよう~
テスト自動化の現場から~落とし穴に気を付けよう~
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術
WalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block Devices
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
Hadoop / Spark Conference Japan
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
ScalaMatsuri 2016
ScalaMatsuri 2016
Yoshitaka Fujii
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
増田 亨
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
sairoutine
Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
オラクルユニバーシティ
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
Kevin Toyoda
PHPフレームワーク入門
PHPフレームワーク入門
Sho A
20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
Scala on Hadoop
Scala on Hadoop
Shinji Tanaka
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
Noriyoshi Shinoda
Web技術勉強会 第25回
Web技術勉強会 第25回
龍一 田中
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
増田 亨
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
Masanori Machii
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
Shigeru UCHIYAMA
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
だいすけ さとう
Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
(20)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
ScalaMatsuri 2016
ScalaMatsuri 2016
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
Ruby on Rails 入門
Ruby on Rails 入門
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
PHPフレームワーク入門
PHPフレームワーク入門
20110820 metaprogramming
20110820 metaprogramming
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Clojure programming-chapter-2
Clojure programming-chapter-2
Scala on Hadoop
Scala on Hadoop
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
Web技術勉強会 第25回
Web技術勉強会 第25回
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
More from kwatch
How to make the fastest Router in Python
How to make the fastest Router in Python
kwatch
Migr8.rb チュートリアル
Migr8.rb チュートリアル
kwatch
なんでもID
なんでもID
kwatch
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
kwatch
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
kwatch
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
kwatch
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
kwatch
Fantastic DSL in Python
Fantastic DSL in Python
kwatch
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
kwatch
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
kwatch
Pretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/Mercurial
kwatch
Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -
kwatch
文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた
kwatch
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"
kwatch
Cより速いRubyプログラム
Cより速いRubyプログラム
kwatch
Javaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジン
kwatch
Underlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R Mapper
kwatch
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
kwatch
More from kwatch
(20)
How to make the fastest Router in Python
How to make the fastest Router in Python
Migr8.rb チュートリアル
Migr8.rb チュートリアル
なんでもID
なんでもID
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
Fantastic DSL in Python
Fantastic DSL in Python
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
Pretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/Mercurial
Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -
文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"
Cより速いRubyプログラム
Cより速いRubyプログラム
Javaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジン
Underlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R Mapper
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
Recently uploaded
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
Shota Ito
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
Atomu Hidaka
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
furutsuka
Recently uploaded
(7)
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
1.
PgDay2012 LightningTalk SQL上級者にこそ知って欲しい なぜ O/Rマッパー
が重要か? makoto kuwata <kwa@kuwata-lab.com> http://www.kuwata-lab.com/
2.
問:次のSQLは 何が問題でしょう? copyright© 2012
kuwata-lab.com all rights reserved
3.
SQL -- 販売成績上位10コを抽出 select *
from sales where deleted = false order by amount desc limit 10 文法的には正しいけど… copyright© 2012 kuwata-lab.com all rights reserved
4.
話は変わって、 他のプログラミング言語 copyright©
2012 kuwata-lab.com all rights reserved
5.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs end copyright© 2012 kuwata-lab.com all rights reserved
6.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] select from相当 return xs end copyright© 2012 kuwata-lab.com all rights reserved
7.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs where相当 end copyright© 2012 kuwata-lab.com all rights reserved
8.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs order by相当 end copyright© 2012 kuwata-lab.com all rights reserved
9.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs limit相当 end copyright© 2012 kuwata-lab.com all rights reserved
10.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs end 1つの関数でいろんな ことをやりすぎている copyright© 2012 kuwata-lab.com all rights reserved
11.
複数の関数に分解 (リファクタリング) copyright© 2012
kuwata-lab.com all rights reserved
12.
Ruby def to_sales(rows)
rows.map {|row| Sale.new(*row) } end def active(sales) sales.select {|x| ! x.deleted_at } end def top(n, sales) sales = sales.sort_by {|x| - x.amount } return sales[0, 10] end copyright© 2012 kuwata-lab.com all rights reserved
13.
Ruby ## 使い方 def sales_top(n,
rows) return top(n, active(to_sales(rows))) end 分解した関数を 組み合わせる copyright© 2012 kuwata-lab.com all rights reserved
14.
専用のクラスを定義 (オブジェクト指向) copyright©
2012 kuwata-lab.com all rights reserved
15.
Ruby clas Sales
def initialize(rows) @all = rows.map {|row| Sales.new(*row) } end attr_reader :all def active @all = @all.select {|x| ! x.deleted } return self end def top(n) @all = @all.sort_by {|x| - x.amount } @all = @all[0, n] return self end end copyright© 2012 kuwata-lab.com all rights reserved
16.
Ruby ## 使い方 Sales.new(rows).active().top(10).all()
分解したメソッドを 組み合わせる copyright© 2012 kuwata-lab.com all rights reserved
17.
プログラミング言語が 持っている基本機能 copyright©
2012 kuwata-lab.com all rights reserved
18.
• 「全体」 「部分」
を に分解する機能 • 「部分」 「全体」 から を構築する機能 • 「部分」に名前をつけて抽象化する機能 copyright© 2012 kuwata-lab.com all rights reserved
19.
改めて、次のSQLは 何が問題でしょう? copyright© 2012
kuwata-lab.com all rights reserved
20.
SQL -- 販売成績上位10コを抽出 select *
from sales where deleted = false order by amount desc limit 10 copyright© 2012 kuwata-lab.com all rights reserved
21.
SQLは、分解・構築・ 抽象化の機能が弱っちい! copyright©
2012 kuwata-lab.com all rights reserved
22.
そこで O/R Mapper!!
copyright© 2012 kuwata-lab.com all rights reserved
23.
ORMを使うことで、 •SQLを小さい部品に分解 • 部品からSQL全体を構築 • 部品に名前をつけて抽象化 できるようになる!
copyright© 2012 kuwata-lab.com all rights reserved
24.
サンプルコード: ActiveRecord (Rails3)
copyright© 2012 kuwata-lab.com all rights reserved
25.
Ruby
where deleted = false class Sales < ActiveReocrd::Base に相当する「部分」 named_scope :active, {:conditions=>"deleted = false"} named_scope :top, lambda do |n| {:order=>"amount desc", :limit=>n} end order by amount desc limit n end に相当する「部分」 copyright© 2012 kuwata-lab.com all rights reserved
26.
「部分」を組み合わせて
Ruby 「全体」を構築 Sales.active().top(10).all() ## これは ## select * from sales ## where deleted = false ## order by amount desc limit 10 ## を生成して実行する ※(2012-12-19) 「と同じ」を「を生成して実行する」に修正 copyright© 2012 kuwata-lab.com all rights reserved
27.
サンプルコード: DataMapper copyright© 2012
kuwata-lab.com all rights reserved
28.
Ruby class Sales
where deleted = false include DataMapper::Resource に相当する「部分」 def self.active where(:deleted => false) end def self.top(n) order(:amount.desc).limit(n) end end order by amount desc limit n に相当する「部分」 copyright© 2012 kuwata-lab.com all rights reserved
29.
「部分」を組み合わせて
Ruby 「全体」を構築 Sales.active().top(10).all() ## これも ## select * from sales ## where deleted = false ## order by amount desc limit 10 ## を生成して実行する ※(2012-12-19) 「と同じ」を「を生成して実行する」に修正 copyright© 2012 kuwata-lab.com all rights reserved
30.
別のサンプル: 副問い合わせ copyright© 2012 kuwata-lab.com
all rights reserved
31.
SQL -- 年齢が20歳の社員が所属する部署一覧 select *
from departments where id in (select dept_id from employees where age = 20) order by name SQLに「部品化」の機能が ないことを示す典型例 ※(2012-12-13) "select id" を "select dept_id" に修正 copyright© 2012 kuwata-lab.com all rights reserved
32.
サンプルコード:
Sequel copyright© 2012 kuwata-lab.com all rights reserved
33.
副問い合わせを切り出して
名前を付ける Ruby dept_ids = Employee.select(:dept_id) .filter(:age=>20) Department.filter(:id=>dept_ids).all() SQL構築が簡潔になる SQL select * from departments where id in (select dept_id from employees where age = 20) copyright© 2012 kuwata-lab.com all rights reserved
34.
Ruby dept_ids = Employee.select(:dept_id)
.filter(:age=>20) Department.filter(:id=>dept_ids).all() Budget.filter(:dept_id=>dept_ids).all() 部品化した副問い合わせを複数の SQLで共用できる(with句より便利) copyright© 2012 kuwata-lab.com all rights reserved
35.
別のサンプル: 重複した式 copyright© 2012 kuwata-lab.com
all rights reserved
36.
SQL -- 誕生日をもとに年齢を計算 select date_part('year',
age(birth)) as age, count(*) from users where date_part('year', age(birth)) < 20 group by date_part('year', age(birth)) order by age 同じ式が重複して出現 copyright© 2012 kuwata-lab.com all rights reserved
37.
サンプルコード: SQLAlchemy copyright© 2012
kuwata-lab.com all rights reserved
38.
年齢の計算式を表す構文木を作り、
Python from sqlalchemy.sql import func as fn age = fn.date_part('year', fn.age(User.birth)) rows = DBSession .query(age, fn.count('*')) .select_from(User) .filter(age < 20) .group_by(age) .order_by(age) .all() それを複数箇所で使用できる copyright© 2012 kuwata-lab.com all rights reserved
39.
つまり copyright© 2012 kuwata-lab.com
all rights reserved
40.
• SQLには部品化の機能がない →
SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い • ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる copyright© 2012 kuwata-lab.com all rights reserved
41.
• SQLには部品化の機能がない →
SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い • ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる copyright© 2012 kuwata-lab.com all rights reserved
42.
たとえるなら copyright© 2012 kuwata-lab.com
all rights reserved
43.
まだ進化の途中な
高水準へと進化 ので暖かい目を! Lisp, Ruby Modern ORM C, Pascal JDBC, DBI Assembler SQL 低水準から copyright© 2012 kuwata-lab.com all rights reserved
44.
まとめ copyright© 2012 kuwata-lab.com
all rights reserved
45.
• 一般のプログラミング言語には 「分解」「構築」「抽象化」
の機能がある • SQLはそれらが弱っちい • モダンなORMなら、それらの機能 をSQLに提供できる ORMはSQLの高水準言語 or DSL! copyright© 2012 kuwata-lab.com all rights reserved
46.
おしまい copyright© 2012 kuwata-lab.com
all rights reserved