Buenas prácticas para diseñar el sistema de suscripción mensual en la base de datos [cerrado]


Me gustaría saber cómo diseñar un sistema de software de suscripción mensual en una base de datos. Estos sistemas se utilizan ampliamente en todo Internet, aunque no puedo encontrar muchas cosas sobre el diseño de bases de datos.

En mi caso, estos elementos (y tal vez algunos otros que olvidé) tienen que ser incluidos:

  • Cliente
  • Plan (como 'basic' / 'premium'). Cada plan tiene un precio mensual y una cantidad de créditos (por ejemplo: el plan básico ofrece 30 créditos al mes y los planes premium ilimitados crédito).
  • Los créditos son un dinero virtual que se gasta dentro de la aplicación.
  • Suscripción / Desuscripción
  • Pagos (Tenga en cuenta que el precio realmente pagado podría ser diferente del precio base del plan debido al descuento, etc.)
  • ... ?

Además del diseño de la base de datos, podría haber disparadores que necesitan ser configurados para hacer esto (?).

Mis puntos débiles:

  • No puedo ver de manera general cuál es el diseño global de esto
  • ¿Cuál debe ser una fila en la base de datos: el month_susbscrition (es decir, 1 fila por cliente por mes) o la suscripción en sí (es decir, 1 fila por cliente)?
  • ¿Cómo manejaría la renovación automática de la suscripción mensual?
  • ¿Cómo manejaría el diseño de pagos si prevé usar servicios como Paypal para manejar pagos mensuales automáticos?

Nota

Voluntariamente no expongo mis necesidades en detalles porque de esa manera, el debate puede siga siendo genérico y puede ser más útil para otras personas.

Gracias por la ayuda.

Author: David D., 2014-05-07

4 answers

Usaría este modelo

Sus clientes

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

Sus planes (puede definir nuevos planes cuando lo desee). Añado un Price_per_year si quieres proponer un descuento si el cliente compra 12 meses de una sola vez (pero es solo una idea).

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

Sus suscripciones

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

Considerando este modelo usaría 1 fila por cliente por plan.

Cuando un cliente se suscribe a una oferta como "Premium con 1er mes gratis !", su base de datos se vería así :

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

Cuando un cliente cancele la suscripción el 1 de julio, actualice el final de la columna en su tabla de suscripción con el mes y el año solamente (porque ha preestablecido el día y la hora).

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

Para saber si un cliente no se da de baja, puede usar esto:

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

Asegúrese de que no puede tener 2 suscripciones para un cliente al mismo tiempo.

Esto le permite manejar automáticamente la suscripción mensual en su aplicación, pero no con su banco/paypal cuenta.

Pero algunos bancos te ofrecen dos servicios: - Débito único - Débito periódico

El segundo le permitiría manejar la suscripción mensual.

 36
Author: Chambeur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-07 08:48:47

Usaría un diseño de tabla relacional y una base de datos relacional.

Tendría una tabla de clientes.

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

Tendría una tabla de suscripciones

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

Tendría una tabla de Compras

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

Ahora para responder a sus preguntas. Usted debe hacer sólo una pregunta a la vez.

¿Cuál debe ser una fila en la base de datos: el month_subscription (es decir, 1 fila por cliente por mes) o la suscripción en sí (es decir, 1 fila por cliente)?

Una fila por suscripción por mes.

¿Cómo manejaría la renovación automática de la suscripción mensual?

Netflix solo debita mi cuenta de PayPal cada mes. Usted podría hacer lo mismo con PayPal o con una tarjeta de crédito. Si acepta tarjetas de crédito, tendrá que hacer un acuerdo con su banco, un procesador de tarjetas de crédito o PayPal.

¿Cómo manejaría el diseño de pagos si prevé usar servicios como PayPal para manejar automáticamente mensualmente los pagos?

Netflix solo debita mi cuenta de PayPal cada mes. Podrías hacer lo mismo.

 7
Author: Gilbert Le Blanc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-07 02:30:41

Puedes encontrar un montón de diseños de db en este sitio: www.databaseanswers.org/data_models

 2
Author: Alejandro Haro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 14:03:52

Mirando la respuesta aceptada, agregaría otra tabla donde todos los cambios o actualizaciones de una suscripción o plan se almacenarían para referencia posterior. De esta manera, tiene un registro claro sobre cuándo y qué planes se seleccionaron para qué período.

Me aseguraría de que la tabla de suscripción contuviera las variables que le indican si está activa o no, y en qué fecha se paga y cualquier otro dato posible que requiera en las operaciones diarias.

La tabla extra asegúrese de poder recrear cualquier suscripción en cualquier momento dado si es necesario.

 0
Author: Kim Steinhaug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 18:47:21