2013-05-11 5 views
3

У меня есть модель подписки в моей базе данных, которая подписывает пользователей на курсы в течение определенных месяцев. Существует несколько типов присвоений. Пользователь может:Схема базы данных - Подписки пользователей

  1. Покупка курс х месяцев подписки с кредитной картой
  2. Покупка курса х месяцев подписки путем ввода ключа активации некоторых
  3. Системный администратор назначить пользователю месяц подписки х.

Если пользователь обновляет свою подписку, я не удаляю старую, я создаю новую запись в таблице подписки и сохраняю старую как историю, также если одна и та же подписка обновляется администратором Я снова создаю новую запись. Текущая подписка пользователя идентифицируется последней записью. Конечная дата для курса пользователя - это дата, которая отображается в последней записи. Например, если вы отметите прикрепленный снимок экрана.

enter image description here

Пользователь 1 имеет три подписки и один из них говорит, что курс должен быть истек 15 июня, однако реальная дата истечения срока действия 14 июня, потому что это последняя запись для этого пользователя - сочетания курса.

Причина, по которой я сохраняю все эти записи (а не только обновление существующей даты истечения срока действия пользователя), заключается в том, что мне нужна эта история. Если что-то пойдет не так, я всегда смогу восстановить место, где была ошибка.

Я думаю, у вас есть моя идея, мой вопрос, если это хорошее решение и как может выглядеть идея реализации.

Спасибо за ваше время.

+0

* «однако реальная дата истечения срока действия - 16 июня, потому что это последняя запись для этой комбинации пользовательского курса». * Нет, последняя отметка времени для пользователя 1 - 15 июня. Храните реальные данные. Если у вас есть столбец для дат истечения срока действия, сохраните даты истечения срока действия в этом столбце. Не храните «день до истечения срока действия» в этой колонке. –

+0

Мне очень жаль, что моя ошибка в типографии, она должна сказать, 14 июня, а не 16. Отредактировано в сообщении –

ответ

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`); 
+0

Извините, но я думаю, что я неправильно понял что-то из вашего ответа. Моя подписка: Пользователь - Course - Дата истечения срока. Когда пользователь истек, ему/ей нужна новая запись . Пользователь - курс - срок действия. Итак, в чем смысл делать две таблицы «записей» и «подписки», когда это может быть только одна таблица? –

0

Вот варианты, которые я вижу.

  1. добавить новые записи при каждом изменении даты подписки. Преимущество - это одна таблица для обработки подписки и меньше записей в БД, а не в # 2, но в таблице не требуется больше записей, которые необязательны в таблице

  2. Добавить таблицу аудита, в которой хранится история изменений для целей отчетности и редактировать таблицу подписки, а не добавлять новые записи каждый раз, когда есть изменения.Здесь у вас есть 2 записи в БД, но у вас есть более чистая подписка DB и отдельная таблица для аудита (когда/если необходимо инспектировать)

Каждых знают, что лучше или какие-либо другие предложения?

+0

В каких случаях даты подписки могут измениться? вы рассматриваете обновления/понижения для разных планов? – JCarlos

Смежные вопросы