我的数据库中有一个订阅模型,用户可以在几个月内订阅用户。任务类型很少。用户可以:
如果用户续订他/她的订阅我没有删除旧订阅,我在订阅表中创建一条新记录并将旧记录保留为历史记录,如果管理员更新了相同的订阅我也是再次创造新纪录。 用户的当前订阅由最后一条记录标识。用户到达课程的到期日期是最新记录中显示的日期。 例如,如果您查看附加的屏幕截图。
用户1有三个订阅,其中一个说该课程必须在6月15日到期,但真正的到期日期是6月14日,因为这是该用户的最新记录 - 课程组合。
我保留所有这些记录(而不只是更新现有的用户课程到期日期)的原因是我需要这段历史记录。如果出现问题,我总能在错误发生的地方恢复过来。
我认为你已经有了我的想法,我的问题是,如果这是一个很好的解决方案,以及如何更好的实施想法。
感谢您的时间。
答案 0 :(得分:0)
我没有太多关于相关表的经验,但是我添加了一个records
表,而不是复制subscription
表的3个字段来插入/选择(使用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`);
答案 1 :(得分:0)
以下是我看到的选项。
每次订阅日期更改时添加新记录。好处是一个表来处理订阅而不是写入数据库而不是#2,但是表中没有必要的更多记录
添加一个审计表,该表维护更改历史记录以用于问责制目的,并编辑订阅表,而不是每次发生更改时添加新记录。在这里你有2次写入数据库,但你有一个更清洁的订阅数据库和一个单独的审计表(当/如果需要检查)
任何人都知道哪个更好或有任何其他建议?