ポイントサービスをスリムに保つための会計モデルと金券モデル
はじめに
PIVOTでソフトウェアエンジニアをしている裾分です。今回は、PIVOTのポイントサービス「マイルプログラム」の設計についてまとめました。前回の投稿ではサブスクリプション機能の難しさについて解説しましたので、そちらも併せてご覧いただけると幸いです。
PIVOT マイルプログラムについて
PIVOTマイルプログラムは、動画視聴やコンテンツの利用を通じてポイントを獲得できるプログラムです。獲得したマイルは、Amazon ギフトカードや各種サービスと交換可能です。アカウントを登録し、特定の条件を満たすことでマイルを貯められます。このプログラムは、ユーザーの活動をインセンティブ化し、PIVOTメディアの利用を促進することを目的としています。
PIVOT マイルのユースケース
設計の話に入る前に PIVOT マイルのユースケースである、獲得・消費・失効について記載します。
獲得
PIVOT マイルは、下記の契機などで獲得することができます。
PIVOT アカウントを作成する
プロフィールを入力する
動画を90%以上視聴する
消費
獲得したPIVOTマイルは、Amazonギフトカードをはじめ、ビジネススキルアップに役立つ特典と交換できます。詳細は下記のリンクからご確認ください。
失効
獲得したマイルの有効期限は、獲得してから約6ヶ月(180日)経過後に失効します。
PIVOT マイルの設計について
ユースケースを踏まえ、PIVOT マイルは下記の通り設計しています。
PIVOT マイルの概念モデル
PIVOT マイルは、マイルにまつわる全ての取引を正確に記録することと、現在保有しているマイルとその有効期限の算出を1モデルでは表現が難しいため、会計モデルと金券モデルに分けて設計しています。
取引に対する仕訳を事実として記録し、ユーザーが保有するマイルと有効期限は金券として表現し、保有するマイルの残高は金券から導出するように設計しています。
会計モデル
マイルの獲得、消費、失効の発生を消えない事実として作成する
企業会計の観点で制約があるため、マイルに関する履歴を残す
取引の貸借レコードを仕訳に作成する
勘定科目コード
マイルの獲得、消費、失効を表現するコード
金券モデル
現在保有している金券を表現する
獲得、消費、失効の日時は金券モデルを参照する
マイルを獲得したら獲得マイルにレコードを作成する
マイルを消費したら消し込みにレコードを作成する
マイルが失効したら獲得マイルおよび消し込みのレコードを削除する
単一のテーブルにマイル獲得や消費、失効で必要とする全てのカラムを持った神テーブルを避けた設計になります。
PIVOT マイル獲得契機の概念図
PIVOT プロダクトでは、ユーザーがお得に利用できる機能のことを「特典」と呼称しており、マイルの獲得は特典ドメインとして設計しています。
利用促進のため、動画視聴完了時や会員登録時にボーナスマイルを提供するなど、さまざまな施策を実施しています。今後も施策が増えることが予想されるため、「特典」として抽象化し、会計モデルと特典モデルの密結合を避けつつ、個別の要求に対応するよう設計しています。
PIVOTマイルは複数の契機で獲得できますが、これらの契機は取引に直接持たせず、特典行使エンティティとして表現しています。会計モデルでは獲得の契機をすべて取引として扱い、詳細は個々のエンティティを参照する設計です。
仕様に関する注意事項
本記事で記載されている仕様は、2024年6月時点のものです。今後、仕様が変更される可能性があるため、最新の情報は公式サイトや関連資料をご確認ください。
まとめ
本記事では、PIVOTマイルの設計を例に、マイル獲得や消費、失効に必要なカラムを持つ巨大なテーブルを避けた設計について解説しました。
巨大なテーブルを作成すると、集約条件が複雑になり、エンジニアチームが疲弊する可能性があります。これを避けるために、本記事がこれからポイントサービスを実装する方々の参考になれば幸いです。
感謝の言葉
Web・アプリの本格始動に際し、サブスクリプションおよびマイルの設計に多大なるご支援をいただいた技術顧問の川島さん(@kawasima)に心から感謝申し上げます。本格始動後も、各施策において専門的な知識と洞察力でご助力いただき、誠にありがとうございました。川島さんのサポートがなければ成し遂げられなかったことが多々あります。今後ともどうぞよろしくお願い致します。
最後にいつもの
iOS アプリはこちら
Android アプリはこちら
PIVOTでは、「Androidエンジニア」「映像プロデューサー」「ビジネスプロデューサー」「HRマネージャー」など幅広く募集しています。
PIVOTの技術ブログはマガジンとしてまとめています。こちらもぜひご覧ください!
この記事が気に入ったらサポートをしてみませんか?