1

我正在 SQL Server 2008 数据库中设计一个表结构,它将保存审计结果。审计目前有 65 个问题和 0-4 或 N/A 的可能答案。下面描述了我为保存这些数据(仍在测试中)而创建的表结构。提交后,会在 AuditDetail 表中为每个问题创建一条记录。如果选择的答案是 0、1 或 2,则用户必须输入详细信息,描述为什么它低、如何修复以及谁负责(这会在 AuditIssue 表中创建一条记录)。每个问题由两个不同的类别描述,分别名为 QuestionCategory 和 ItemCategory。

我担心的问题是,在我当前的表设计中,每次提交的审计都会在 AuditDetail 表中添加 65 行。这个审计每个月至少需要完成70次(很多部门都在用)。因此,此表结构每月将向 AuditDetail 表添加大约 4550 行。我担心这可能会对未来的性能产生负面影响,并且希望避免在将其移入生产环境后重新设计表结构。

我能想出的唯一其他解决方案是将 AuditDetail 表替换为一个表,该表包含一个针对每个问题的列,并将每个审计的分数存储在 1 行中,跨越 65 列以上。

我觉得我当前的设计遵循规范化规则,而我认为不会为每个问题创建一个列。我几乎可以肯定,这些问题将来会发生变化(可能很多次),包括添加/删除问题和更改现有问题。

我寻找这个问题的答案将我引向这两个来源:
许多行或许多列
将答案存储在列中

我了解每次问题更改时添加/删除列并不理想。 我的问题是每月创建 4550 行对查询性能的影响有多大?我不知道我的情况是否与“在列中存储答案”中描述的情况相同,因为他们的表中似乎只有 100 行。 如果查询的性能将大幅降低,是否有更好的表结构是我没有想到的?

我的查询将主要用于生成图表,显示每月完成的审计总数、打开的问题、已关闭的问题和过期问题、产生问题的前 10 个问题以及每月或每日审计分数(每个问题类别的答案/可能的总分或答案/可能的总分)。这些图表中的每一个都需要按部门、月份、区域等进行排序。

忏悔:我最终倾向于使用相关子查询来生成其中一些图表,我知道这已经降低了查询性能。我尝试解决它们,但由于我不是 SQL 大师,我最终陷入了困境。

我用于测试的当前表结构如下:

**AuditMain:**  
--AuditId  <-- PK  
--DeptNumber <-- FK to Dept Table  
--AuditorId  <-- FK to Auditor Table  
--StartDate  
--Area_Id    <-- FK to Area Table  

**AuditDetail**  
--DetailId  <-- PK  
--QuestionId  <-- FK to Question Table  
--Answer  
--NotApplicable  (boolean to determine if they chose N/A, needed to calcualte audit score)  
--AuditId  <-- FK to AuditMain  

**AuditIssue**  
--IssueId <-- PK  
--IssueDescription  
--Countermeasure  
--PersonResponsible  
--Status  
--DueDate  
--EndDate  
--DetailId <--FK to AuditDetail  

**AuditQuestion**  
--QuestionId <-- PK  
--QuestionNumber  (corresponds to the question number on the audit input form)  
--QuestionDescription  
--QuestionCategoryId <-- FK to QuestionCategory  
--ItemCategoryId <-- FK to ItemCategory  

**QuestionCategory**  
--QuestionCategoryId <-- PK  
--CategoryDescription  
--CategoryName  

**ItemCategory**  
--ItemCategoryId  <--PK  
--ItemCategoryDescription 

感谢您阅读如此多的解释。我想在信息太多而不是太少方面犯错,但是如果需要任何进一步的信息,请告诉我。我很感激任何和所有的建议!

4

1 回答 1

0

除非您的生产环境严重不足,否则它应该能够在一个表中保存 50 万行而不会严重降低性能。检索性能将受到您用于查询的字段和您在其上构建索引的字段的极大影响。这可以在等待几秒钟和几分钟之间产生差异。

这里有太多细节需要介绍,但是有很多关于数据库设计的优秀教程。这些标题中最好的将教您如何设计,不仅要考虑性能,还要考虑未来的灵活性,这同样重要。

乍一看,您的表结构看起来相当不错。

于 2013-02-13T19:17:29.010 回答