2017-02-23 93 views
1

我已经设计了订阅产品的数据库模式。用户可以选择从某个日期开始的订阅一段时间。用户可以在几天内取消订阅,同时仍然保持订阅处于活动状态。这意味着如果用户订阅一个月,她可以在几天内取消它,例如10,15和20,因此仅支付27天(30减3)。
到目前为止,我已经想出了这个模式。 enter image description here需要更好的数据库设计方法

  • 每个用户有一个配置文件。
  • 用户可以选择一个计划。
  • 一旦用户选择一个计划,它被记录为交易,也存储关于该计划的开始日期和持续时间的信息。
  • 每笔交易都有支付(聚焦在这部分后来)

现在,因为用户可以取消订阅任何一天,我要如何跟踪不同的用户和天他们必须认购?

我想到的解决方案是创建一个新表Plan_Transaction_user,它将跟踪该日期的每个日期和事务ID。这种方式如果用户在特定日期取消订阅,那么该交易ID将没有该日期的记录。

表看起来就像这样:

Date  Transaction ID  
1-1-2017 1 
1-1-2017 2 
1-1-2017 3 
1-2-2017 1 
1-2-2017 3 

由于与TRANSACTION_ID 2相关的用户取消了2天她的交易记录中不存在此表。

现在如果我有客户群说5000,那么在一年内最好的情况下,我将有5000 * 365〜1.8米的行。我相信这不是最好的办法。你能否建议我更好的模式或者可以更有效的现有模式的一些变化?以防万一您想知道我将使用MariaDB(AWS RDS)作为数据库,Python 2作为我的语言。

谢谢 Ojas

+2

跟踪个别日期似乎真的打破了这里。你可以想要捕捉有界的范围,比如'start'和'end'日期。 – tadman

+0

如果我只跟踪开始和结束,我将如何查询“特定日期有多少订阅者?” @tadman –

+2

您可以使用'BETWEEN'运算符来测试。 – tadman

回答

4

可以在交易表,而不是持续增加END_DATE场。您可以轻松地将end_date定义为start_date +您将为选定计划提供多少天。当用户取消某些日子时,您可以将end_date减少为end_date = end_date - 取消日数。您可以通过end_date> = today检查当前有多少有效订阅。

0

与您的Plan_Transaction_user设计类似,如果您只需要知道某个特定日期有多少订阅者,但不知道他们是谁,那么您可以每天汇总表格。像

Date  user_count  
1-1-2017 1 
1-2-2017 2