数据库架构 - 用户订阅

时间:2013-05-11 12:06:25

标签: sql database-schema

我的数据库中有一个订阅模型,用户可以在几个月内订阅用户。任务类型很少。用户可以:

  1. 使用信用卡购买课程x个月订阅
  2. 输入一些激活密钥
  3. 购买课程x个月订阅
  4. 系统管理员将用户分配给x月订阅。
  5. 如果用户续订他/她的订阅我没有删除旧订阅,我在订阅表中创建一条新记录并将旧记录保留为历史记录,如果管理员更新了相同的订阅我也是再次创造新纪录。 用户的当前订阅由最后一条记录标识。用户到达课程的到期日期是最新记录中显示的日期。 例如,如果您查看附加的屏幕截图。

    enter image description here

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

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

    我认为你已经有了我的想法,我的问题是,如果这是一个很好的解决方案,以及如何更好的实施想法。

    感谢您的时间。

2 个答案:

答案 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)

以下是我看到的选项。

  1. 每次订阅日期更改时添加新记录。好处是一个表来处理订阅而不是写入数据库而不是#2,但是表中没有必要的更多记录

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

  3. 任何人都知道哪个更好或有任何其他建议?