0

私は大学の管理システムを設計しています。私は5つのテーブルを持っています:学生、教師、コース、Available_CoursesとTaken_Courses。データベース設計。多対多。主キーは何が必要ですか?

Student: 
    student_id (PK) 

Teacher: 
    teacher_id (PK) 

Courses: 
    courses_id (PK) 

Available_Courses: 
    available_courses_id 
    teacher_id 
    course_id 

Courses_Taken: 
    courses_taken_id 
    student_id 
    courses_available_id 

Available-CoursesとCourses_TakenテーブルのPKはどのようにする必要がありますか?

私がavailable_courses_id(表Available_Courses)のプライマリキーを作成しないと、Courses_Tableに接続できなくなり、Available_Coursesテーブルの3つの属性すべてのCompositeキーを作成すると、1人の教師が同じコースに再度登録できます。再び。 teacher_idとcourse_idという2つの属性の複合キーを作成すると、データベース内の繰り返しが増加します。その両方がCourses_Taken Tableにあり、関係を作成します。

同じことがCourses_Takenテーブルにあります。私はテーブル出席でそのPKを使用する必要があります(まだ作成されていません)。

このような状況では、どうすればよいですか?

student 
    id   int unsigned(P) 

teacher 
    id   int unsigned(P) 

course 
    id   int unsigned(P) 

available_courses 
    teacher_id int unsigned (F teacher.id)--\__(P) 
    course_id int unsigned (F course.id)---/ 

courses_taken 
    student_id int unsigned (F student.id)--\__(P) 
    course_id int unsigned (F course.id)---/ 
+0

available_coursesは、コースが教師によって教えられる行を保持しているようです。利用可能なコースは、そのテーブルの何行かに表示されているコースであると考えられます。あなたのテーブルをどのように定義するかはあなたの質問にとって重要ではありません。 (CKs、FDs、FKs)。 – philipxy

答えて

0

より小さな一意の列セットを含まない表内で一意です。 1つのCKがPK(プライマリキー)と呼ばれることがあります。

どの列セットが一意であるかは、アプリケーションの状況やアプリケーション状況がどのような状況で発生する可能性があるかについて、テーブルの行が何を示しているかによって異なります。

クエリは、「テーブルの接続」(それが何であれ)、CKまたはFK(外部キー)とは関係ありません。問合せでは、アプリケーションの状況について基本表の行が示すものと、関係と論理演算子がそれらをどのように組み合わせるかによって構築されたアプリケーション状況に関する真の文を作成する行が要求されます。

列がCKまたはFKを形成する場合(つまり、列のリストの値の一部が常に特定のCKのサブロー値として存在する場合)、DBMSにそのことを強制できるように指示します。クエリの構成には影響しません。

何もありませんが間違っていますそれ自体が繰り返し値を持っています。冗長性はデータが2回出現することについてではなく、同じことを2度言いながらです。自然キーの代わりにidカラムを導入する必要はありません。それはちょうどの値をに正確に同じ場所の値を繰り返す。 、あなたがIDを使用available_coursesを仮定

はCKS {available_courses_id} {& teacher_id、Course_IDに}を有し、courses_takenはCKS {courses_taken_id} {& STUDENT_ID、courses_available_id}を有します。 (IDは必要ありませんが)

+0

私は必要はないと知っていますが、Exam_Resultsという別のテーブルを追加する必要があるとすれば、このデザインにどのように統合するのでしょうか? 私が見ている限り、student.id、teacher.id、course.idをExam_Resultsという名前の新しいテーブルに繰り返す必要があります。 繰り返しの横に別の方法がありますか? –

+0

@AzeemUllahそれらを繰り返すことには何も間違った*はありません。それ以外の場合は、* ids *を正確に同じ場所*に繰り返します。冗長性は、データが2回表示されるのではなく、同じことが2回繰り返されるということです。 – philipxy

0

CK(候補キー)は列のセットです:available_coursesまたはcourses_taken表内の人工キーの必要はちょうど主キーとして2つの外部キーの組み合わせを使用して、ありません

関連する問題