Sql 审计数据库设计:多行多列

Sql 审计数据库设计:多行多列,sql,database-design,query-performance,Sql,Database Design,Query Performance,我正在SQLServer2008数据库中设计一个表结构,用于保存审核结果。审计目前有65个问题和可能的答案,为0-4或N/A。我创建的表格结构用于保存仍在测试中的数据,如下所述。提交后,在AuditDetail表中为每个问题创建一条记录。如果选择的答案是0、1或2,则用户必须输入详细信息,说明为什么低,如何修复,以及谁负责。这将在“试听问题”表中创建一条记录。每个问题由两个不同的类别描述,分别命名为QuestionCategory和ItemCategory 我关心的问题是,在我当前的表设计中,对

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

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

我唯一能想到的另一个解决方案是用一个表替换AuditDetail表,该表的每个问题都有一列,并将每个审核的分数存储在一行中,跨越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 

谢谢你通读了这么多的解释。我想在信息太多而不是太少方面犯错误,但是如果需要进一步的信息,请告诉我。我感谢所有的建议

除非您的生产环境动力严重不足,否则它应该能够在一个表中容纳50万行,而不会严重降低性能。检索性能将受到查询所用字段和已建立索引的字段的极大影响。这就决定了等待的时间和等待的时间

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

你的桌子结构乍一看很好