【问题标题】:Database Schema - User Subscriptions数据库架构 - 用户订阅
【发布时间】:2013-05-11 12:06:25
【问题描述】:

我的数据库中有一个订阅模型,可以为用户订阅某些月份的课程。分配的类型很少。用户可以:

  1. 使用信用卡购买课程 x 月订阅
  2. 通过输入一些激活密钥购买课程 x 月订阅
  3. 系统管理员将用户分配给 x 个月订阅。

如果用户续订他/她的订阅,我不会删除旧的,而是在订阅表中创建新记录并将旧记录保留为历史记录,如果管理员更新了相同的订阅,我也是再次创造新纪录。 用户当前的订阅由最后一条记录标识。用户课程的到期日期是显示在最新记录中的日期。 例如,如果您查看随附的屏幕截图。

用户 1 有三个订阅,其中一个说课程必须在 6 月 15 日到期,但实际到期日期是 6 月 14 日,因为这是此用户 - 课程组合的最新记录。

我保留所有这些记录(而不仅仅是更新现有的用户课程到期日期)的原因是我需要这些历史记录。如果出现问题,我总是能够恢复错误所在。

我想你已经明白了我的想法,我的问题是,如果这是一个好的解决方案,以及如何更好地实现想法。

感谢您的宝贵时间。

【问题讨论】:

  • “但是真正的过期日期是 6 月 16 日,因为这是此用户课程组合的最新记录。” 不,用户 1 的最新时间戳是 6 月 15 日. 存储真实数据。如果您有一个到期日期列,请将到期日期存储在该列中。不要在该列中存储“到期日期前一天”。
  • 很抱歉我的拼写错误,应该是 6 月 14 日而不是 16 日。在帖子中编辑

标签: sql database-schema


【解决方案1】:

这是我看到的选项。

  1. 每次订阅日期更改时添加新记录。好处是一张表可以处理订阅,与#2相比,对数据库的写入更少,但表中不需要的记录更多

  2. 添加一个维护更改历史记录的审计表以用于问责制,并编辑订阅表,而不是在每次发生更改时添加新记录。在这里,您有 2 次写入数据库,但您有一个更干净的订阅数据库和一个单独的表用于审计(何时/如果需要检查)

有人知道哪个更好或有其他建议吗?

【讨论】:

  • 在什么情况下订阅日期可能会改变?您是否正在考虑为不同的计划升级/降级?
【解决方案2】:

我对相关表没有太多经验,但我会添加一个 records 表,而不是将 subscription 表的 3 个字段复制到 records 中/从 records 中插入/选择(使用 INNER JOIN)。

注意:以它为例,而不是作为真正的应用程序架构。

CREATE TABLE `Subscriptions` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);

CREATE TABLE `courses` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);

CREATE TABLE `records` (
  `user_id` INT NOT NULL,
  `course_id` INT NOT NULL,
  `subscription_id` INT NOT NULL,
  `date_start` TIMESTAMP,
  `date_end` TIMESTAMP,
  PRIMARY KEY (`user_id`, `course_id`, `subscription_id`)
);

我是从头开始做的,不知道下一个是否/完成上面的。如果其他人可以改进此答案,请成为我的客人。

ALTER TABLE `records` ADD CONSTRAINT `records_user` FOREIGN KEY (`user_id`) REFERENCES users(`id`);
ALTER TABLE `records` ADD CONSTRAINT `records_course` FOREIGN KEY (`course_id`) REFERENCES courses(`id`);
ALTER TABLE `records` ADD CONSTRAINT `records_subscription` FOREIGN KEY (`subscription_id`) REFERENCES Subscriptions(`id`);

【讨论】:

  • 我很抱歉,但我想我从你的回答中误解了一些东西。我的订阅是:用户 - 课程 - 到期日期。当用户过期时,他/她需要用户 - 课程 - 过期日期的新记录。那么当它可能只有一张表时,做两张表“记录”和“订阅”有什么意义呢?
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2020-09-15
  • 2011-01-28
相关资源
最近更新 更多