0

大学のデータベースには、科目と前提条件の自己参照関係があります。サブジェクトが 0 個以上の前提条件を持つことができることを意味します。

だから私はそれを主題の表で宣言しました

 subject_code VARCHAR(7) NOT NULL CONSTRAINT subject_pk PRIMARY KEY,
 subject_name VARCHAR(50) NOT NULL,
 pre_requisite VARCHAR(7) NULL CONSTRAINT unit_pre_code FOREIGN KEY 
               REFERENCES subject(subject_code),

したがって、私がこの方向に向かっているのは正しいのか、それとも前提条件を扱う別の表が必要なのか疑問に思っています。

正しい軌道に乗っている場合、サブジェクトの前提条件を持つデータを挿入するにはどうすればよいですか? たとえば、C++(C12345) の科目は、オペレーティング システム(C34512) などの前提条件です。私はまだこれに慣れていないので、SQL の適切で簡単なリファレンスを探すのに苦労しています。どんな推奨事項も素晴らしいでしょう!

4

1 に答える 1

2

関係は 1 対多です。つまり、1 つのサブジェクトに多くの前提条件が存在する可能性があるため、別のテーブルを使用する必要があります。例えば

CREATE TABLE SubjectPrerequisite
(       Primary_Subject_Code        VARCHAR(7) NOT NULL,
        Prerequisite_Subject_Code   VARCHAR(7) NOT NULL,
    CONSTRAINT PK_SubjectPrerequisite PRIMARY KEY (Primary_Subject_Code, Prerequisite_Subject_Code),
    CONSTRAINT FK_SubjectPrerequisite_Primary_Subject_Code FOREIGN KEY (Primary_Subject_Code) REFERENCES Subject (Subject_Code),
    CONSTRAINT FK_SubjectPrerequisite_Prerequisite_Subject_Code FOREIGN KEY (Prerequisite_Subject_Code) REFERENCES Subject (Subject_Code)
)

これにより、すべての正しいキーを持つことで参照整合性が維持されますが、1 つのサブジェクトに複数の前提条件がある場合にデータベースのクエリがはるかに簡単になります。例えば

-- WILL RETURN ALL SUBJECTS AVAILABLE GIVEN A CERTAIN PERSONS
-- COMPLETED SUBJECTS.
SELECT  DISTINCT s.*
FROM    Subject s
        INNER JOIN SubjectPrerequisite sp
            ON s.Subject_Code = sp.Primary_Subject_Code
WHERE   sp.Prerequisite_Subject_Code IN ('C12345', 'C12346') 

-- WILL RETURN ALL PRERQUISITE SUBJECTS FOR ANY GIVEN SUBJECT
SELECT  s.*
FROM    SubjectPrerequisite sp
        INNER JOIN Subject s
            ON s.Subject_Code = sp.Prerequisite_Subject_Code
WHERE   sp.Primary_Subject_Code = 'C34512' 
于 2012-05-29T11:20:09.330 に答える