лучшая схема для базы данных - PullRequest
0 голосов
/ 08 июля 2011

У меня есть приложение, в котором пользователь может заблокировать определенный товар, и как только он его заблокирует, он должен забрать его через 2 часа .Если он не заберет его через 2 часа, то этот предмет разблокируется, и пользователь теряет 1 шанс блокировки.у пользователя изначально есть 3 шанса блокировки, и , если он проигрывает все 3 за 2 месяца, то он забанен на 2 месяца .сейчас я подготовил схему для этого, но чувствую, что она не оптимальна.схема выглядит следующим образом:

user table
--locking_chances_left              //initially 3
--first_chance_miss_date            //date on which the user loses its first locking chance
--second_chance_miss_date           //date on which the user loses its second locking chance
--banned                            // boolean field to indicate whether the user is banned

locked_items table
--item_no
--user_id
--locking_time

banned_users table
--user_id
--ban_date                          //date on which the user is banned i.e lost the last chance

теперь у меня есть событие, которое планируется запускать каждую минуту, чтобы увидеть, был ли какой-либо элемент в таблице locked_items заблокирован более 2 часов, и если он найдет тоон удаляет его из этой таблицы, который разблокирует элемент, а затем уменьшает locking_chances_left на 1 из таблицы users.теперь я должен отслеживать, теряет ли пользователь все свои шансы в течение 2 месяцев, чтобы забанить его.поэтому я сохранил first_chance_miss_date, чтобы сохранить дату, когда его шансы уменьшатся с 3 до 2, и second_chance_miss_date, чтобы сохранить дату, когда его шансы уменьшатся с 2 до 1. У меня есть таблица after update trigger на users, которая проверяет, когдазначение locking_chances_left изменяется и обновляет first_chance_miss_date и second_chance_miss_date соответственно.Есть ли лучший способ без использования этих 2 полей для miss dates и только с использованием одного поля.спасибо за то, что вы поняли

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Я не думаю, что это лучшее решение, но я добавлю его:

Вы можете иметь таблицу lock_events, а не locked_items. Каждый раз, когда элемент блокируется, он попадает в таблицу событий. Если предмет был поднят, вы можете либо удалить его, либо добавить дополнительное событие, сообщающее, что он был поднят. Если вы выберете предметы старше 2 часов, вы получите список просроченных заблокированных предметов.

Таким образом, у вас есть история всех событий в системе. Это просто рассчитать chances_left, а также просто посмотреть, не сжег ли пользователь все свои шансы за 2 месяца. В итоге вы выполняете больше циклов ЦП, но вы также получаете хороший отчет обо всех транзакциях на вашем сайте!

2 голосов
/ 08 июля 2011

Я бы, вероятно, сделал это с таблицей user_missed_date с user_id и missed_date в качестве полей, которые затем можно

select user_id, count(*) as misses from user_missed_date where date>[last two months] group by user_id

Или использовать в качестве основы для подзапроса.1006 *

Возможно, вы захотите индексы для user_id, missed_date и missed_date, user_id

...