ActiveRecord使いが知るべき世界:Kaigi on Rails 2025

197 Views

September 27, 25

スライド概要

『Kaigi on Rails 2025』登壇資料

ActiveRecord使いが知るべき世界:Java/Go/TypeScriptのORMアプローチ比較

https://kaigionrails.org/2025/talks/tora-kouno/#day2

#kaigionrails

profile-image

Ruby/Javaプログラマー。エンジニアリングマネージャー。 軽度の広く浅いオタク。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

TORANOANA Lab ActiveRecord使いが知るべき世界 Java/Go/TypeScriptの ORMアプローチ比較 虎の穴ラボ 通販チーム 河野 裕隆 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

2.

自己紹介 河野裕隆 2019/08入社 Hirotaka Kouno 新規開発チーム クリエイティア(Rails) => 通販チーム(Java)に異動しました - Kashiwa.rb - 東葛.dev主催 - きのこカンファレンスコアスタッフ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

3.

ActiveRecordでクエリを書く時、 もどかしく感じたことはありませんか? Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

4.

例:想定したindexがうまく使われない 😭😭😭 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

5.

主題、今日伝えたいこと 他のORMを知ることで ActiveRecordの特徴を理解し 設計の視野を広げよう Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

6.

注意事項 紹介するライブラリが 優れている/劣っているという話ではありません 各言語特性や文化を踏まえて伝えていきたい Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

7.

話すこと 1 ORMとは 2 ActiveRecordとは 3 他のORMとの比較 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

8.

ORMとはなにか ● Object-Relational Mapping(オブジェクトリレーションマッピング) O/Rマッパー プログラム上の「オブジェクト」と リレーショナルDB上のレコードの変換を簡略化する Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

9.

ORMとはなにか - 最も狭義のORM ● 最も狭義のORM - DBから取得した結果一覧をプログラムの型に落とし込む - クエリの発行の簡略化 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

10.

ORMとはなにか - 最も狭義のORM ● DBから取得した結果一覧をプログラムの型に落とし込む Railsで結果一覧を取得すると「ActiveRecord::Relation」インスタンスに マッピングされる さらにRelationの内部には各モデルにマッピングされている Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

11.
[beta]
ORMとはなにか - Railsで見てみる
User.all
SQL:SELECT "USERS".* FROM "USERS"
Return:ActiveRecord::Relation [#<User id: 1, name: "河野裕隆"...]>

Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

12.

当たり前だろ! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

13.
[beta]
ORMとはなにか - Railsで見てみる
Mappingなしで実行
ActiveRecord::Base.connection.select_all
Return:#<ActiveRecord::Result:
@columns=["id", "name"], @rows=[[1, "河野裕隆"]]>

Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

14.

ORMとはなにか - Railsで見てみる @columns=["id", "name"], @rows=[[1, "河野裕隆"]]をモデルに result = ActiveRecord::Base.connection.select_all ちなみにmysql2やpgを直接使うと result.columns.zip(row).to_h相当のHashが返ってきます Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

15.

いやーORMって便利ですねー パラメータの解析をしなくて良い Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

16.

ORMとはなにか - 狭義のORMが解消するもの ● オブジェクトを生成する手間の解消(SELECT) ● オブジェクトのライフサイクルの管理(INSERT/UPDATE/DELETE) ● インピーダンスミスマッチ DBの型と言語の型の差異の解消 Rubyの場合、mysql2やpgなどのDBクライアントレベルで実装 データ構造の不一致(テーブル構造とオブジェクト) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

17.

ORMの類型 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

18.

ORMとはなにか - ORMの類型 大きく2種類にわかれる ● Active Recordパターン LaravelのEloquentなど ● Data Mapperパターン Entity(データ構造、格納先)とRepository(アクセス層)が分離 JavaのHibernate、PHPのDoctrineなど Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

19.

ORMとはなにか - もっと広い定義 ● SQLビルダー(オブジェクトのライフサイクル管理は範囲外) クエリ発行の責務を強く持つ JavaのMyBatisなど ● マイグレーションツール DBのテーブル定義の更新等を管理する RubyのridgepoleやJavaのFlywayなど Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

20.

Rubyで使えるORM Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

21.

ORMとはなにか - Rubyで使えるORM ● ActiveRecord:Active Recordパターン あとで説明します!! ● Ruby Object Mapper:Data Mapperパターン Hanamiで使われている、EntityとRepositoryが分離している ● Sequel:SQLビルダー、Active Recordパターン(?) ActiveRecordっぽくも使えるがDBを直接いじるイメージ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

22.

話すこと 1 ORMとは 2 ActiveRecordとは ← イマココ 3 他のORMとの比較 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

23.

ActiveRecordとは ● Active RecordパターンのORM ってだけじゃない ● DB Migration(スキーマ管理) ● バリデーション機構 ● コネクションプーリング etc... Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

24.

ActiveRecordは オールインワンなORM Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

25.

ActiveRecordが実現した世界 ● 明示的なマッピングなしで直感的なデータ操作可能な世界 「設定より規約」の原則を適用、設定ファイルなしでDB操作 ● データの取り扱いはこれさえいれれば大丈夫な世界 ORMだけでなく、バリデーション、スキーマ管理を内包 ● SQLを覚えなくてもなんとかなる世界 DSLによる柔軟なクエリ発行が行える Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

26.

ActiveRecordとは - 影響を与えたライブラリ Active RecordパターンのORMの代表格として他言語へ影響を与える いわゆるRailsライクなフレームワーク(ORM) ● Laravel Eloquent (PHP) エロクエント ● Django ORM (Python) ● AdonisJS Lucid (Node.js) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

27.

話すこと 1 ORMとは 2 ActiveRecordとは 3 他のORMとの比較 ← イマココ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

28.

いろんな軸でORMを見ていきます Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

29.

このセクションで話すこと 1 クエリ発行 2 スキーマ管理 3 多機能性 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

30.

クエリ発行 紹介するライブラリ ● ActiveRecord ● TypeScript - Prisma ● Java - JPA ● Java - Doma2 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

31.

クエリ発行 - ActiveRecordの場合 Modelクラス.where(条件).select(カラム配列) シンプルな例だとこんな感じ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

32.

クエリ発行 - ActiveRecordの場合 もう少し複雑に関連付け込みで検索する joinsでINNER JOINを実現。status値はenum定義から値で検索 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

33.

振り返りはこのくらいにします ActiveRecord便利!最高!! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

34.

クエリ発行 - TypeScript - Prisma TypeScript - Prisma Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

35.

直感的で読みやすい! ActiveRecordにも近い Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

36.

クエリ発行 - Prisma 解説 何がすごいって型安全にDSLを扱えるところ スキーマ定義と密接に紐づいてDSLが作られているから スキーマ:statusは数値を受け付ける DSL:statusの比較対象は数値しか入れられないようにしないとな! Rubyは動的型付けなのでname: hogeのhogeにはどんな型でも入る...... Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

37.

クエリ発行 - Java - JPA Java - JPA(仕様名なので実装はSpring Data JPA) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

38.

まぁ...... わからないですよね...... Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

39.

クエリ発行 - JPA 解説 JpaRepositoryクラスを継承した、interfaceクラスのメソッド名からSQL を発行する仕組みがある ● findBy:「検索するクエリ」の開始キーワード ● User_CreatedAtGreaterThanEqual:UserプロパティのCreatedAtに 大して大小比較で検索(アンスコは孫プロパティであることを示す) ● OrderByCreatedAtAsc:順序の指定 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

40.

クエリ発行 - DSLで発行する系 Java - JPA(仕様名なので実装はSpring Data JPA) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

41.

クエリ発行 - DSLで発行する系 Java - JPAの面白いところ ● SQLに近い記法(JPQL)での定義も可能(not SQL) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

42.

DSLの欠点 実行するまでクエリがわからない! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

43.

Rails consoleで試し打ちしてません? Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

44.

とはいえ、 「パラメーター多くてちょっと辛い...」 みたいなことありませんか? Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

45.

クエリマッパーという考え方 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

46.

クエリ発行 - Java - Doma2 Java -Doma2 アプローチ:2WaySQLを呼び出す Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

47.

クエリ発行 - Java - Doma2 /dao/TodoDao/selectTodos.sqlのようなpathにSQLファイルを配置 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

48.

クエリ発行 - Doma2 解説 2WaySQLは以下の両方が編集なしで実行できるSQLのこと ● プログラムから変数をバインドした実行 コメントアウト部分の定義にバインドし、後ろの実数は削除 ● DBクライアント等からの直接実行 コメントアウト後ろの実数をもとにSQLを発行 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

49.

クエリ発行 - Doma2 解説 Doma2のすごいところ ● Daoインターフェイスの型とSQLの型をコンパイル時にチェックする Annotation ProcessingというJavaの仕組み 引数名の誤りや型の誤りはコンパイル時にエラーになる Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

50.

クエリ発行 - まとめ ● ActiveRecordやPrismaのDSLは読みやすい ● 型安全の実現にいろんな手法がとられている 事前コンパイル、スキーマ駆動 ● 2WaySQLならデバッグ実行が楽 全部プログラム上で解決しないクエリマッパーというアプローチ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

51.

このセクションで話すこと 1 クエリ発行 2 スキーマ管理 ← イマココ 3 多機能性 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

52.

スキーマ管理とは(ここでの定義) ● DBのテーブル定義をコードで管理する技術 ● テーブル定義とプログラム上の型のマッピングの管理 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

53.

スキーマ管理 紹介するライブラリ ● ActiveRecord ● TypeScript - Prisma =====越えられない壁(以下はマッピングの管理のみ)====== ● Java - MyBatis ● Go - sqlc Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

54.

スキーマ管理 - ActiveRecordの場合 次のようなファイル作って db:migrateするだけ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

55.

スキーマ管理 - ActiveRecordの場合 ● db:migrate ● schema_migrationsテーブルにてバージョン管理 ● schema.rb(structure.sql)が生成される ちなみにModelプロパティの型情報はDBのメタ情報を取得 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

56.

スキーマ管理 - TypeScript - prisma 次のようなファイル作ってnpx prisma migrate devするだけ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

57.

スキーマ管理 - TypeScript - prisma prismaのすごいところ:宣言型マイグレーション 変更は次のようなファイル作って再度npx prisma migrate devする Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

58.

スキーマ管理 - TypeScript - prisma スキーマと型のマッピング:prisma generateすると型とクライアント が生成される => 次のようなコードが使えるようになる Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

59.

スキーマ管理 - その他 FlywayやGooseといった3rd partyライブラリを使うことが多い ActiveRecordやPrismaのように内包しているほうがレア(?) ここからはテーブル情報とオブジェクトのマッピング方法を見ていく ⇔ データベーススキーマの変更とアプリケーションのコードを分離 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

60.

スキーマ管理 - Java - MyBatis XML/アノテーションで設定する 右はXMLで定義する例 insertとかは省略 アノテーションはJavaクラスの フィールドに対応を書く Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

61.

スキーマ管理 - Go - sqlc ● schema.sql:構造体の型の生成元 ● リポジトリに対応するSQL:リポジトリ、インターフェイスの生成元 上記をもとにコマンドで実装を生成するアプローチ => 柔軟なSQLが作れる、マッピングも自由にできる Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

62.

スキーマ管理 - Go - sqlc ● schema.sql:構造体の型の生成元 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

63.

スキーマ管理 - Go - sqlc ● 自動生成される構造体の例 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

64.

スキーマ管理 - Go - sqlc ● リポジトリに対応するSQL:リポジトリ、インターフェイスの生成元 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

65.

スキーマ管理 - Go - sqlc 生成されるリポジトリクラス 引数になる構造体も同時生成 CreateTodoParams Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

66.

スキーマ管理 - まとめ ● ActiveRecordやPrismaはORMと一体化させることで開発体験を向上 ● Javaでは、あえて分離することによってアプリケーションコードがDB に依存しないように考慮している感 ● sqlcは熟練したSQL職人がいるならあり(?) 引数の型もschema.sqlを見て生成してくれるので型安全 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

67.

このセクションで話すこと 1 クエリ発行 2 スキーマ管理 3 多機能性 ← イマココ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

68.

ActiveRecord=オールインワン 他言語、ライブラリでは? Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

69.

多機能性の比較 ライブラリ クエリのDSL発行 コネクションプール スキーマ管理 ActiveRecord ⭕ ⭕ ⭕ Java - Spring Data JPA ⭕ 🔺 ✖ TypeScript - Prisma ⭕ ⭕ ⭕ Go - sqlc ✖ ✖ ✖ ⭕が多いから優れているわけではない 例えばJavaのコネクションプーリングはHikariCPという定番ライブラリを組み合わせる チームに合わせてカスタマイズ性があるという利点 柔軟に(好き勝手に)やることとのトレードオフ関係もある(※Rails way) Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

70.

まとめていきます Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

71.

まとめ① Java:単機能のライブラリを組み合わせることが多い アダプタパターン等で柔軟に使えるようになっている(標準化がやけに進 んでいる?)、分業への意識もありそう 脱出ハッチみたいな実装も多数(Hint句がかけたり) => 大規模、toB向け開発での利用が多いという特性の反映 C#も似たようなところあります Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

72.

まとめ② Go:コードを逆生成するなど他言語にはあまりないアプローチを取ること が多い IaC的な感じで環境を整える文化 小規模な「わかっている」チームでの開発が良さそうで組み合わせによる カスタマイズ性を重んじる傾向 => 特有の文化(Goに入ればGoに従え?)がある気がする Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

73.

まとめ③ TypeScript:いろいろなところで親切 後発ライブラリならではの「いいとこ取り」感 => 趣味でも業務でも、みたいなRailsと同じような思想を感じる Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

74.

ActiveRecordを振り返る ● 設定より規約により「よしなに」してくれる部分が多く楽 ● それゆえに逸脱したことがやりにくいところもある やらなくて済むように設計をがんばろう! ● 直感的なDSLやオールインワンな管理等はやっぱり魅力的! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

75.

主題、今日伝えたいこと 他のORMを知ることで ActiveRecordの特徴を理解し 設計の視野を広げよう Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

76.

全体を振り返る ● 実装範囲やアプローチの違いはライブラリの責務がどこまでか、何を担 保したいかという色でしかない:ライブラリの良し悪しではない ● アプローチの違いは言語特性や文化に依存することがある Railsは? => 設定より規約、考えなくていいことを増やす Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

77.

全体を振り返る ● チームやプロダクト文化にあったライブラリ選定が必要 => そのために他の選択肢を知っておくと良いよね(このトーク) 全部 / SQLの発行責任のみ / 型安全 / 静的検査 ● t_wadaさん「技術の進歩は「螺旋」である。」 他の言語の潮流を見ることも役にたつ(with AI文脈でも) 「dynamic!」:変化への順応と「修復」への事前キャッチアップ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.

78.

なんだかんだ ActiveRecord最高!! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.