【问题标题】:Database design: How do I keep track of prepaid lessons aswell as paid after lessons?数据库设计:如何跟踪预付费课程以及课后付费?
【发布时间】:2021-09-25 20:18:29
【问题描述】:

(抱歉标题不好)

一名学生参加课程。学生可以预付 x 节课的费用,即学生可以购买五节课的套餐。我的第一个问题是,我如何跟踪所有这些课程何时“用完”?

学生也可以预订课程。当学生预订课程时,学生将在月底收到账单。我如何跟踪课程是否已付费?

我当前的解决方案如下所示:

它的工作原理是使用带有“paid_on”列的课程实体来跟踪课程的付费时间,这解决了我的第二个要求(学生可以预订课程)。但是,我如何跟踪预付费课程?我能想出的唯一解决方案是在学生实体中添加一个“number_of_prepaid_lessons”,它是一个固定数字,或者随着使用他们的 student_id 创建的每节课而减少。这感觉不是最佳解决方案,因为当学生取消课程时需要大量逻辑(我不希望从他们的预付费中删除该课程)。

【问题讨论】:

  • mysqlpostgresql 这就是问题.....但是您真正使用的是哪一个?使用edit 删除您不使用的那个。
  • "number_of_prepaid_lessons" in the student entity that's either a fixed number, or ... 不要使用固定数字,因为您将如何处理额外的预付款?以及如何跟踪number_of_prepaid_lessons 的消耗部分。只需减少每节课的费用(payed_on 填充一个值),如果学生取消课程,则将number_of_prepaid_lessons 增加 1。
  • 如果您更新number_of_prepaid_lessonspaid_on,您应该在一个transaction 中执行此操作,以确保两个字段都得到更新,或者没有字段得到更新。
  • 当然,这只会导致负数,如果您在减去 1 之前不检查 number_of_prepaid_lessons 是否大于 1。
  • 学生能否参加 (a) 预付费 XOR 后付费课程,(b) 预付费和/或后付费课程?

标签: sql postgresql database-design


【解决方案1】:

您可以在lessons 表中使用名为enrollment_status 的列,并根据bookedcancelledongoing/paid 管理课程。您将决定哪些statuses 想要计入,哪些不计入。

您还可以带上另一个名为 package 的表并将 package_id 保留在 lessons 表中,以跟踪哪些课程包含在某个包中。 package 表可能包含 idpackage_namelesson_countpackage_amountvalid_fromvalid_to 等列。

对于lessons 具有有效enrollment_status 的特定包,您可以通过加入package_id 上的package 表从lessons 表中计算特定studentlessons 计数.此搜索还可能包括搜索条件中的给定日期范围,这些日期范围在包的 between valid_from and valid_to 日期中。

您还可以仅查看特定学生所学课程的enrollment_status 来跟踪预订的课程。

【讨论】:

  • 感谢您的回答。我有个问题。这是否意味着对于没有预付费课的学生,外键列 package_id 将为空?
  • 没错,lessons 没有被任何package 占用,在对应的package_id 列中将有null
  • 我将如何向学生添加包?这可能吗,因为我们将 package_id 引用存储在课程实体而不是学生实体中?
  • 好吧,我没有在回答中提到这一点,因为我认为student-package 关系已经保留(因为这是在将package 表带入场景后不久必须这样做)和您的lesson 实体将引用 studentpackage
  • @hampani,如果它回答了您的问题,请考虑accepting它。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多