Enviar pesquisa
Carregar
Ormとの付き合い方
•
2 gostaram
•
5,767 visualizações
豊明 尾古
Seguir
第20回中国地方DB勉強会の発表資料です。
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 25
Baixar agora
Baixar para ler offline
Recomendados
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
Recomendados
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
例外設計における大罪
例外設計における大罪
Takuto Wada
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
テストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Takeshi Mikami
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
ローカルExcelとSharePointの連携
ローカルExcelとSharePointの連携
NaokiRyukei
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
Shinnosuke Akita
Mais conteúdo relacionado
Mais procurados
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
例外設計における大罪
例外設計における大罪
Takuto Wada
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
テストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Takeshi Mikami
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
Mais procurados
(20)
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
例外設計における大罪
例外設計における大罪
Docker Compose 徹底解説
Docker Compose 徹底解説
DockerコンテナでGitを使う
DockerコンテナでGitを使う
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
テストコードの DRY と DAMP
テストコードの DRY と DAMP
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
イベント・ソーシングを知る
イベント・ソーシングを知る
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Semelhante a Ormとの付き合い方
ローカルExcelとSharePointの連携
ローカルExcelとSharePointの連携
NaokiRyukei
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
Shinnosuke Akita
便利なHerokuと active recordの 速度改善tips
便利なHerokuと active recordの 速度改善tips
豊明 尾古
RPALT高知Vol1 初心者セミナー
RPALT高知Vol1 初心者セミナー
和志 江口
もしアジャver2.0
もしアジャver2.0
nekogeruge_987
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
Naoto Koshikawa
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
Kazuya Numata
RPALT 新入社員ロボット
RPALT 新入社員ロボット
Shiro Fukuda
20190116 tectettec#7
20190116 tectettec#7
Otazo Man
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
Tokoroten Nakayama
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
Drecom Co., Ltd.
Osh2014
Osh2014
Soudai Sone
How to learn Rails
How to learn Rails
deeeki
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料
Takashi Aoe
Semelhante a Ormとの付き合い方
(14)
ローカルExcelとSharePointの連携
ローカルExcelとSharePointの連携
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
便利なHerokuと active recordの 速度改善tips
便利なHerokuと active recordの 速度改善tips
RPALT高知Vol1 初心者セミナー
RPALT高知Vol1 初心者セミナー
もしアジャver2.0
もしアジャver2.0
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
YAPC::Asia Tokyo 2014 前夜祭 pplog by @ppworks
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
RPALT 新入社員ロボット
RPALT 新入社員ロボット
20190116 tectettec#7
20190116 tectettec#7
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
Osh2014
Osh2014
How to learn Rails
How to learn Rails
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料
Mais de 豊明 尾古
OSS-DB 取得のススメ
OSS-DB 取得のススメ
豊明 尾古
Ecmascript2015とその周辺について
Ecmascript2015とその周辺について
豊明 尾古
ActiveRecord::Enumのススメ
ActiveRecord::Enumのススメ
豊明 尾古
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
豊明 尾古
Middlemanによる静的サイト作成術
Middlemanによる静的サイト作成術
豊明 尾古
Kotlinのwebフレームワーク探訪
Kotlinのwebフレームワーク探訪
豊明 尾古
Rails templateで開発の初速を上げよう
Rails templateで開発の初速を上げよう
豊明 尾古
KotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみた
豊明 尾古
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
豊明 尾古
Kotlinの紹介
Kotlinの紹介
豊明 尾古
Slimの紹介
Slimの紹介
豊明 尾古
Calabashでbddしようぜ
Calabashでbddしようぜ
豊明 尾古
Rubotoを試してみた
Rubotoを試してみた
豊明 尾古
Successful git
Successful git
豊明 尾古
アプリ内課金してみた
アプリ内課金してみた
豊明 尾古
Webデザイナーのためのandroid用レイアウト講座
Webデザイナーのためのandroid用レイアウト講座
豊明 尾古
Android 3.Xアプリを開発してみて
Android 3.Xアプリを開発してみて
豊明 尾古
Gae開発入門
Gae開発入門
豊明 尾古
ABC2011 Winter #jag4
ABC2011 Winter #jag4
豊明 尾古
初めてのC2DM
初めてのC2DM
豊明 尾古
Mais de 豊明 尾古
(20)
OSS-DB 取得のススメ
OSS-DB 取得のススメ
Ecmascript2015とその周辺について
Ecmascript2015とその周辺について
ActiveRecord::Enumのススメ
ActiveRecord::Enumのススメ
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
ウェブアプリケーションのためのユニバーサルデザインを読んだので共有する
Middlemanによる静的サイト作成術
Middlemanによる静的サイト作成術
Kotlinのwebフレームワーク探訪
Kotlinのwebフレームワーク探訪
Rails templateで開発の初速を上げよう
Rails templateで開発の初速を上げよう
KotlinAndroidLibを使ってみた
KotlinAndroidLibを使ってみた
Rubyistのためのkotlin紹介
Rubyistのためのkotlin紹介
Kotlinの紹介
Kotlinの紹介
Slimの紹介
Slimの紹介
Calabashでbddしようぜ
Calabashでbddしようぜ
Rubotoを試してみた
Rubotoを試してみた
Successful git
Successful git
アプリ内課金してみた
アプリ内課金してみた
Webデザイナーのためのandroid用レイアウト講座
Webデザイナーのためのandroid用レイアウト講座
Android 3.Xアプリを開発してみて
Android 3.Xアプリを開発してみて
Gae開発入門
Gae開発入門
ABC2011 Winter #jag4
ABC2011 Winter #jag4
初めてのC2DM
初めてのC2DM
Último
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
Último
(9)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
Ormとの付き合い方
1.
ORMとの付き合い方 中国地方DB勉強会 in 岡山 @patorash
2.
自己紹介 名前:尾古 豊明(おこ とよあき) twitter:@patorash 株式会社リゾーム所属 普段はRuby on Railsでショッピングセンター向けのシステム開発をしてます。 SQLわからんマンだったのでCakePHPで初めてORMに触れたときはあまりの便利さに 衝撃を受けて全てORMになってくれ!と思ったものでした。 ORMの出すSQLを読んで、SQLがわかるようになってきたので、 今SQLが読めるのはORMのおかげと言っても過言ではありません。 最近は集計処理用のSQLを書くのが楽しい。 一昨年に息子が生まれ、子育てに奮闘中。
3.
新支部長からの質問 RDBの新機能にORMって中々ついていけないものだと思っているんですが、普段、業 務でどこまでORMで使ってるんだろう?とか気になります。 会社の人に、「ORMってDBが変わっても、それなりに気にせず使える、ってメリットはあ るものの、複雑なSQLの場合、ORMよりもSQLで書いた方が(工数的に)速い場合とか あって、実際、どうすれば良いんですか?」って聞かれたりもして、ORMとどこまで付き 合うべきなんでしょうか。
4.
ORMとは? ● Object-relational mapping(オブジェクト関連マッピング) ●
データを取得したタイミングで、データを元にオブジェクトを生成する。 ● 特定のテーブルとクラスが1対1になっていて、そのクラスのメソッド経由でデータ を取得する(Rubyで使われるORMのActiveRecordなどの場合)
5.
ORMの利点 1. 異なるDBの違いを吸収してくれる 2. SQLを書かなくてもいい(自動生成してくれる) 3.
プレイスホルダーによってエスケープをよしなにしてくれる (SQLインジェクション対策)
6.
ORMのよくない点 1. 遅い(オブジェクト生成) 2. リソースを食う(メモリ消費が大きい) 3.
特定のDBの便利な機能が使えない 4. 複雑なデータを取得しようとするとSQLより難しい 5. 頑張れば1回で取得できるデータなのに、 何度もクエリを発行するような処理を書いてしまいがち。 結果、さらに遅くなる…。 6. ORMでのデータ取得にこだわりすぎる人が現れる
7.
そもそも論として…SQL派の人へ 1. 速いのは正義ですが、そんなにスピード求められますか? ORMでも高速にデータ取得する方法は準備されてたりしますが。 (マッピングせずに配列として取得するとか) 2. 特定のDBの機能、頻繁に使いますか? 3.
ORMのプレイスホルダーを利用したエスケープって便利じゃないですか?
8.
そもそも論として…ORM派の人へ 1. データベース自体の変更ってよくありますか? (ビジネスがかなり拡大してきたらありえるとは思う) 2. なにがなんでもORMで処理しなければならないことってありますか? 3.
ORMを使っててもDB制約は利用しますよね? (ユニーク制約、NOT NULL制約、Indexなどなど…) 4. クエリ発行回数は意識してますか? DBへのアクセス数が多いのは怠慢ですよ!(ウッ…
9.
どうして二元論にしようとするのか? 1. ORMかSQLのどちらかに統一されてないと気持ち悪いですか? 2. 目的は、いいプロダクトを作ること 3.
ORMを使ったほうが便利なものはORMで 4. SQLを書いた方が楽な場合はSQLで 5. とはいえ、9割方ORMを使ってます
10.
ORMの利点(ActiveRecord) 1. 直感的なデータ検索 2. データの整合性チェックが容易 3.
コールバックによる連携更新 4. 取得したデータがオブジェクトなのでさらに直感的に 5. 変更に強い 6. テスト可能になる 7. テーブル定義の変更の履歴が残る
11.
SQLの利点 1. 方言はあるものの、だいたいどのDBでも同じ 2. ORMで表現しづらいことが比較的楽に書ける
12.
SQLのよくない点 1. 直感的ではない 2. SQLがわかる人しか書けない 3.
テストが(簡単には)できない 4. データの整合性チェックが(簡単には)できない 5. 変更に弱い 6. 作者の意図を表現できない(ORMだとメソッド名で表現できる)
13.
ORMの利点(ActiveRecord) 1. 直感的なデータ検索 2. データの整合性チェックが容易 3.
コールバックによる連携更新 4. 取得したデータがオブジェクトなのでさらに直感的に 5. 変更に強い 6. テスト可能になる 7. テーブル定義の変更の履歴が残る
14.
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 # => 論理削除されたコメントを取得
15.
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を書くのがダサイという意見は当然ある)
16.
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
17.
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
18.
6. テスト可能 ● データの整合性チェック、本当に正しいものが定義できてる? ●
複雑な条件でのみ登録・更新できるパターンの検証は人力では難しい 例1)1人のユーザーが所有できるモンスターの上限は3000。 3001番目が登録されたら…? 例2)メールアドレスの重複登録はできないが、退会済ユーザーの メールアドレスは再登録できるように。 例3)A,B,Cが登録されてようやくDが登録できる ● データの取得に関しても同様に、正しいデータが取得できてる? 例1)前回のログイン以降に更新されたデータ件数を取得 例2)公開フラグのあるデータのみを取得できているか? ユニットテストで検証が可能!(RubyならRspecやMinitestなど) ※SQLも取得結果はプログラミング言語側でテスト可能
19.
ORMの検証とDB制約の利用
20.
ORMとDB制約を使ってデータの整合性を担保 DBに保存 DB制約 ORMのデータ検証 入力データ ・外部キー制約 ・ユニーク制約 ・NOT NULL制約 ・フォーマット検証 ・外部キー制約 ・ユニーク制約 ・NOT NULL制約 ・複雑なビジネスロジックの検証
21.
ORMとDB制約で冗長では?
22.
ORMとDB制約を使ってデータの整合性を担保 DBに保存 DB制約 ORMのデータ検証 入力データ ・外部キー制約 ・ユニーク制約 ・NOT NULL制約 ・フォーマット検証 ・外部キー制約 ・ユニーク制約 ・NOT NULL制約 ・複雑なビジネスロジックの検証 DB制約がないとSQL で 更新されたら不正な データができる!
23.
ORMの利用シーン 1. Webアプリケーションのいたるところで利用 2. 不具合の調査(rails
console、デバッガ) 3. 頻繁に変更がありうる処理
24.
SQLの利用シーン 1. データ分析(主に集計。UNIONしたりとか、Window関数使うとか) 2. ORMで表現するのが難しい処理(whereの条件が複雑とか) 3.
滅多に変更がない処理
25.
まとめ 1. 適材適所で付き合おう 2. ORM使ってたとしてもDBの勉強は必要 3.
ORMとDB制約のダブルチェックで安全なデータ管理
Baixar agora