Днем все.
Недавно мне было поручено работать с системой заявок на поддержку событий, но я столкнулся с множеством проблем и считаю, что проблема заключается в структуре базы данных.
На данный момент это выглядит примерно так:
create table tickets (
ticket_id int not null primary key auto_increment,
stage_id int not null default 0,
name varchar(255) not null default ''
/* etc... */
);
create table ticket_events (
event_id int not null primary key auto_increment,
ticket_id int not null,
date datetime,
stage_id
);
create table stages (
stage_id int not null primary key auto_increment,
name varchar(255)
);
Таким образом, всякий раз, когда билет меняет этап, в таблицу ticket_events добавляется новая строка, указывающая, на какой этап он был перемещен и когда, а поле stage_id в таблице заявок обновляется с новым этапом.
Проблема заключается в том, что это нарушает правила нормализации базы данных, поскольку текущий билет имеет текущий этап, определяемый и tickets.stage_id, и самой последней записью в таблице ticket_events. В моей попытке написать отчет, показывающий количество неоплаченных билетов в любой момент времени, я обнаружил, почему это так. Кажется, что очень сложно получить какой-либо SQL для быстрого извлечения текущего этапа из таблицы событий.
Мне удалось построить достаточно быстрый запрос, используя вариант 2 на этой очень полезной странице (http://kristiannielsen.livejournal.com/6745.html),, но я столкнулся с проблемой, которая застряла у меня.
С текущими данными event_id не всегда выполняется в порядке возрастания относительно даты. Кроме того, из-за определенных сценариев автоматической обработки вполне возможно, что в одном билете есть два события с точно одинаковыми датами. Это означает, что любой запрос, пытающийся использовать таблицу событий, должен «упорядочивать по дате, event_id», что практически невозможно сделать с подзапросами и группировкой.
Может кто-нибудь дать какой-нибудь совет, как мне решить эти проблемы? Есть ли лучший способ определения порядка событий?
Большое спасибо.
Simon