tool lucidchart generate database database-design database-schema

generate - lucidchart database diagram



Buenas prácticas para diseñar un sistema de suscripción mensual en la base de datos (4)

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

En mi caso, estos elementos (y tal vez otros que olvidé) deben incluirse:

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

Además del diseño de la base de datos, podría haber desencadenantes que deben establecerse para hacer esto (?).

Mis puntos dolorosos:

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

Nota

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

Gracias por la ayuda.


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

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

La tabla adicional se asegurará de que pueda recrear cualquier suscripción en cualquier momento dado si es necesario.


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

Tendría una mesa de Cliente.

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

Tendría una mesa de Suscripción

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

Tendría una mesa de compras

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

Ahora para responder tus preguntas. Debe hacer solo una pregunta a la vez.

¿Cuál debería ser una fila en el DB: la suscripción al mes (es decir, 1 fila por cliente por mes) o la suscripción misma (es decir, 1 fila por cliente)?

Una fila por suscripción por mes.

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

Netflix simplemente carga mi cuenta de PayPal todos los meses. Podría hacer lo mismo con PayPal o con una tarjeta de crédito. Si acepta tarjetas de crédito, tendrá que llegar a un acuerdo con su banco, un procesador de tarjeta de crédito o PayPal.

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

Netflix simplemente carga mi cuenta de PayPal todos los meses. Tu podrías hacer lo mismo.


Yo usaría este modelo

Tus clientes

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

Tus planes (puedes definir nuevos planes cuando quieras). Agrego un Price_per_year si desea proponer un descuento si el cliente compra 12 meses en una sola toma (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, utilizaría 1 fila por cliente por plan.

Cuando un cliente se suscribe a una oferta como "¡Premium con el primer 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 cancela 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 cuenta bancaria / paypal.

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

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


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