聚合不仅仅适用于关系中存在属性的情况,三元在某些情况下更具限制性,我用一个例子来解释:
假设您有一个小型数据库,用于安排不同日期的课程,并在这些日期将教师分配给这些课程,使用三元关系,它看起来像这样:
ERD: https://i.stack.imgur.com/8FQ87.png https://i.stack.imgur.com/8FQ87.png
CREATE TABLE teacher
{
teacher_id int PRIMARY KEY
}
CREATE TABLE class
{
class_id int PRIMARY KEY
}
CREATE TABLE date
{
date_id int PRIMARY KEY
}
CREATE TABLE teaching_class_in_date
{
date_id int,
class_id int,
teacher_id,
constraint teaching_class_in_date_PK PRIMARY KEY (date_id,class_id,teacher_id)
constraint teacher_FK FOREIGN KEY (teacher_id) references teacher (teacher_id)
constraint class_FK FOREIGN KEY (class_id) references class (class_id)
constraint date_FK FOREIGN KEY (date_id) references date (date_id)
}
这意味着,当您想要与老师安排新课程时,您需要事先获得老师、班级和日期中的所有三项记录。但是,如果您想在某个日期先分配一门课,但还不确定老师,该怎么办?
你有两个选择,我通常在混乱的企业数据库中看到的一个是在教师表中创建一个虚拟记录,如果你还不确定教师,则在某个日期分配给每个新班级,并且它将显示在GUI 为“默认”或“空”。
选项二,使teacher_id 不成为主键的一部分,并允许teacher_id 外键为空值。
两者都是错误的决定,第二个更糟糕,因为它打破了数据库第三范式。
要解决此问题,您可以使用如下聚合:
ERD: https://i.stack.imgur.com/wAEXF.png https://i.stack.imgur.com/wAEXF.png
所以现在你将有一个额外的表:
CREATE TABLE class_in_date
{
date_id int,
class_id int,
constraint class_in_date_PK PRIMARY KEY (date_id,class_id)
constraint class_FK FOREIGN KEY (class_id) references class (class_id)
constraint date_FK FOREIGN KEY (date_id) references date (date_id)
}
现在你可以分配这两个任务而不必担心老师。这一切都归结为要求,如果我没有创建在事先没有老师的情况下在某个日期分配课程的要求,那么三元关系就足够了。
希望这有帮助!