审计数据库设计:答案与许多列的许多行

时间:2013-02-13 17:06:37

标签: sql database-design query-performance

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

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

我能想到的唯一其他解决方案是将AuditDetail表替换为每个问题都有一列的表,并将每个审核的得分存储在一行中,超过65列。

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

我在寻找这个问题的答案时将我引向了这两个来源:
Many rows or many columns
Storing Answers In Columns

据我所知,每次问题发生变化时添加/删除列都不理想。 我的问题是,每月创建4550行会对我的查询效果造成多大影响?我不知道我的情况是否与“在列中存储答案”中描述的情况相同,因为它似乎是他们的桌子上只有100排。 如果查询的性能会大幅降低,是否有更好的表结构我还没有想过?

我的查询主要用于生成图表,显示每月完成的审计总数,已开启的问题与已结算与过期的问题,产生问题的十大问题,以及每月或每日审计得分(每个问题的答案/总可能点数或类别/答案/总可能点)。这些图表中的每一个都需要按部门,月份,区域等进行排序。

忏悔: 我倾向于最终使用相关子查询来生成其中一些图表,我知道这些图表已经降低了查询性能。我试着解决它们,但由于我不是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 

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

1 个答案:

答案 0 :(得分:0)

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

这里有太多细节,但有很多关于数据库设计的优秀教程。这些Titorials中最好的将教你如何设计不仅是为了性能,还为了未来的灵活性,这同样重要。

乍一看,你的桌面结构看起来很不错。