2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでのデータ分析機能実装:SQL vs ORMのメリットとデメリット

Posted at

はじめに

Laravelを使った開発の中で、データ分析機能のコードレビュー時に、データ取得と計算をSQLでするのかORM(Eloquent)でするのか議論になったことがありました。
そこで感じた各メリットでメリットを紹介していきたいと思います!

前提条件

サンプルの条件

前提:ECサイトの売上分析

  1. データベース構造

    • products テーブル
      • id: 製品ID
      • name: 製品名
      • price: 製品価格
    • sales テーブル
      • id: 売上ID
      • product_id: 製品ID(products テーブルとの外部キー)
      • quantity: 売上数量
      • total_price: 売上総額
      • sold_at: 売上日時
  2. 取得したい情報

    • 各製品の月別売上集計(売上数量と売上総額)
    • 各製品の平均販売価格
    • 特定の期間内の売上データ
  3. 使用するツール

    • データベース: MySQL
    • フレームワーク: Laravel

1. SQLでの計算とデータ取得

1.1 メリット

  • パフォーマンスの向上

    • 大量データの処理が速い
    • ネットワークトラフィックの削減
  • 複雑なクエリの柔軟性

    • 高度な集計や結合の容易さ

1.2 デメリット

  • SQLの学習コスト

    • 複雑なSQLを書くための知識が必要
  • データベース依存性

    • DBMS特有の機能や文法に依存しがち

1.3 具体例

サンプルクエリとその解説

SELECT
  product_id,
  MONTH(sold_at) AS sale_month,
  SUM(quantity) AS total_quantity,
  SUM(total_price) AS total_sales,
  AVG(total_price / quantity) AS average_price
FROM
  sales
WHERE
  sold_at BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY
  product_id, sale_month
ORDER BY
  product_id, sale_month;

2. ORM(Eloquent)を使用したデータ取得と計算

2.1 メリット

  • コードの可読性と保守性

    • Laravelのコードベースに統一感が生まれる
    • 直感的なオブジェクト指向の操作が可能
  • フレームワークの機能を活用できる

    • 関係性の管理やデータの操作が簡単
    • バリデーションやイベント、ミドルウェアなどのLaravelの他の機能との統合が容易
  • 簡単なスタートアップ

    • Laravelに標準で組み込まれているため、セットアップが簡単
    • 簡単にデータのリレーションを定義できる
    • デバッグで、どこが間違っているのかの調査が簡単

2.2 デメリット

  • パフォーマンスの問題

    • 大量データ処理での速度低下
    • メモリ使用量の増加
  • 複雑なクエリの困難さ

    • 複雑なデータ取得は困難になる
    • N+1問題などのパフォーマンスに関する課題が発生しやすい

2.3 具体例

Eloquentを使ったサンプルコードとその解説

use Carbon\Carbon;
use App\Models\Product;
use App\Models\Sale;

$startDate = Carbon::parse('2023-01-01');
$endDate = Carbon::parse('2023-12-31');

$products = Product::with(['sales' => function ($query) use ($startDate, $endDate) {
    $query->whereBetween('sold_at', [$startDate, $endDate])
          ->selectRaw('product_id, MONTH(sold_at) as sale_month, SUM(quantity) as total_quantity, SUM(total_price) as total_sales, AVG(total_price / quantity) as average_price')
          ->groupBy('product_id', 'sale_month');
}])->get();

foreach ($products as $product) {
    foreach ($product->sales as $sale) {
        echo "Product: {$product->name}, Month: {$sale->sale_month}, Total Quantity: {$sale->total_quantity}, Total Sales: {$sale->total_sales}, Average Price: {$sale->average_price}\n";
    }
}

3. どちらを使うかの判断基準

3.1 小規模データ vs 大規模データ

  • 小規模データ処理には、Eloquentを使用することで開発の効率する
  • 大規模データ処理には、SQLを使用することでパフォーマンスが向上する

3.2 開発チームのスキルセット

  • SQLに精通しているチームの場合、SQLを使った方が効率的
  • Laravel/Eloquentに慣れているチームの場合、Eloquentを使った方が開発がスムーズ

4. 終わりに

自分は、SQLでのデータ取得が苦手なのでORMを使うことがほとんですが、SQLで取得した方がパフォーマンスの向上にもなるので次回データ分析機能を実装するときはSQLでの取得をしてみたいと思っています!

一緒に働く仲間を募集しています!

株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています!

事業拡大に伴い、エンジニアを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/companies/cnctor/projects

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?