web-dev-qa-db-fra.com

Bonnes pratiques pour la conception d'un système d'abonnement mensuel dans une base de données

J'aimerais savoir comment concevoir un système logiciel d'abonnement mensuel dans une base de données . Ces systèmes sont largement utilisés partout sur Internet, bien que je ne trouve pas beaucoup de choses sur la conception de bases de données.

Dans mon cas, ces éléments (et peut-être d'autres que j'ai oubliés) doivent être inclus:

  • Client
  • Plan (comme «basique»/«prime»). Chaque plan a un prix mensuel et un montant de crédits (par exemple: le plan de base fournit 30 crédits par mois et les plans premium des crédits illimités).
  • Les crédits sont une somme d'argent virtuelle dépensée dans l'application.
  • Abonnement/Désabonnement
  • Paiements (notez que le prix effectivement payé peut différer du prix de base du plan en raison de la réduction, etc.)
  • ...?

En plus de la conception de la base de données, certains déclencheurs doivent être configurés pour effectuer cette opération (?).

Mes points de douleur:

  • Je ne vois pas de manière générale quelle est la conception globale de cette
  • Laquelle doit être une ligne dans la base de données: le mois (1 ligne par client par mois) ou la souscription elle-même (1 ligne par client)?
  • Comment gérez-vous le renouvellement automatique de l'abonnement mensuel?
  • Comment gérez-vous la conception des paiements si vous envisagez d'utiliser des services tels que Paypal pour gérer les paiements mensuels automatiques?

Remarque

Je n'expose volontairement pas mes besoins dans les détails car de cette façon, le débat peut rester générique et peut être plus utile pour les autres.

Merci pour l'aide.

39
David D.

J'utiliserais ce modèle

Vos clients

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

Vos plans (vous pouvez définir de nouveaux plans à votre guise) ... Je rajoute un Price_per_year si vous souhaitez proposer un rabais si le client achète 12 mois en une seule fois (mais ce n'est qu'une idée).

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

Vos abonnements

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

Compte tenu de ce modèle, j'utiliserais 1 ligne par client et par plan.

Lorsqu'un client souscrit à une offre telle que "Premium avec 1er mois gratuit!", Votre base de données se présente comme suit:

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

Lorsqu'un client se désabonne le 1er juillet, mettez à jour la fin de la colonne dans votre table Subscription avec le mois et l'année uniquement (car vous avez prédéfini le jour et l'heure).

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

Pour savoir si un client ne se désabonne pas, vous pouvez utiliser ceci:

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

Assurez-vous que vous ne pouvez pas avoir 2 abonnements pour un client en même temps.

Cela vous permet de gérer automatiquement l'abonnement mensuel dans votre application , mais pas avec votre compte bancaire/Paypal.

Mais certaines banques vous proposent deux services: - Débit unique - Débit périodique

Le second vous permettrait de gérer l’abonnement mensuel.

43
Chambeur

Je voudrais utiliser une conception de table relationnelle et une base de données relationnelle.

J'aurais une table de client.

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

J'aurais une table d'abonnement

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

J'aurais une table d'achat

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

Maintenant pour répondre à vos questions. Vous ne devriez poser qu'une question à la fois.

Laquelle devrait être une ligne dans la base de données: l'abonnement month_subscription (c'est-à-dire 1 ligne par client par mois) ou l'abonnement lui-même (c'est-à-dire 1 ligne par client)?

Une ligne par abonnement par mois.

Comment gérez-vous le renouvellement automatique de l'abonnement mensuel?

Netflix débite mon compte Paypal tous les mois. Vous pouvez faire la même chose avec Paypal ou avec une carte de crédit. Si vous acceptez les cartes de crédit, vous devrez prendre des dispositions avec votre banque, un service de traitement de cartes de crédit ou Paypal.

Comment gérez-vous la conception des paiements si vous envisagez d'utiliser des services tels que Paypal pour gérer les paiements mensuels automatiques?

Netflix débite mon compte Paypal tous les mois. Tu pourrais faire la même chose.

8

En regardant la réponse acceptée, j'ajouterais une autre table dans laquelle tous les changements ou mises à jour d'un abonnement ou d'un plan seraient stockés pour référence ultérieure. De cette façon, vous avez un journal clair sur quand et quels plans ont été sélectionnés pour quelle période.

Je m'assurerais que la table d'abonnement contienne les variables qui vous indiquent si elle est active ou non, à quelle date elle est payée et toutes autres données possibles dont vous auriez besoin dans les opérations quotidiennes.

La table supplémentaire vous assurera de pouvoir recréer n’importe quel abonnement à tout moment, si nécessaire.

0
Kim Steinhaug