Slide 1

Slide 1 text

pixiv Inc. 限界ORM! BOOTHとギフトとライブラリ RND

Slide 2

Slide 2 text

Profile RND エンジニア クリエイター事業部 BOOTH部所属 絵と漫画を描く が趣味 RND(らんど)と読みます

Slide 3

Slide 3 text

前提知識 検索する時に自動でクエリを組み立ててくれる心づよい友達 ORM (= Object Relation Mapping) RDB レコードとオブジェクトとを変換する技術 ActiveRecord: Rails ORMフレームワーク

Slide 4

Slide 4 text

今回 話

Slide 5

Slide 5 text

BOOTH ギフト機能 なし クリエイターとファンを繋ぐ C2C 販売プラットフォーム Railsで書かれている 今年10周年 BOOTH

Slide 6

Slide 6 text

2022年12月

Slide 7

Slide 7 text

DL商品を購入する ギフト用URLが発行される URLにアクセスすると 他 人が DL商品を受け取ることが できる

Slide 8

Slide 8 text

こ 機能

Slide 9

Slide 9 text

実装が大変だった

Slide 10

Slide 10 text

これまで BOOTH 所有者 = 購入者 注文 LineItem 注文と商品 関連テーブル 商品 購入者 (所有者) * 所有 * * これが... 注文完了かつ、LineItemがあれ 所有してる

Slide 11

Slide 11 text

ギフト 場合 所有者 ≠ 購入者 注文 LineItem 注文と商品 関連テーブル 商品 購入者 * 所有(ギフトじゃない時) * * ギフト 受取ユーザー 所有(ギフト 時)

Slide 12

Slide 12 text

ということ 所有=購入で運用されてきたサービス 所有と購入を分離、影響箇所 ... 注文 LineItem 注文と商品 関連テーブル 商品 購入者 発送 売り上げ管理 カート pixivFACTORYと 連携 送り状(伝票) 生成 レコメンド アルゴリズム 無限にある

Slide 13

Slide 13 text

ということ 所有=購入で運用されてきたサービス 所有と購入を分離、影響箇所 ... 注文 LineItem 注文と商品 関連テーブル 商品 購入者 発送 売り上げ管理 カート pixivFACTORYと 連携 送り状(伝票) 生成 レコメンド アルゴリズム 無限にある it’s 無理

Slide 14

Slide 14 text

やった 意外となんとかなる 必要な 気合い やったらできた grepして出てきた箇所をnotionに書き出して影響 有無を判断

Slide 15

Slide 15 text

本題

Slide 16

Slide 16 text

ライブラリ なし

Slide 17

Slide 17 text

ライブラリ ギフトによって 所有 経路が2種類になった 所有している商品が入手順に並ぶページ

Slide 18

Slide 18 text

ギフトで受け取った商品も 自分で買った商品も ライブラリに入手順で並べる

Slide 19

Slide 19 text

2種類 経路でJOINされたテー ブルを結合 でもRails(ActiveRecord)にない unionを実装したgem? もしく 生SQLを書くか、orメソッドなどで頑張る UNIONが必要そう

Slide 20

Slide 20 text

分けたらええやん 「無理そう」な設計が出たら要件を見直す 別ページに分けて解決、ユーザーも困らない。 ギフトで受け取った商品 別ページに遷移して表示

Slide 21

Slide 21 text

まだある

Slide 22

Slide 22 text

ギフト、何回でも受け取れる こんなケース こ 前言ってた アバター、 プレゼントで送ります 好きそうなアバター あったんでギフトで 送ります ダブってしまったけど 受け取らない も 申し訳ないなぁ...

Slide 23

Slide 23 text

受け取れます

Slide 24

Slide 24 text

何回でも

Slide 25

Slide 25 text

ということ

Slide 26

Slide 26 text

ライブラリ 複数回受け取った商品 最新 1件だけ表示される 所有している商品が入手順に並ぶページ new!

Slide 27

Slide 27 text

複数回受け取った場合 GROUP BY `商品` 1件にまとめて表示 ORDER BY `ギフト.受け取り日時` DESC 最近受け取ったも が先にくるように並べる

Slide 28

Slide 28 text

こうか??

Slide 29

Slide 29 text

ダメ ORDER BY GROUP BY より後に実行される

Slide 30

Slide 30 text

欲しいクエリ これ ActiveRecordで記述する手段 ない、一部生SQLになる

Slide 31

Slide 31 text

別 案: サブクエリ 件数がめちゃくちゃ増えてくるとパフォーマンスが悪くなる ActiveRecord from を使うとサブクエリが使える

Slide 32

Slide 32 text

もっと良さそうな案 変えようぜ、テーブル設計 所有を表現するテーブルを用意 アプリケーションで整合性を保つ 移行する 大変だが シンプルで変更につよそう

Slide 33

Slide 33 text

すまんがリリースまで時間ないわ 実装する に時間がかかる 今回 サブクエリ案で年内にリリース。 ユーザーに素早く価値を提供することが大事

Slide 34

Slide 34 text

まとめ:教訓 ActiveRecord、なんかすぐ限界になりがち 限界が見えたら 1. まず要件と仕様を見直す。 コードを書かずに解決しよう 2. テーブル設計を見直す。 プロダクトをシンプルに保とう 3. ActiveRecord芸を頑張ったり、生SQLもありかも (ユニットテストがしっかり書かれててCIでテストがちゃんと動いてるなら生SQLで別にいいんじゃないか(小声))

Slide 35

Slide 35 text

早くこれにしたい で、エンジニアを募集中 ご清聴 ありがとうございました