web-dev-qa-db-ja.com

データの繰り返しを最小化/回避し、複合キーと一意のインデックスの間で選択する

私はデータベース開発にまったく新しいので、基本的に質問バンクを構築しようとしています。

質問は、クラス、件名、トピックに基づいて分類する必要があります。各クラスは多くのサブジェクトを持つことができ、各サブジェクトは多くのクラスに存在することができるので、主キーがサブジェクトとクラスであるtb_SubjectClassと呼ばれるジャンクションテーブルを作成しました。

チャプターを一意に識別するには、SubjectとClassの組み合わせが必要なので、tb_SubjectClassのSubjectとClassを主キーとして、Chapter、Subject、およびClassを含むtb_Chaptersを作成しました。次に、tb_Topicsを使用して同じことを繰り返しました。各トピックは、Subject、Class、およびChapterの組み合わせでのみ識別できるためです。

以下の関係図を配置しました。また、このデータベースには、約50000の質問(方程式と図を含む)が格納されることを期待しています。

db relationship

主な質問:複合/複合キーに固執することにした場合、私のデザインは適切ですか、それともさらに改善できますか?

サイドの質問:次の点を考慮して、私の場合に最適なアプローチは何ですか?

  • 50000前後の予想レコード
  • 質問テーブル(tb_QnA)は、最も照会されるテーブルになります(データの選択および追加/削除用)
  • テーブルtb_Class、tb_Subjects、tb_SubjectClassはまったく変更されません。
  • データベースをc#winformアプリケーションに接続するときのクエリ作成の容易さ(データ入力およびレポートの生成用)
  • プロジェクトはデスクトップベースになります

私は主にtekstenuitleg.netの データベース設計チュートリアルWiseOwlTutorials によるビデオチュートリアルに従っています。 Jan L. Harringtonによる本 Relational Database Design Clearly Explained も最近読み始めました。

5
Paul

外部キーを作成すると、データの重複/繰り返しが発生しますか、それとも親テーブルに格納されているデータへの参照/ポインタだけですか?

外部キーは、1つのテーブルの列にある可能性のある値を、別のテーブルの列にある同じ値の存在に応じて制限します。値は両方のテーブルに保存されるため、重複しています。重複を回避する(実際には-減らす)には、正規化を使用する必要があります。つまり、すべての個別の値が格納されている参照テーブルがあり、他のすべてのテーブルにはその値のIDのみが含まれています。

可能な限り複合キーは避けるべきですか?

いいえ。さらに、複合キーは、複数の列を含む複雑な条件でクエリを高速化する唯一の方法です。複合キーは、パフォーマンスの代償として回避できます。

4
Kondybas