5

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

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

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

在此处输入图像描述

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

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

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

谢谢你的时间。

4

2 回答 2

1

这是我看到的选项。

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

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

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

于 2013-05-13T02:16:46.713 回答
0

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

注意:以它为例,而不是真正的应用程序模式。

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`);
于 2013-05-11T13:13:39.517 回答