私はデータベース開発にまったく新しいので、基本的に質問バンクを構築しようとしています。
質問は、クラス、件名、トピックに基づいて分類する必要があります。各クラスは多くのサブジェクトを持つことができ、各サブジェクトは多くのクラスに存在することができるので、主キーがサブジェクトとクラスであるtb_SubjectClassと呼ばれるジャンクションテーブルを作成しました。
チャプターを一意に識別するには、SubjectとClassの組み合わせが必要なので、tb_SubjectClassのSubjectとClassを主キーとして、Chapter、Subject、およびClassを含むtb_Chaptersを作成しました。次に、tb_Topicsを使用して同じことを繰り返しました。各トピックは、Subject、Class、およびChapterの組み合わせでのみ識別できるためです。
以下の関係図を配置しました。また、このデータベースには、約50000の質問(方程式と図を含む)が格納されることを期待しています。
主な質問:複合/複合キーに固執することにした場合、私のデザインは適切ですか、それともさらに改善できますか?
サイドの質問:次の点を考慮して、私の場合に最適なアプローチは何ですか?
私は主にtekstenuitleg.netの データベース設計チュートリアル と WiseOwlTutorials によるビデオチュートリアルに従っています。 Jan L. Harringtonによる本 Relational Database Design Clearly Explained も最近読み始めました。
外部キーを作成すると、データの重複/繰り返しが発生しますか、それとも親テーブルに格納されているデータへの参照/ポインタだけですか?
外部キーは、1つのテーブルの列にある可能性のある値を、別のテーブルの列にある同じ値の存在に応じて制限します。値は両方のテーブルに保存されるため、重複しています。重複を回避する(実際には-減らす)には、正規化を使用する必要があります。つまり、すべての個別の値が格納されている参照テーブルがあり、他のすべてのテーブルにはその値のIDのみが含まれています。
可能な限り複合キーは避けるべきですか?
いいえ。さらに、複合キーは、複数の列を含む複雑な条件でクエリを高速化する唯一の方法です。複合キーは、パフォーマンスの代償として回避できます。