MySQL 基于事件的支持票证系统

Posted

技术标签:

【中文标题】MySQL 基于事件的支持票证系统【英文标题】:MySQL event-based support ticket system 【发布时间】:2011-10-07 19:27:11 【问题描述】:

下午。

我最近的任务是开发基于事件的支持票证系统,但我遇到了很多问题,我认为问题在于数据库结构。

目前看起来有点像这样:

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 并不总是以相对于日期的升序运行。此外,由于某些自动处理脚本,一张票很可能有两个日期完全相同的事件。这意味着任何尝试使用 events 表的查询都需要“按日期排序,event_id”,这对于子查询和分组几乎是不可能的。

任何人都可以就我如何克服这些问题提供任何建议吗?有没有更好的方法来定义事件的顺序?

非常感谢。 西蒙

【问题讨论】:

编辑:我特别想关注如何有效地检索特定时间点的票证阶段。使用不同数据库结构的示例解决方案也将受到赞赏。 【参考方案1】:

我会将tickets.stage_id 替换为ticket_events 表(last_event)的FK,并且每当插入新事件时,触发器都会将tickets.last_event 字段更新为事件的PK。这允许轻松/快速加入以从事件表中找到当前阶段。

【讨论】:

【参考方案2】:

规范化规则是指导方针。它们适用于许多情况,但不是全部。 “违反”规则并不是一件坏事,而在任何情况下都一味地遵守规则绝对是一件坏事。

将它们视为与道路规则相同 - 始终遵守速度限制,保持在路边等...但是始终遵守这些规则会使迎面而来的错误方向变成煎饼醉酒的司机将他的车与你的车进行了物理合并,而你本可以转入另一条车道。

【讨论】:

【参考方案3】:

另一种方法是在门票表上放置一个“下一个活动 ID”。当你创建事件时,你使用它,然后更新它。然后,您可以设置自己的独立订单。或者,您可以有一个“优先级”字段,它可以作为日期/时间相同时的辅助顺序。

听起来您需要多考虑一下您的确切要求。

【讨论】:

以上是关于MySQL 基于事件的支持票证系统的主要内容,如果未能解决你的问题,请参考以下文章

事件和票证上的 Rails 关联逻辑

基于事件驱动的YARN并发模型

基于PHP+Mysql的在线考试系统

MySQL 主从复制

基于java+mysql+jsp+ssm农村留守儿童社会支持信息系统

[MySQL] 主从复制原理