web-dev-qa-db-ja.com

データベースの月間サブスクリプションシステムを設計するための優れた方法

データベースで月次サブスクリプションソフトウェアシステムを設計する方法を知りたい。これらのシステムは、インターネット上で広く使用されていますが、データベース設計に関するものはあまり見つかりません。

私の場合、これらの要素(およびおそらく忘れていた他の要素)を含める必要があります。

  • クライアント
  • 計画(「基本」/「プレミアム」など)。各プランには月額料金とクレジット数があります(たとえば、基本プランでは月あたり30クレジット、プレミアムプランでは無制限のクレジットが提供されます)。
  • クレジットは、アプリケーション内で使用される仮想マネーです。
  • サブスクリプション/サブスクリプション解除
  • 支払い(実際に支払われる価格は、割引などのためにプランの基本価格と異なる場合があることに注意してください)
  • ...?

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

私の問題点:

  • 一般的な方法では、このグローバルデザインが何であるかはわかりません。
  • DBの行は、month_susbscrition(クライアントごとに1行あたり1行)とサブスクリプション自体(クライアントごとに1行)のどちらになりますか?
  • 毎月のサブスクリプションの自動更新をどのように処理しますか?
  • Paypalのようなサービスを使用して月額自動支払いを処理すると予想される場合、支払い設計をどのように処理しますか?

こうすることで、議論が一般的なものになり、他の人々にとってより有用になる可能性があるため、私は自分のニーズを詳細に自発的に公開しません。

手伝ってくれてありがとう。

50
David D.

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

あなたのクライアント

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

プラン(必要に応じて新しいプランを定義できます)。クライアントが1発で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行を使用します。

クライアントが「Premium with 1st month free!」などのオファーをサブスクライブすると、データベースは次のようになります。

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
------
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番目の方法では、毎月のサブスクリプションを処理できます。

55
Chambeur

リレーショナルテーブルのデザインとリレーショナルデータベースを使用します。

クライアントテーブルがあります。

Client
------
Client ID
Client Last Name
Client First name
...

サブスクリプションテーブルがあります

Subscription
------------
Subscription ID
Client ID
Subscription Purchased Time stamp
Subscription Started Time stamp
Subscription Ends Time stamp

購入表があります

Purchase
--------
Purchase ID
Subscription ID
Payment method
...

質問に答えましょう。質問は一度に1つだけにしてください。

DBの行は、month_subscription(クライアントごとに1行あたり1行)とサブスクリプション自体(クライアントごとに1行)のどちらになりますか?

サブスクリプションごとに月ごとに1行。

毎月のサブスクリプションの自動更新をどのように処理しますか?

Netflixは毎月Paypalアカウントから引き落とします。 Paypalまたはクレジットカードでも同じことができます。クレジットカードを受け入れる場合、銀行、クレジットカード処理業者、またはPaypalと取り決めをする必要があります。

Paypalのようなサービスを使用して月額自動支払いを処理すると予想される場合、支払い設計をどのように処理しますか?

Netflixは毎月Paypalアカウントから引き落とします。あなたも同じことができます。

8

受け入れられた回答を見て、サブスクリプションまたはプランのすべての変更または更新が後方参照用に保存される別のテーブルを追加します。これにより、いつどのプランがどの期間に選択されたかを明確に記録できます。

サブスクリプションテーブルには、アクティブであるかどうか、支払い日、および日常業務で必要となる可能性のあるその他のデータを示す変数が含まれていることを確認します。

余分なテーブルにより、必要に応じて任意の時点でサブスクリプションを再作成できるようになります。

1
Kim Steinhaug