我正在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
感谢阅读这么多解释。我想在太多信息方面犯错,而不是太少,但如果需要任何进一步的信息,请告诉我。我感谢任何建议!
答案 0 :(得分:0)
除非您的生产环境严重不足,否则它应该能够在表中保留50万行,而不会严重降低性能。检索性能将受到用于查询的字段以及已构建索引的字段的极大影响。这可以区分witing秒和等待分钟。
这里有太多细节,但有很多关于数据库设计的优秀教程。这些Titorials中最好的将教你如何设计不仅是为了性能,还为了未来的灵活性,这同样重要。
乍一看,你的桌面结构看起来很不错。