gpt4 book ai didi

sql - 何时在 RDBMS 中使用三元关系而不是聚合?

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:36 24 4
gpt4 key购买 nike

我想知道什么时候会表示实体集之间的关系和三元关系的关系?我理解聚合的好处,但是如果实体集和关系集之间的关系中没有属性,为什么要使用它呢?例如,一名研究生(带有学生编号和姓名)从事一个项目(带有 pid、开始日期和结束日期),并且该学生从事的每个项目都有一位指导教授。每个项目必须只有一位教授作为主管。主管关系没有唯一的属性,但有人告诉我应该使用聚合,但为什么呢?

最佳答案

聚合不仅仅是为了万一关系中有一个属性,三元在某些情况下更严格,我举个例子解释一下:

假设您有一个小型数据库,用于安排不同日期的类(class)并在这些日期为这些类(class)分配教师,使用三元关系它看起来像这样:

ERD:/image/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)
}

这意味着,当您想要安排一位老师的新类(class)时,您需要事先在老师、类(class)和日期中获得所有三个记录。但是,如果您想在某个日期首先分配一个类(class),但还不确定老师呢?

你有 2 个选项,我通常在困惑的企业数据库中看到的一个是在教师表中创建一个虚拟记录,如果你还不确定教师,它会在特定日期分配给每个新类(class),并且它将在 GUI 中显示为“默认”或“空”。选项二,使 teacher_id 不是主键的一部分,并允许 teacher_id 外键为空值。

两个都是错误的决定,第二个更糟糕,因为它破坏了数据库的第三范式。

要解决此问题,您可以使用这样的聚合:

ERD:/image/wAEXF.png

所以现在你会有一张额外的 table :

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)
}

现在你可以分配两个而不用担心老师了。这一切都归结为需求,如果我没有创建在没有老师的情况下在特定日期分配类(class)的需求,那么三元关系就足够了。

希望这对您有所帮助!

关于sql - 何时在 RDBMS 中使用三元关系而不是聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36381446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com