Система заявок поддержки событий на основе событий MySQL - PullRequest
0 голосов
/ 18 июля 2011

Днем все.

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

На данный момент это выглядит примерно так:

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

Ответы [ 3 ]

0 голосов
/ 18 июля 2011

Другим способом сделать это было бы иметь «идентификатор следующего события» в таблице заявок. Когда вы создаете событие, вы его используете, а затем обновляете. Затем вы можете установить свой собственный независимый порядок. В качестве альтернативы, у вас может быть поле «приоритет», которое будет действовать как вторичный ордер на случай, когда дата / время совпадают.

Похоже, вам нужно немного больше подумать о своих точных требованиях.

0 голосов
/ 18 июля 2011

Я бы заменил tickets.stage_id на FK для таблицы ticket_events (last_event), и всякий раз, когда вставляется новое событие, триггер обновляет поле tickets.last_event до PK события. Это позволяет легко / быстро соединиться, чтобы найти текущий этап из таблицы событий.

0 голосов
/ 18 июля 2011

Правила нормализации являются ориентировочными.Они применяются во многих ситуациях, но не во всех.«нарушать» правила автоматически не является плохой вещью, в то время как рабское следование им во всех ситуациях, безусловно, плохо.

Думайте о них так же, как о правилах дорожного движения - всегда соблюдайте ограничение скорости,оставайтесь на вашей стороне дороги и т. д. Но всегда следуя этим правилам, вы превратитесь в блин, когда этот встречный пьяный водитель-физически сливает свою машину с вашей, когда вы могли просто свернуть на другую полосу движения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...