Database design 服务台数据库设计

Database design 服务台数据库设计,database-design,Database Design,我所在的公司对帮助台系统有着非常特殊的需求,因此没有一个开源系统适合我们。在这种情况下,我使用PHP和MySQL创建了一个自定义系统。这远不是完美的,但它比他们上次使用的系统要好得多;相信我!它很好地满足了我们的大多数需求,但我对数据库的设置方式有一个疑问。以下是主要表格: ClosedTickets ClosedTicketSolutions Locations OpenTickets OpenTicketSolutions Statuses Technicians 当用户提交帮助请求时,它

我所在的公司对帮助台系统有着非常特殊的需求,因此没有一个开源系统适合我们。在这种情况下,我使用PHP和MySQL创建了一个自定义系统。这远不是完美的,但它比他们上次使用的系统要好得多;相信我!它很好地满足了我们的大多数需求,但我对数据库的设置方式有一个疑问。以下是主要表格:

ClosedTickets
ClosedTicketSolutions
Locations
OpenTickets
OpenTicketSolutions
Statuses
Technicians
当用户提交帮助请求时,它进入“OpenTickets”表。当技术人员处理问题时,他们提交条目,并描述他们所做的工作。这些条目位于“OpenTicketSolutions”表中。问题解决后,最后一位处理问题的技术人员关闭记录单,并将其移至“ClosedTickets”表。所有解决方案条目也会移动到“ClosedTicketSolutions”表中。其他表格(位置、状态和技术人员)作为规范化手段存在(每个位置、状态和技术人员都有一个被引用的ID)

我现在遇到的问题是:

当我想查看所有打开票据的列表时,SQL语句有点复杂,因为我必须左键连接“位置”、“状态”和“技术人员”表。不同表中的字段也需要可搜索。查看SQL语句在搜索已关闭的票证以查找名字包含“John”的任何人提交的票证时有多复杂:




我现在不能做的一件事是同时搜索打开和关闭的票。我认为在我的情况下,工会是行不通的。所以我想知道我是否应该将打开和关闭的票据存储在同一个表中,并且只需要有一个字段来指示票据是否关闭。我能预见的唯一问题是,我们已经有这么多已关闭的票据(近30000张),因此整个系统可能运行缓慢。把打开的和关闭的票合并是个坏主意吗?

我会把它们存储在同一张表中。只有在有大量票证的情况下,才将它们划分为两个表作为优化。但我怀疑这会是个问题

在这个宏伟的计划中,30000英镑真的很小。数据库的构建可以处理数百万行而不费吹灰之力。只要有适当的索引(所有连接列和潜在搜索列)

接下来,如果您开始体验减速,请开始将旧票证归档到归档表中


总的来说,一张表的设计更简洁,并将类似的数据保存在一起。

为什么有4张表用于票据?我会将一个表关联为票证,另一个表关联为票证解决方案。

我认为最好将打开和关闭的票证存储在一个表中。您可以创建一个状态字段,其值为0表示已关闭,1表示已打开,或者您希望使用的任何约定。正如另一位回答者所提到的,30k记录应该不是问题


希望这能有所帮助。

为什么工会在你的情况下不起作用?有什么具体和独特的要求?我发现很难相信你不能让OSS的众多解决方案中的任何一个为你工作。@Anonymouse:我对MySQL不是非常熟悉,但我相信联合要求表是相同的,而在本例中它们不是相同的@克里斯·卡明斯基:我们是一个学区。我们有全职员工和学生。我们需要能够根据学生的作业给他们打分。此外,为了激励学生,我们需要某种成就系统,有点像RPG。相信我,这对他们很有效!我绝对同意票应该放在一张桌子上——30000张很小。我也不确定是否需要外部连接。票证编号和位置不应该是不可为空的字段吗?谢谢你,vfilby!如果我需要将票据归档到另一个表中,我会使用联合同时搜索这两个表吗?老实说,我会尽量避免使用具有相同架构和数据的两个表,但您可以使用联合来搜索它们。如果工会真的很慢,试试“全体工会”。默认情况下,Union使用一个不同的Union,而Union all则不使用,而且速度更快。根据技术的不同,您还有其他选择。我相信在SQLServer中,您实际上可以控制表分区(它的存储方式)以提高效率。这是DBA的地盘,据我所知,这里有两个表用于记录单,两个表用于记录单的解决方案条目。通过这种方式,多个技术人员可以参与输入解决方案信息。然后只需添加另一个包含解决方案信息的表,即ticketid、technicianid,这就是您的多关系表。以及一个闭合/开放布尔值。然后可以将两个表合并为一个表。
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