sql >> データベース >  >> RDS >> Mysql

関係テーブルの複合インデックス

    Auto Increment idの使用に固執するとします。 主キーとしての列。次に、データの一貫性を確保する必要もあります。つまり(student_id, course_id)の組み合わせに重複する行はありません 値。したがって、これをアプリケーションコードで処理するか(挿入/更新の前に毎回選択を行う)、コンポジットUNIQUEを定義することで構造的に修正する必要があります。 (student_id, course_id)の制約 。

    現在、主キーは基本的にUNIQUENOTNULLキーです。テーブル定義を見ると、この新しく定義されたUNIQUE制約は基本的に主キーのみです(フィールドもNULLではないため)。したがって、この特定のケースでは、サロゲート主キーidを実際に使用する必要はありません。 。

    UNIQUEインデックスのみを使用する場合にも同様のオーバーヘッドが発生するため、ランダムDML(挿入/更新/削除)中のオーバーヘッドの違いは最小限に抑えられます。したがって、Natural Primary Composite Key (student_id, course_id)を定義することもできます。 :

    -- Drop the id column
    ALTER TABLE students_courses DROP COLUMN id;
    
    -- Add the composite Primary Key
    ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);
    

    上記では、(student_id, course_id)の組み合わせにUNIQUE制約も適用されます 。さらに、4バイトを節約できます 行ごと(intのサイズ は4バイトです)。これは、大きなテーブルがある場合に便利です。

    さて、studentsから参加している間 students_coursesへ 上記のテーブルは、主キーで十分なインデックスになります。ただし、coursesから参加する必要がある場合 students_coursesへ テーブルでは、この目的のために別のキーが必要になります。したがって、course_idでもう1つのキーを定義できます。 次のように:

    ALTER TABLE students_courses ADD INDEX (course_id);
    

    さらに、データの整合性を確保するために外部キー制約を定義する必要があります。

    ALTER TABLE students_courses ADD FOREIGN KEY (student_id) 
                                 REFERENCES students(student_id);
    
    ALTER TABLE students_courses ADD FOREIGN KEY (course_id) 
                                 REFERENCES courses(course_id);
    



    1. MYSQL日時は最も近い時間に丸められます

    2. PHPでmysqli_query()を使用するにはどうすればよいですか?

    3. あるSQLServerから別のSQLServerにテーブルデータをエクスポートする

    4. SQL Server(T-SQL)で照合を見つける方法