2017-02-23 24 views
1

Я разработал схему базы данных для продукта подписки. пользователь может выбрать подписку, начиная с даты на определенное количество дней. Пользователь может отменить подписку в течение нескольких дней, сохраняя при этом подписку активным. означает, что если пользователь подписывается на месяц, она может отменить его в дни, скажем, 10,15 и 20, заплатив всего 27 дней (30 минус 3).
До сих пор я придумал эту схему. enter image description hereНужен лучший подход к разработке базы данных

  • каждый пользователь имеет один профиль.
  • пользователь может выбрать план.
  • Как только пользователь выбирает план, он считается транзакцией, которая также хранит информацию о дате начала и продолжительности этого плана.
  • каждая сделка имеет платеж (фокусировка на той части позже)

Теперь, так как пользователь может отменить подписку в любой день, как я должен следить за различными пользователями и дней, на которые они имели подписку?

Решение, которое я имею в виду, представляет собой новую таблицу Plan_Transaction_user, которая будет отслеживать каждую дату и идентификатор транзакции для этой даты. Таким образом, если пользователь отменит подписку на определенную дату, для этой идентификационной записи транзакции не будет записи этой даты.

таблица будет выглядеть следующим образом:

Date  Transaction ID  
1-1-2017 1 
1-1-2017 2 
1-1-2017 3 
1-2-2017 1 
1-2-2017 3 

Поскольку связанный с TRANSACTION_ID 2 прервана пользователем за день 2 ее записи транзакции нет в этой таблице.

Теперь, если у меня есть клиентская база из 5000, то в лучшем случае в течение одного года у меня будет 5000 * 365 ~ 1,8 м строк. Я уверен, что это не лучший подход. Не могли бы вы предложить мне лучшую схему или некоторые изменения в существующей схеме, которые могут быть более эффективными? На всякий случай, если вы хотите знать, что я буду использовать MariaDB (AWS RDS) в качестве базы данных, а Python 2 - как язык.

Спасибо, Оджаса

+2

Отслеживание отдельных дат выглядит действительно сломанной. Вы действительно хотите захватить ограниченные диапазоны, такие как даты начала и окончания. – tadman

+0

если я только отслеживаю начало и конец, как бы я запросил «в определенный день, сколько подписчиков было там?» @tadman –

+2

Вы можете использовать оператор 'BETWEEN' для тестирования. – tadman

ответ

4

Вы можете добавить датой_окончания поля в таблице транзакций вместо продолжительности. Вы можете легко определить end_date как start_date + сколько дней вы дадите для выбранного плана. Когда пользователь отменяет несколько дней, вы можете уменьшить end_date как end_date = end_date - количество дней отмены. Вы можете проверить, сколько действительных подписчиков в настоящее время в любой день, проверяя через end_date> = сегодня.

0

Как и ваш проект Plan_Transaction_user, если вам нужно знать, сколько подписчиков для какой-либо конкретной даты, но не тот, кто они есть, вы можете агрегировать таблицу за день. Как

Date  user_count  
1-1-2017 1 
1-2-2017 2 
Смежные вопросы