我试图理解将ER图转换为SQL CREATE语句,但我很难理解参与约束是如何工作的。在ER图中,参与约束由粗线表示,这意味着表中的每个元组必须出现在关系表中。如果存在参与约束和关键约束(总计),则可以实现关键约束。
在没有使用断言或检查约束的情况下,是否有某种方法可以强制执行参与约束而不是关键约束?
修改
我对整个概念更加困惑,而不是一个特定的例子,但我能够找到一个例子,我绘制了图表,这将说明我的困惑。在下图中,我们有参与约束和教授对教师的关键约束;因此,每位教授都必须教一个班,只教一个班。这种约束可以通过拥有professors_teach表而不是具有两个单独的表来强制执行;通过让教授ssn成为主键,教授表中每位教授只会有1个条目,并且由于它将具有通常将放在教授表中的所有记录,因此每个教授必须在新表中。
我的困惑在于从课程到教师的参与约束;基本上图表说的是每门课程必须至少有一位老师;我不认为可以在不使用断言或检查约束的情况下强制执行。
答案 0 :(得分:0)
对于这种情况,你不需要关系。
您只需要表格教师,并定义字段course_id (unique)
。在这种情况下,你有老师,他们可以有0或1门课程。每门课程只会教一位老师。
teacher_id (primary key)
teacher_name
ssn
course_id (unique) fk reference courses(course_id)
课程
course_id (primary key)
course_name
但是你不应该强制每个课程都有教师在数据库中,因为新课程需要立即教师。你最好插入课程,然后指派一名老师。
答案 1 :(得分:0)
您将关系Teaches和Entity Professor合并在一起:
CREATE TABLE Prof_teaches(
ssn INTEGER,
semesterid INTEGER,
courseID INTEGER NOT NULL,
FOREIGN KEY courseID REFERENCES Course (courseid),
PRIMARY KEY ssn
)
CREATE TABLE Course(
ssn INTEGER PRIMARY KEY
)
这是由Ramakrishnan所着的全书参与和关键约束。这意味着每个教授(注释,单个f)参与至少(总参与)和最多(关键约束),教会关系。