我工作的公司对于帮助台系统有着非常特定和独特的需求,因此开源系统都不适用于我们。鉴于这种情况,我使用PHP和MySQL创建了一个自定义系统。它远非完美,但比他们之前使用的系统好得多;相信我!它能很好地满足我们的大部分需求,但我对数据库设置方式有一个问题。以下是主要表格:
ClosedTickets
ClosedTicketSolutions
Locations
OpenTickets
OpenTicketSolutions
Statuses
Technicians
当用户提交帮助请求时,它会进入“OpenTickets”表。技术人员解决问题时,他们会提交包含所做工作描述的条目。这些条目会进入“OpenTicketSolutions”表。当问题得到解决时,最后一个处理该问题的技术人员关闭工单,并将其移动到“ClosedTickets”表中。所有解决方案条目也会被移动到“ClosedTicketSolutions”表中。其他表(位置、状态和技术人员)存在于规范化的意义上(每个位置、状态和技术人员都有一个ID供参考)。
我现在遇到的问题是:
当我想查看所有打开的工单列表时,SQL语句有些复杂,因为我必须左连接“Locations”、“Statuses”和“Technicians”表。各种表中的字段也需要可搜索。请看一下如何在已关闭的工单中搜索由名字包含“John”的任何人提交的工单时,SQL语句是多么复杂:
SELECT ClosedTickets.*, date_format(ClosedTickets.EntryDate, '%c/%e/%y %l:%i %p') AS Formatted_Date, date_format(ClosedDate, '%c/%e/%y %l:%i %p') AS Formatted_ClosedDate, Concat(Technicians.LastName, ', ', Technicians.FirstName) AS TechFullName, Locations.LocationName, date_format(ClosedTicketSolutions.EntryDate, '%c/%e/%y') AS Formatted_Solution_EntryDate, ClosedTicketSolutions.HoursSpent AS SolutionHoursSpent, ClosedTicketSolutions.Tech_ID AS SolutionTech_ID, ClosedTicketSolutions.EntryText
FROM ClosedTickets
LEFT JOIN Technicians ON ClosedTickets.Tech_ID = Technicians.Tech_ID
LEFT JOIN Locations ON ClosedTickets.Location_ID = Locations.Location_ID
LEFT JOIN ClosedTicketSolutions ON ClosedTickets.TicketNum = ClosedTicketSolutions.TicketNum
WHERE (ClosedTickets.FirstName LIKE '%John%')
ORDER BY ClosedDate Desc, ClosedTicketSolutions.EntryDate, ClosedTicketSolutions.Entry_ID
目前我无法同时搜索打开和关闭的工单,我认为使用 UNION 运算符也不适用于我的情况。所以我想知道是否应该将打开和关闭的工单存储在同一张表中,并只有一个字段来指示工单是否已关闭。唯一可以预见的问题是我们已经有太多已关闭的工单(近30,000),所以整个系统可能会变得缓慢。将打开和关闭的工单合并是否是个坏主意?