SlideShare a Scribd company logo
Submit Search
Upload
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
Report
K
kwatch
Follow
•
194 likes
•
59,841 views
1
of
46
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
•
194 likes
•
59,841 views
Report
Technology
(PgDay2012発表資料) SQLにとって、なぜO/Rマッパーが重要かを説明した資料です。
Read more
K
kwatch
Follow
Recommended
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
48.4K views
•
61 slides
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
90K views
•
66 slides
Ormとの付き合い方
豊明 尾古
5.6K views
•
25 slides
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
48K views
•
89 slides
GraphQL入門
Kent Ohashi
651 views
•
19 slides
はまる!JPA(初学者向けライト版)
Masatoshi Tada
25.6K views
•
80 slides
More Related Content
What's hot
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
60.9K views
•
91 slides
Where狙いのキー、order by狙いのキー
yoku0825
39.5K views
•
109 slides
やはりお前らのMVCは間違っている
Koichi Tanaka
145.6K views
•
66 slides
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
38.1K views
•
16 slides
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
20.9K views
•
59 slides
トランザクションスクリプトのすすめ
pospome
3K views
•
14 slides
What's hot
(20)
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
•
60.9K views
Where狙いのキー、order by狙いのキー
yoku0825
•
39.5K views
やはりお前らのMVCは間違っている
Koichi Tanaka
•
145.6K views
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
•
38.1K views
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
•
20.9K views
トランザクションスクリプトのすすめ
pospome
•
3K views
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
•
58.1K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
•
148.6K views
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
•
30.8K views
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
•
48.4K views
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
•
185.7K views
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
•
1.8K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
•
70.6K views
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
•
32.5K views
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
•
3.8K views
webエンジニアのためのはじめてのredis
nasa9084
•
8.3K views
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
Recruit Technologies
•
59.8K views
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
•
65.3K views
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
•
21.4K views
GraphQLのsubscriptionで出来ること
Shingo Fukui
•
9.1K views
Viewers also liked
よろしい、ならばMicro-ORMだ
Narami Kiyokura
8.5K views
•
60 slides
テスト自動化の現場から~落とし穴に気を付けよう~
Satsuki Urayama
5.8K views
•
65 slides
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
31.7K views
•
70 slides
3000社の業務データ絞り込みを支える技術
Ryo Mitoma
11.5K views
•
72 slides
WalB: Real-time and Incremental Backup System for Block Devices
uchan_nos
5.2K views
•
37 slides
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jumpei Miyata
7.4K views
•
92 slides
Viewers also liked
(6)
よろしい、ならばMicro-ORMだ
Narami Kiyokura
•
8.5K views
テスト自動化の現場から~落とし穴に気を付けよう~
Satsuki Urayama
•
5.8K views
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
•
31.7K views
3000社の業務データ絞り込みを支える技術
Ryo Mitoma
•
11.5K views
WalB: Real-time and Incremental Backup System for Block Devices
uchan_nos
•
5.2K views
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jumpei Miyata
•
7.4K views
Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
Hadoop / Spark Conference Japan
2.7K views
•
35 slides
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
2K views
•
61 slides
ScalaMatsuri 2016
Yoshitaka Fujii
7.1K views
•
151 slides
ドメイン駆動設計という仕事の流儀
増田 亨
16.5K views
•
53 slides
Mithril - 軽量/高速なMVCフレームワーク
sairoutine
3.2K views
•
44 slides
Ruby on Rails 入門
Yasuko Ohba
11.3K views
•
91 slides
Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
(20)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
Hadoop / Spark Conference Japan
•
2.7K views
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
•
2K views
ScalaMatsuri 2016
Yoshitaka Fujii
•
7.1K views
ドメイン駆動設計という仕事の流儀
増田 亨
•
16.5K views
Mithril - 軽量/高速なMVCフレームワーク
sairoutine
•
3.2K views
Ruby on Rails 入門
Yasuko Ohba
•
11.3K views
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
オラクルユニバーシティ
•
619 views
activerecord-oracle_enhanced-adapterのご紹介
Kevin Toyoda
•
734 views
PHPフレームワーク入門
Sho A
•
2K views
20110820 metaprogramming
Masanori Kado
•
1.2K views
Functional JavaScript with Lo-Dash.js
Shogo Sensui
•
2.1K views
Clojure programming-chapter-2
Masao Kato
•
1.1K views
Scala on Hadoop
Shinji Tanaka
•
2.5K views
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
•
15K views
Oracle Database Connect 2017 / JPOUG#1
Noriyoshi Shinoda
•
2.7K views
Web技術勉強会 第25回
龍一 田中
•
649 views
ドメイン駆動設計(DDD)の実践Part2
増田 亨
•
12.9K views
第2回品川Redmine勉強会(日本語全文検索)
Masanori Machii
•
7.9K views
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
Shigeru UCHIYAMA
•
2K views
Ruby on Rails on MySQL チューニング入門
だいすけ さとう
•
21.5K views
More from kwatch
How to make the fastest Router in Python
kwatch
4.9K views
•
66 slides
Migr8.rb チュートリアル
kwatch
3.1K views
•
64 slides
なんでもID
kwatch
1.4K views
•
42 slides
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
kwatch
4.8K views
•
20 slides
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
34K views
•
58 slides
正規表現リテラルは本当に必要なのか?
kwatch
16.1K views
•
61 slides
More from kwatch
(20)
How to make the fastest Router in Python
kwatch
•
4.9K views
Migr8.rb チュートリアル
kwatch
•
3.1K views
なんでもID
kwatch
•
1.4K views
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
kwatch
•
4.8K views
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
kwatch
•
34K views
正規表現リテラルは本当に必要なのか?
kwatch
•
16.1K views
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
kwatch
•
7.6K views
DBスキーマもバージョン管理したい!
kwatch
•
57.6K views
PHPとJavaScriptにおけるオブジェクト指向を比較する
kwatch
•
6.8K views
Fantastic DSL in Python
kwatch
•
13K views
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
kwatch
•
4.1K views
PHP5.5新機能「ジェネレータ」初心者入門
kwatch
•
22.2K views
Pretty Good Branch Strategy for Git/Mercurial
kwatch
•
1.9K views
Oktest - a new style testing library for Python -
kwatch
•
3.3K views
文字列結合のベンチマークをいろんな処理系でやってみた
kwatch
•
6.9K views
I have something to say about the buzz word "From Java to Ruby"
kwatch
•
1.3K views
Cより速いRubyプログラム
kwatch
•
5.3K views
Javaより速いLL用テンプレートエンジン
kwatch
•
4K views
Underlaying Technology of Modern O/R Mapper
kwatch
•
3.7K views
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
kwatch
•
6.9K views
Recently uploaded
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
208 views
•
33 slides
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
157 views
•
63 slides
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
harmonylab
41 views
•
30 slides
さくらのひやおろし2023
法林浩之
76 views
•
58 slides
テストコードってすごい.pptx
cistb220msudou
72 views
•
16 slides
01Booster Studio ご紹介資料
ssusere7a2172
209 views
•
19 slides
Recently uploaded
(10)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
208 views
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
157 views
DLゼミ: MobileOne: An Improved One millisecond Mobile Backbone
harmonylab
•
41 views
さくらのひやおろし2023
法林浩之
•
76 views
テストコードってすごい.pptx
cistb220msudou
•
72 views
01Booster Studio ご紹介資料
ssusere7a2172
•
209 views
概念モデリングワークショップ 基礎編
Knowledge & Experience
•
19 views
JJUG CCC.pptx
Kanta Sasaki
•
6 views
概念モデリングワークショップ 設計編
Knowledge & Experience
•
10 views
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
•
6 views
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