1. ホーム
  2. database

[解決済み] データベースで月額課金システムを設計するためのグッドプラクティス【終了しました

2023-01-13 11:07:48

質問

私は、データベースで月額制ソフトウェアシステムを設計する方法を知りたいのです。 これらのシステムはインターネット上で広く使用されていますが、データベース設計に関する多くのものを見つけることができません。

私の場合、これらの要素(および多分私が忘れたいくつかの他の要素)は含まれなければなりません。

  • クライアント
  • プラン('basic'/'premium'など)。各プランには月額料金とクレジット数が設定されています(例:ベーシックプランは月額30クレジット、プレミアムプランは無制限クレジット)。
  • クレジットは、アプリケーション内で使用される仮想通貨です。
  • サブスクリプション/アンサブスクリプション
  • 支払い(割引などにより、実際に支払う金額はプランの基本料金とは異なる場合があることに注意)
  • ... ?

データベースの設計に加えて、これを行うために設定する必要があるトリガーがあるかもしれません(?)

私の苦手なところ。

  • 何がグローバルなデザインなのかが大まかにわからない。
  • DBの行は、month_susbscrition(つまり、月ごとにクライアントごとに1行)または購読自体(つまり、クライアントごとに1行)のどちらであるべきでしょうか?
  • 毎月のサブスクリプションの自動更新は、どのように処理しますか?
  • 毎月の自動支払いを処理するためにPaypalのようなサービスを使用することを予見している場合、どのように支払い設計を処理しますか?

備考

私が自分のニーズを詳細に明かさないのは、そうすることで議論が一般的なものになり、他の人々にとってより有益なものになるからです。

ありがとうございました。

どのように解決するのですか?

私はこのモデルを使用します。

あなたのクライアント

Client
------
Client ID
Name
...

あなたのプラン(必要なときに新しいプランを定義することができます)。 クライアントが一度に12ヶ月分を購入した場合の割引を提案したい場合は、Price_per_yearを追加します(ただし、あくまでアイデアです)。

Plan
------
Plan ID
Name
Credits_per_month
Price_per_month
(Price_per_year)

あなたのサブスクリプション

Subscriptions
------
Subscription ID
Client ID
Plan ID
Subscription_start_timestamp
Subscription_end_timestamp

このモデルを考慮すると、私は1プランにつき1クライアントあたり1行を使用することになります。

クライアントが "プレミアムで初月無料 !" のようなオファーを購読した場合、データベースは次のようになります。

Client
------
ID: 1; LastName: Foo; ...

Plan
------
ID: 1; Name: Premium; Credits: -1 (unlimited); Price_per_month: 30
ID: 2; Name: Premium 1st month offer; Credits: -1; Price_per_month: 0

Subscription
------
ID: 1, Client ID: 1, Plan ID: 2, Start: 2014-05-07 08:00, End: 2014-06-06 07:59
ID: 1, Client ID: 1, Plan ID: 1, Start: 2014-06-07 08:00, End: 9999-12-06 07:59

クライアントが7月1日に購読を中止した場合、Subscriptionテーブルのカラムの最後を月と年だけで更新します(曜日と時刻を事前に設定したため)。

Subscription
------
ID: 1, Client ID: 1, Plan ID: 2, Start: 2014-05-07 08:00, End: 2014-06-06 07:59
ID: 1, Client ID: 1, Plan ID: 1, Start: 2014-06-07 08:00, End: 2014-07-06 07:59

クライアントが退会していないかどうかを知るには、次のようにします。

Select Count(client.*) From Client client
Inner Join Subscription sub On sub.client_id = client.id
Where DATE_TODAY Between sub.start And sub.end

1つのクライアントに対して同時に2つのサブスクリプションを持つことができないことを確認します。

これにより、毎月のサブスクリプションを自動的に処理することができます。 を自動的に処理することができます。 が、銀行やPayPalの口座には反映されません。

しかし、一部の銀行では、2つのサービスを提供しています。 - ユニークデビット - 定期的な引き落とし

2つ目は、月額制の取り扱いができるようになります。