整个下午。
我最近的任务是开发基于事件的支持票证系统,但我遇到了很多问题,我认为问题在于数据库结构。
目前它看起来有点像这样:
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 字段将使用新阶段进行更新。
问题在于这违反了数据库规范化规则,因为票证的当前阶段由票证.stage_id 和票证事件表中的最新记录定义。在我试图写一份报告显示任何时间点的未处理票证数量时,我发现了为什么会这样。似乎很难获得任何类型的 SQL 来快速从事件表中检索当前阶段。
我设法在这个非常有用的页面 (http://kristiannielsen.livejournal.com/6745.html) 上使用选项 2 构建了一个相当快速的查询,但是我遇到了一个让我陷入困境的问题。
对于当前数据,event_id 并不总是以相对于日期的升序运行。此外,由于某些自动处理脚本,一张票很可能有两个日期完全相同的事件。这意味着任何尝试使用事件表的查询都需要“按日期排序,event_id”,这对于子查询和分组几乎是不可能的。
任何人都可以就我如何克服这些问题提供任何建议吗?有没有更好的方法来定义事件的顺序?
非常感谢。西蒙