SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
ORMとの付き合い方
中国地方DB勉強会 in 岡山
@patorash
自己紹介
名前:尾古 豊明(おこ とよあき)
twitter:@patorash
株式会社リゾーム所属
普段はRuby on Railsでショッピングセンター向けのシステム開発をしてます。
SQLわからんマンだったのでCakePHPで初めてORMに触れたときはあまりの便利さに
衝撃を受けて全てORMになってくれ!と思ったものでした。
ORMの出すSQLを読んで、SQLがわかるようになってきたので、
今SQLが読めるのはORMのおかげと言っても過言ではありません。
最近は集計処理用のSQLを書くのが楽しい。
一昨年に息子が生まれ、子育てに奮闘中。
新支部長からの質問
RDBの新機能にORMって中々ついていけないものだと思っているんですが、普段、業
務でどこまでORMで使ってるんだろう?とか気になります。
会社の人に、「ORMってDBが変わっても、それなりに気にせず使える、ってメリットはあ
るものの、複雑なSQLの場合、ORMよりもSQLで書いた方が(工数的に)速い場合とか
あって、実際、どうすれば良いんですか?」って聞かれたりもして、ORMとどこまで付き
合うべきなんでしょうか。
ORMとは?
● Object-relational mapping(オブジェクト関連マッピング)
● データを取得したタイミングで、データを元にオブジェクトを生成する。
● 特定のテーブルとクラスが1対1になっていて、そのクラスのメソッド経由でデータ
を取得する(Rubyで使われるORMのActiveRecordなどの場合)
ORMの利点
1. 異なるDBの違いを吸収してくれる
2. SQLを書かなくてもいい(自動生成してくれる)
3. プレイスホルダーによってエスケープをよしなにしてくれる
(SQLインジェクション対策)
ORMのよくない点
1. 遅い(オブジェクト生成)
2. リソースを食う(メモリ消費が大きい)
3. 特定のDBの便利な機能が使えない
4. 複雑なデータを取得しようとするとSQLより難しい
5. 頑張れば1回で取得できるデータなのに、
何度もクエリを発行するような処理を書いてしまいがち。
結果、さらに遅くなる…。
6. ORMでのデータ取得にこだわりすぎる人が現れる
そもそも論として…SQL派の人へ
1. 速いのは正義ですが、そんなにスピード求められますか?
ORMでも高速にデータ取得する方法は準備されてたりしますが。
(マッピングせずに配列として取得するとか)
2. 特定のDBの機能、頻繁に使いますか?
3. ORMのプレイスホルダーを利用したエスケープって便利じゃないですか?
そもそも論として…ORM派の人へ
1. データベース自体の変更ってよくありますか?
(ビジネスがかなり拡大してきたらありえるとは思う)
2. なにがなんでもORMで処理しなければならないことってありますか?
3. ORMを使っててもDB制約は利用しますよね?
(ユニーク制約、NOT NULL制約、Indexなどなど…)
4. クエリ発行回数は意識してますか?
DBへのアクセス数が多いのは怠慢ですよ!(ウッ…
どうして二元論にしようとするのか?
1. ORMかSQLのどちらかに統一されてないと気持ち悪いですか?
2. 目的は、いいプロダクトを作ること
3. ORMを使ったほうが便利なものはORMで
4. SQLを書いた方が楽な場合はSQLで
5. とはいえ、9割方ORMを使ってます
ORMの利点(ActiveRecord)
1. 直感的なデータ検索
2. データの整合性チェックが容易
3. コールバックによる連携更新
4. 取得したデータがオブジェクトなのでさらに直感的に
5. 変更に強い
6. テスト可能になる
7. テーブル定義の変更の履歴が残る
SQLの利点
1. 方言はあるものの、だいたいどのDBでも同じ
2. ORMで表現しづらいことが比較的楽に書ける
SQLのよくない点
1. 直感的ではない
2. SQLがわかる人しか書けない
3. テストが(簡単には)できない
4. データの整合性チェックが(簡単には)できない
5. 変更に弱い
6. 作者の意図を表現できない(ORMだとメソッド名で表現できる)
ORMの利点(ActiveRecord)
1. 直感的なデータ検索
2. データの整合性チェックが容易
3. コールバックによる連携更新
4. 取得したデータがオブジェクトなのでさらに直感的に
5. 変更に強い
6. テスト可能になる
7. テーブル定義の変更の履歴が残る
1.直感的なデータ検索(ActiveRecord)
user = User.find 1 # => idが1のUserを取得する
user = User.find_by email: ‘admin@example.com’ # => メアドでUserを取得
users = User.admin.where(created_at: 1.month.ago..Time.zone.now)
# => 1ヶ月以内に作られた管理者を取得
articles = Article.joins(:user).merge(User.normal).published
.order(updated_at: :desc).limit(10)
# => 一般ユーザーが作った公開中の記事を更新日降順に10件取得
soft_destroyed_comments = Commnet.only_soft_destroyed
# => 論理削除されたコメントを取得
1.直感的なデータ検索(多少複雑なJOIN編)
User.joins(“INNER JOIN (#{Comment.group(:user_id).select(“user_id,
COUNT(user_id)”).to_sql}) AS comments ON users.id =
comments.user_id”).select(“*”)
# => ユーザー毎のコメント数を含むユーザー一覧を取得
複雑なJOINもto_sqlを使ってSQL化(サブクエリ化)してしまえば、
そこまで難しくない。
(INNER JOINとONを書くのがダサイという意見は当然ある)
2. データの整合性チェック
class User < ApplicationRecord
# 必須
validates :name, presence: true
# 必須かつカタカナのみ
validates :kana, presence: true, format: {with: /A[ァ-ー]+z/}
# 必須かつ3〜20文字以内
validates :code_name, presence: true, length: { in: 3..20 }
# 必須かつ一意である
validates :email, presence: true, uniqueness: true
end
user = User.new
user.valid? # => false
2. データの整合性チェック
class User < ApplicationRecord
end
class Group < ApplicationRecord
end
class UserGroup < ApplicationRecord
# 1つのグループに1人の人が複数登録されるのを防ぐ
validates :user, presence: true, uniqueness: { scope: group_id }
end
user_group = UserGroup.new(user_id: 1, group_id: 1)
user_group.save # => true
user_group = UserGroup.new(user_id: 1, group_id: 1)
user_group.save # => false
6. テスト可能
● データの整合性チェック、本当に正しいものが定義できてる?
● 複雑な条件でのみ登録・更新できるパターンの検証は人力では難しい
例1)1人のユーザーが所有できるモンスターの上限は3000。
   3001番目が登録されたら…?
例2)メールアドレスの重複登録はできないが、退会済ユーザーの
   メールアドレスは再登録できるように。
例3)A,B,Cが登録されてようやくDが登録できる
● データの取得に関しても同様に、正しいデータが取得できてる?
例1)前回のログイン以降に更新されたデータ件数を取得
例2)公開フラグのあるデータのみを取得できているか?
ユニットテストで検証が可能!(RubyならRspecやMinitestなど)
※SQLも取得結果はプログラミング言語側でテスト可能
ORMの検証とDB制約の利用
ORMとDB制約を使ってデータの整合性を担保
DBに保存
DB制約
ORMのデータ検証
入力データ
・外部キー制約
・ユニーク制約
・NOT NULL制約
・フォーマット検証
・外部キー制約
・ユニーク制約
・NOT NULL制約
・複雑なビジネスロジックの検証
ORMとDB制約で冗長では?
ORMとDB制約を使ってデータの整合性を担保
DBに保存
DB制約
ORMのデータ検証
入力データ
・外部キー制約
・ユニーク制約
・NOT NULL制約
・フォーマット検証
・外部キー制約
・ユニーク制約
・NOT NULL制約
・複雑なビジネスロジックの検証
DB制約がないとSQL
で
更新されたら不正な
データができる!
ORMの利用シーン
1. Webアプリケーションのいたるところで利用
2. 不具合の調査(rails console、デバッガ)
3. 頻繁に変更がありうる処理
SQLの利用シーン
1. データ分析(主に集計。UNIONしたりとか、Window関数使うとか)
2. ORMで表現するのが難しい処理(whereの条件が複雑とか)
3. 滅多に変更がない処理
まとめ
1. 適材適所で付き合おう
2. ORM使ってたとしてもDBの勉強は必要
3. ORMとDB制約のダブルチェックで安全なデータ管理

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 

Similar a Ormとの付き合い方

Similar a Ormとの付き合い方 (14)

ローカルExcelとSharePointの連携
ローカルExcelとSharePointの連携ローカルExcelとSharePointの連携
ローカルExcelとSharePointの連携
 
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
 
便利なHerokuと active recordの 速度改善tips
便利なHerokuと active recordの 速度改善tips便利なHerokuと active recordの 速度改善tips
便利なHerokuと active recordの 速度改善tips
 
RPALT高知Vol1 初心者セミナー
RPALT高知Vol1 初心者セミナーRPALT高知Vol1 初心者セミナー
RPALT高知Vol1 初心者セミナー
 
もしアジャver2.0
もしアジャver2.0もしアジャver2.0
もしアジャver2.0
 
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworksYAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
 
RPALT 新入社員ロボット
RPALT 新入社員ロボットRPALT 新入社員ロボット
RPALT 新入社員ロボット
 
20190116 tectettec#7
20190116 tectettec#720190116 tectettec#7
20190116 tectettec#7
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Osh2014
Osh2014Osh2014
Osh2014
 
How to learn Rails
How to learn RailsHow to learn Rails
How to learn Rails
 
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料
 

Más de 豊明 尾古

KotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみたKotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみた
豊明 尾古
 
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
豊明 尾古
 

Más de 豊明 尾古 (20)

OSS-DB 取得のススメ
OSS-DB 取得のススメOSS-DB 取得のススメ
OSS-DB 取得のススメ
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
ActiveRecord::Enumのススメ
ActiveRecord::EnumのススメActiveRecord::Enumのススメ
ActiveRecord::Enumのススメ
 
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有するウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
 
Middlemanによる静的サイト作成術
Middlemanによる静的サイト作成術Middlemanによる静的サイト作成術
Middlemanによる静的サイト作成術
 
Kotlinのwebフレームワーク探訪
Kotlinのwebフレームワーク探訪Kotlinのwebフレームワーク探訪
Kotlinのwebフレームワーク探訪
 
Rails templateで開発の初速を上げよう
Rails templateで開発の初速を上げようRails templateで開発の初速を上げよう
Rails templateで開発の初速を上げよう
 
KotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみたKotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみた
 
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
 
Kotlinの紹介
Kotlinの紹介Kotlinの紹介
Kotlinの紹介
 
Slimの紹介
Slimの紹介Slimの紹介
Slimの紹介
 
Calabashでbddしようぜ
CalabashでbddしようぜCalabashでbddしようぜ
Calabashでbddしようぜ
 
Rubotoを試してみた
Rubotoを試してみたRubotoを試してみた
Rubotoを試してみた
 
Successful git
Successful gitSuccessful git
Successful git
 
アプリ内課金してみた
アプリ内課金してみたアプリ内課金してみた
アプリ内課金してみた
 
Webデザイナーのためのandroid用レイアウト講座
Webデザイナーのためのandroid用レイアウト講座Webデザイナーのためのandroid用レイアウト講座
Webデザイナーのためのandroid用レイアウト講座
 
Android 3.Xアプリを開発してみて
Android 3.Xアプリを開発してみてAndroid 3.Xアプリを開発してみて
Android 3.Xアプリを開発してみて
 
Gae開発入門
Gae開発入門Gae開発入門
Gae開発入門
 
ABC2011 Winter #jag4
ABC2011 Winter #jag4ABC2011 Winter #jag4
ABC2011 Winter #jag4
 
初めてのC2DM
初めてのC2DM初めてのC2DM
初めてのC2DM
 

Último

Último (10)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Ormとの付き合い方