web-dev-qa-db-de.com

Bewährte Verfahren für die Gestaltung eines monatlichen Abonnementsystems in der Datenbank

Ich würde gerne wissen, wie man ein monatliches Subskriptions-Softwaresystem in einer Datenbank entwirft .. Diese Systeme werden im gesamten Internet verwendet, obwohl ich nicht viel über das Datenbankdesign finden kann.

In meinem Fall müssen diese Elemente (und möglicherweise einige andere, die ich vergessen habe) enthalten sein:

  • Klient
  • Plan (wie 'basic'/'premium'). Jeder Plan hat einen monatlichen Preis und eine Menge an Guthaben (zum Beispiel: Ein Basisplan bietet 30 Guthaben pro Monat und Prämienpläne unbegrenzte Guthaben).
  • Credits sind ein virtuelles Geld, das innerhalb der Anwendung ausgegeben wird.
  • Abonnement/Abbestellung
  • Zahlungen (Beachten Sie, dass der tatsächlich gezahlte Preis aufgrund von Rabatt usw. vom Basispreis des Plans abweichen kann.)
  • ...

Zusätzlich zum Datenbankentwurf können Auslöser vorhanden sein, die dies tun müssen (?).

Meine Schmerzpunkte:

  • Ich kann nicht allgemein erkennen, wie das globale Design davon ist
  • Welches sollte eine Zeile in der DB sein: der month_susbscrition (dh 1 Zeile pro Client pro Monat) oder das Abonnement selbst (dh 1 Zeile pro Client)?
  • Wie würden Sie mit der automatischen Verlängerung des Monatsabonnements umgehen?
  • Wie würden Sie mit dem Design von Zahlungen umgehen, wenn Sie Dienste wie Paypal zur Abwicklung automatischer monatlicher Zahlungen in Betracht ziehen möchten?

Hinweis

Ich lege meine Bedürfnisse freiwillig nicht im Detail offen, da die Debatte auf diese Weise generisch bleiben und für andere Menschen nützlicher sein kann.

Danke für die Hilfe.

39
David D.

Ich würde dieses Modell verwenden

Ihre Kunden

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

Ihre Pläne (Sie können neue Pläne definieren, wenn Sie möchten) ... Ich füge einen Price_per_year hinzu, wenn Sie einen Rabatt vorschlagen möchten, wenn der Kunde 12 Monate in einem Schuss kauft (dies ist jedoch nur eine Idee).

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

Ihre Abonnements

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

In Anbetracht dieses Modells würde ich 1 Zeile pro Kunde pro Plan verwenden.

Wenn ein Kunde ein Angebot wie "Premium mit 1. Monat gratis!" Abonniert, sieht Ihre Datenbank folgendermaßen aus:

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

Wenn ein Kunde den 1. Juli abbestellt, aktualisieren Sie das Spaltenende in Ihrer Abonnementtabelle nur mit dem Monat und dem Jahr (da Sie den Tag und die Uhrzeit voreingestellt haben).

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

Um herauszufinden, ob ein Client nicht abbestellt, können Sie Folgendes verwenden:

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

Stellen Sie sicher, dass Sie nicht gleichzeitig zwei Abonnements für einen Client haben können.

Dadurch können Sie das monatliche Abonnement in Ihrer App - automatisch abwickeln, nicht jedoch mit Ihrem Bank-/Paypal-Konto.

Einige Banken bieten Ihnen jedoch zwei Dienste an: - Einzigartige Lastschrift - periodische Belastung

Mit der zweiten können Sie das monatliche Abonnement abwickeln.

43
Chambeur

Ich würde ein relationales Tabellendesign und eine relationale Datenbank verwenden.

Ich hätte einen Client-Tisch.

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

Ich hätte eine Abonnementtabelle

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

Ich hätte eine Einkaufstabelle

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

Nun, um deine Fragen zu beantworten. Sie sollten jeweils nur eine Frage stellen.

Welches sollte eine Zeile in der DB sein: das month_subscription (dh 1 Zeile pro Client pro Monat) oder das Abonnement selbst (dh 1 Zeile pro Client)?

Eine Zeile pro Abonnement pro Monat.

Wie würden Sie mit der automatischen Verlängerung des Monatsabonnements umgehen?

Netflix belastet mein Paypal-Konto jeden Monat. Sie können dasselbe mit Paypal oder mit einer Kreditkarte tun. Wenn Sie Kreditkarten akzeptieren, müssen Sie eine Vereinbarung mit Ihrer Bank, einem Kreditkartenabwickler oder Paypal treffen.

Wie würden Sie mit dem Design von Zahlungen umgehen, wenn Sie Dienste wie Paypal zur Abwicklung automatischer monatlicher Zahlungen in Betracht ziehen möchten?

Netflix belastet mein Paypal-Konto jeden Monat. Sie könnten dasselbe tun.

8

Bei der akzeptierten Antwort würde ich eine weitere Tabelle hinzufügen, in der alle Änderungen oder Aktualisierungen eines Abonnements oder Plans als Referenz gespeichert werden. Auf diese Weise haben Sie eine klare Anmeldung, wann und welche Pläne für welchen Zeitraum ausgewählt wurden.

Ich würde sicherstellen, dass die Abonnementtabelle die Variablen enthält, aus denen hervorgeht, ob sie aktiv ist oder nicht, zu welchem ​​Datum sie bezahlt wird und welche anderen möglichen Daten Sie im täglichen Betrieb benötigen.

Die zusätzliche Tabelle stellt sicher, dass Sie jedes Abonnement bei Bedarf jederzeit neu erstellen können.

0
Kim Steinhaug