1

監査の結果を保持する SQL Server 2008 データベース内のテーブル構造を設計しています。監査には現在 65 の質問があり、0 ~ 4 または N/A の回答が可能です。このデータを保持するために作成したテーブル構造 (まだテスト中) を以下に示します。送信すると、質問ごとに AuditDetail テーブルにレコードが作成されます。選択した回答が 0、1、または 2 の場合、ユーザーは、低い理由、修正方法、および責任者を説明する詳細を入力する必要があります (これにより、AuditIssue テーブルにレコードが作成されます)。各質問は、QuestionCategory と ItemCategory という名前の 2 つの異なるカテゴリによって記述されます。

私が懸念している問題は、現在のテーブル設計では、送信される監査ごとに 65 行が AuditDetail テーブルに追加されることです。この監査は、毎月少なくとも 70 回完了する必要があります (多くの部門で使用されています)。したがって、このテーブル構造では、1 か月あたり約 4550 行が AuditDetail テーブルに追加されます。これが将来のパフォーマンスに悪影響を及ぼす可能性があることを心配しており、これを本番環境に移行した後にテーブル構造を再設計する必要がないようにしたいと考えています。

私が思いつく他の唯一の解決策は、AuditDetail テーブルを、各質問の列を持ち、各監査のスコアを 65 列以上の 1 行に格納するテーブルに置き換えることです。

現在のデザインは正規化ルールに従っていると思いますが、質問ごとに列を作成することはそうではないと思います。質問の追加/削除や既存の質問の変更など、質問が将来 (おそらく何度も) 変更されることはほぼ確実です。

この問題に対する答えを探していると、次の 2 つの情報源にたどり着きました。
多くの行または多くの列 列に
回答を格納する

質問が変わるたびに列を追加/削除するのは理想的ではないことを理解しています。 私の質問は、1 か月あたり 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 に答える