Movatterモバイル変換


[0]ホーム

URL:


Uploaded bykwatch
60,255 views

SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?

(PgDay2012発表資料) SQLにとって、なぜO/Rマッパーが重要かを説明した資料です。

Embed presentation

PgDay2012 LightningTalkSQL上級者にこそ知って欲しいなぜO/Rマッパー             が重要か?      makoto kuwata <kwa@kuwata-lab.com>                 http://www.kuwata-lab.com/
問:次のSQLは何が問題でしょう? copyright© 2012 kuwata-lab.com all rights reserved
SQL-- 販売成績上位10コを抽出select * from saleswhere deleted = falseorder by amount desclimit 10                                 文法的には正しいけど…        copyright© 2012 kuwata-lab.com all rights reserved
話は変わって、他のプログラミング言語  copyright© 2012 kuwata-lab.com all rights reserved
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 xsend            copyright© 2012 kuwata-lab.com all rights reserved
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 xsend            copyright© 2012 kuwata-lab.com all rights reserved
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
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
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
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 xsend                       1つの関数でいろんな                                      ことをやりすぎている            copyright© 2012 kuwata-lab.com all rights reserved
複数の関数に分解(リファクタリング) copyright© 2012 kuwata-lab.com all rights reserved
Rubydef to_sales(rows)  rows.map {|row| Sale.new(*row) }enddef active(sales)  sales.select {|x| ! x.deleted_at }enddef top(n, sales)  sales = sales.sort_by {|x| - x.amount }  return sales[0, 10]end            copyright© 2012 kuwata-lab.com all rights reserved
Ruby## 使い方def sales_top(n, rows)  return top(n, active(to_sales(rows)))end                                           分解した関数を                                            組み合わせる           copyright© 2012 kuwata-lab.com all rights reserved
専用のクラスを定義 (オブジェクト指向) copyright© 2012 kuwata-lab.com all rights reserved
Rubyclas 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  endend              copyright© 2012 kuwata-lab.com all rights reserved
Ruby## 使い方Sales.new(rows).active().top(10).all()                                      分解したメソッドを                                        組み合わせる          copyright© 2012 kuwata-lab.com all rights reserved
プログラミング言語が持っている基本機能  copyright© 2012 kuwata-lab.com all rights reserved
• 「全体」 「部分」      を    に分解する機能• 「部分」 「全体」      から   を構築する機能• 「部分」に名前をつけて抽象化する機能     copyright© 2012 kuwata-lab.com all rights reserved
改めて、次のSQLは何が問題でしょう? copyright© 2012 kuwata-lab.com all rights reserved
SQL-- 販売成績上位10コを抽出select * from saleswhere deleted = falseorder by amount desclimit 10        copyright© 2012 kuwata-lab.com all rights reserved
SQLは、分解・構築・抽象化の機能が弱っちい!  copyright© 2012 kuwata-lab.com all rights reserved
そこでO/R Mapper!!  copyright© 2012 kuwata-lab.com all rights reserved
ORMを使うことで、•SQLを小さい部品に分解• 部品からSQL全体を構築• 部品に名前をつけて抽象化できるようになる!   copyright© 2012 kuwata-lab.com all rights reserved
サンプルコード:ActiveRecord (Rails3)     copyright© 2012 kuwata-lab.com all rights reserved
Ruby                             where deleted = falseclass 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 nend                         に相当する「部分」            copyright© 2012 kuwata-lab.com all rights reserved
「部分」を組み合わせて                                              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
サンプルコード:DataMapper copyright© 2012 kuwata-lab.com all rights reserved
Rubyclass Sales                          where deleted = false  include DataMapper::Resource                                          に相当する「部分」  def self.active    where(:deleted => false)  end  def self.top(n)    order(:amount.desc).limit(n)  endend                 order by amount desc limit n                          に相当する「部分」             copyright© 2012 kuwata-lab.com all rights reserved
「部分」を組み合わせて                                              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
別のサンプル:副問い合わせcopyright© 2012 kuwata-lab.com all rights reserved
SQL-- 年齢が20歳の社員が所属する部署一覧select * from departmentswhere 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
サンプルコード:      Sequelcopyright© 2012 kuwata-lab.com all rights reserved
副問い合わせを切り出して     名前を付ける                                                        Rubydept_ids = Employee.select(:dept_id)                    .filter(:age=>20)Department.filter(:id=>dept_ids).all()            SQL構築が簡潔になる                                                                   SQLselect * from departmentswhere id in  (select dept_id from employees   where age = 20)              copyright© 2012 kuwata-lab.com all rights reserved
Rubydept_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
別のサンプル:重複した式copyright© 2012 kuwata-lab.com all rights reserved
SQL-- 誕生日をもとに年齢を計算select date_part('year', age(birth))          as age, count(*)from userswhere date_part('year', age(birth)) < 20group by date_part('year', age(birth))order by age                               同じ式が重複して出現           copyright© 2012 kuwata-lab.com all rights reserved
サンプルコード:SQLAlchemy copyright© 2012 kuwata-lab.com all rights reserved
年齢の計算式を表す構文木を作り、                                       Pythonfrom sqlalchemy.sql import func as fnage = 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
つまりcopyright© 2012 kuwata-lab.com all rights reserved
• SQLには部品化の機能がない → SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い• ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる    copyright© 2012 kuwata-lab.com all rights reserved
• SQLには部品化の機能がない → SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い• ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる    copyright© 2012 kuwata-lab.com all rights reserved
たとえるならcopyright© 2012 kuwata-lab.com all rights reserved
まだ進化の途中な               高水準へと進化                                  ので暖かい目を!Lisp, Ruby                                     Modern ORMC, Pascal                                         JDBC, DBIAssembler                                               SQL                   低水準から        copyright© 2012 kuwata-lab.com all rights reserved
まとめcopyright© 2012 kuwata-lab.com all rights reserved
• 一般のプログラミング言語には 「分解」「構築」「抽象化」 の機能がある• SQLはそれらが弱っちい• モダンなORMなら、それらの機能 をSQLに提供できる    ORMはSQLの高水準言語 or DSL!    copyright© 2012 kuwata-lab.com all rights reserved
おしまいcopyright© 2012 kuwata-lab.com all rights reserved

Recommended

PDF
ソーシャルゲームのためのデータベース設計
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
Serverless時代のJavaについて
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
Where狙いのキー、order by狙いのキー
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
イミュータブルデータモデル(世代編)
PDF
ドメイン駆動設計(DDD)の実践Part2
PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
マイクロサービス 4つの分割アプローチ
PDF
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
PDF
Elasticsearch勉強会#44 20210624
PDF
データベース設計徹底指南
PDF
リッチなドメインモデル 名前探し
PDF
なぜデータモデリングが重要なのか?
PPTX
世界一わかりやすいClean Architecture
PDF
Cassandraとh baseの比較して入門するno sql
PPTX
Databricksを初めて使う人に向けて.pptx
 
PPTX
20220409 AWS BLEA 開発にあたって検討したこと
PPTX
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
イミュータブルデータモデルの極意
PDF
Javaのログ出力: 道具と考え方
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
Ormとの付き合い方
PPTX
Redisの特徴と活用方法について
PDF
3000社の業務データ絞り込みを支える技術
PDF
自動テストの誤解とアンチパターン in 楽天 Tech Talk

More Related Content

PDF
ソーシャルゲームのためのデータベース設計
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
Serverless時代のJavaについて
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
Where狙いのキー、order by狙いのキー
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
イミュータブルデータモデル(世代編)
ソーシャルゲームのためのデータベース設計
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Serverless時代のJavaについて
PlaySQLAlchemy: SQLAlchemy入門
新入社員のための大規模ゲーム開発入門 サーバサイド編
Where狙いのキー、order by狙いのキー
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
イミュータブルデータモデル(世代編)

What's hot

PDF
ドメイン駆動設計(DDD)の実践Part2
PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
マイクロサービス 4つの分割アプローチ
PDF
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
PDF
Elasticsearch勉強会#44 20210624
PDF
データベース設計徹底指南
PDF
リッチなドメインモデル 名前探し
PDF
なぜデータモデリングが重要なのか?
PPTX
世界一わかりやすいClean Architecture
PDF
Cassandraとh baseの比較して入門するno sql
PPTX
Databricksを初めて使う人に向けて.pptx
 
PPTX
20220409 AWS BLEA 開発にあたって検討したこと
PPTX
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
イミュータブルデータモデルの極意
PDF
Javaのログ出力: 道具と考え方
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
Ormとの付き合い方
PPTX
Redisの特徴と活用方法について
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計 失敗したことと成功したこと
ソフトウェア設計における 意思決定とそのレビューの秘訣
マイクロサービス 4つの分割アプローチ
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Elasticsearch勉強会#44 20210624
データベース設計徹底指南
リッチなドメインモデル 名前探し
なぜデータモデリングが重要なのか?
世界一わかりやすいClean Architecture
Cassandraとh baseの比較して入門するno sql
Databricksを初めて使う人に向けて.pptx
 
20220409 AWS BLEA 開発にあたって検討したこと
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
イミュータブルデータモデルの極意
Javaのログ出力: 道具と考え方
Spring Boot × Vue.jsでSPAを作る
Ormとの付き合い方
Redisの特徴と活用方法について

Viewers also liked

PDF
3000社の業務データ絞り込みを支える技術
PDF
自動テストの誤解とアンチパターン in 楽天 Tech Talk
PDF
よろしい、ならばMicro-ORMだ
PDF
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
PPTX
WalB: Real-time and Incremental Backup System for Block Devices
PDF
テスト自動化の現場から~落とし穴に気を付けよう~
3000社の業務データ絞り込みを支える技術
自動テストの誤解とアンチパターン in 楽天 Tech Talk
よろしい、ならばMicro-ORMだ
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
WalB: Real-time and Incremental Backup System for Block Devices
テスト自動化の現場から~落とし穴に気を付けよう~

Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?

PDF
ドメイン駆動設計 の 実践 Part3 DDD
KEY
実録!Railsのはまりポイント10選
PDF
Sql基礎の基礎
KEY
activerecord-turntable
PPTX
Qlik ReplicateにおけるExpression Builderの利用方法
PDF
2019年度若手技術者向け講座 実践SQL
 
PDF
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter)
PPT
分散KVSのデータモデリング
PDF
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
PDF
Database smells
PDF
Ruby on Rails 入門
PDF
Active record query interface
PPT
Start!! Ruby
 
PDF
魂のコーディング
PPTX
Ruby講座第二回
PDF
名古屋Ruby会議02 LT:Ruby中級への道
PDF
Rubyプログラミング教育に対する取り組みと事例紹介
PDF
Tokyo Rubykaigi 01 t-wada
PPTX
第3回輪講
PDF
アジャイル開発を可能にするEA
ドメイン駆動設計 の 実践 Part3 DDD
実録!Railsのはまりポイント10選
Sql基礎の基礎
activerecord-turntable
Qlik ReplicateにおけるExpression Builderの利用方法
2019年度若手技術者向け講座 実践SQL
 
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter)
分散KVSのデータモデリング
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
Database smells
Ruby on Rails 入門
Active record query interface
Start!! Ruby
 
魂のコーディング
Ruby講座第二回
名古屋Ruby会議02 LT:Ruby中級への道
Rubyプログラミング教育に対する取り組みと事例紹介
Tokyo Rubykaigi 01 t-wada
第3回輪講
アジャイル開発を可能にするEA

More from kwatch

PDF
O/Rマッパーによるトラブルを未然に防ぐ
 
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
 
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
 
PDF
正規表現リテラルは本当に必要なのか?
 
PDF
DBスキーマもバージョン管理したい!
 
PDF
PHP5.5新機能「ジェネレータ」初心者入門
 
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
PDF
Fantastic DSL in Python
 
PDF
Cより速いRubyプログラム
 
PDF
Migr8.rb チュートリアル
 
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
 
PDF
How to make the fastest Router in Python
 
PDF
Javaより速いLL用テンプレートエンジン
 
PDF
文字列結合のベンチマークをいろんな処理系でやってみた
 
PDF
I have something to say about the buzz word "From Java to Ruby"
 
PDF
Underlaying Technology of Modern O/R Mapper
 
PDF
なんでもID
 
PDF
Pretty Good Branch Strategy for Git/Mercurial
 
PDF
Oktest - a new style testing library for Python -
 
PDF
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
 
O/Rマッパーによるトラブルを未然に防ぐ
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
 
正規表現リテラルは本当に必要なのか?
 
DBスキーマもバージョン管理したい!
 
PHP5.5新機能「ジェネレータ」初心者入門
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
Fantastic DSL in Python
 
Cより速いRubyプログラム
 
Migr8.rb チュートリアル
 
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
 
How to make the fastest Router in Python
 
Javaより速いLL用テンプレートエンジン
 
文字列結合のベンチマークをいろんな処理系でやってみた
 
I have something to say about the buzz word "From Java to Ruby"
 
Underlaying Technology of Modern O/R Mapper
 
なんでもID
 
Pretty Good Branch Strategy for Git/Mercurial
 
Oktest - a new style testing library for Python -
 
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
 

SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?


[8]ページ先頭

©2009-2025 Movatter.jp