Sql 如何实现ER关系:Oracle中的一对一、一对多、多对多?
也许,这看起来像是数据库设计的基础。但是,当然,我发现这些概念在相互关联的意义上有点棘手 理论根据我的理解 一对一: 当每个特定实体都有一条记录时 一对多: 当每个特定实体都有许多记录时 多对多: 多个实体有多个记录 如上所述,如果我能举一个例子Sql 如何实现ER关系:Oracle中的一对一、一对多、多对多?,sql,oracle,Sql,Oracle,也许,这看起来像是数据库设计的基础。但是,当然,我发现这些概念在相互关联的意义上有点棘手 理论根据我的理解 一对一: 当每个特定实体都有一条记录时 一对多: 当每个特定实体都有许多记录时 多对多: 多个实体有多个记录 如上所述,如果我能举一个例子 一对一 每个员工都有一个唯一的护照号码 表雇员 Empid(pk) empname passpordid(fk to passport) 桌上护照 passportid(pk) passportno 一对多 有多个雇员的组织 表格组织 ORG
Empid(pk)
empname
passpordid(fk to passport)
桌上护照
passportid(pk)
passportno
ORGID (PK)
ORGNAME
EMPID (FK TO EMPLOYEE)
表雇员
EMPID (PK)
EMPNAME
SALARY
这是我想了解更多的部分,即多对多。我的意思是如果我们在这里看到一对多。总的来说,可以说是多对多,多对多的组织有很多员工,但这是否意味着整个关系是多对多,而不是一对多,或者一对多是上述示例中多对多的子集
我想知道一对多和多对多之间的区别,无论是从理论上还是从实现上 这更像是一个理论问题,而不是一个编程问题,但为什么不呢 您可以将“多对多”想象为一个表是员工列表,另一个表是销售产品列表
每个员工可能“处理”一个以上的产品,每个产品很可能由多个员工处理,产品A和B很可能同时由员工C和D处理。这更像是一个理论问题,而不是一个编程问题,但为什么不呢 您可以将“多对多”想象为一个表是员工列表,另一个表是销售产品列表
每个员工可能“处理”不止一个产品,每个产品很可能由多个员工处理,产品A和B很可能同时由员工C和D处理。多对多关系的一个例子是员工和技能,其中技能是“SQL”之类的东西,“Javascript”、“管理”等。一名员工可能拥有多种技能(例如,可能知道SQL和Javascript),而许多员工可能拥有某种特定技能(例如,Jack和Jill都知道SQL) 在Oracle这样的数据库中,您需要第三个表来表示员工和技能之间的多对多关系:
create table EMPLOYEE_SKILLS
( empid references EMPLOYEES
, skillid references SKILLS
, constraint EMPLOYEE_SKILLS_PK primary key (empid, skillid)
);
请注意,第三个表对其他两个表都有一个外键
该表还可以保存有关关系的更多信息,例如:
create table EMPLOYEE_SKILLS
( empid references EMPLOYEES
, skillid references SKILLS
, rating number
, date_certified date
, constraint EMPLOYEE_SKILLS_PK primary key (empid, skillid)
);
多对多关系的一个例子是员工和技能,其中技能是“SQL”、“Javascript”、“管理”等。一名员工可能拥有许多技能(例如,可能知道SQL和Javascript),而许多员工可能拥有一种特殊技能(例如,杰克和吉尔都知道SQL) 在Oracle这样的数据库中,您需要第三个表来表示员工和技能之间的多对多关系:
create table EMPLOYEE_SKILLS
( empid references EMPLOYEES
, skillid references SKILLS
, constraint EMPLOYEE_SKILLS_PK primary key (empid, skillid)
);
请注意,第三个表对其他两个表都有一个外键
该表还可以保存有关关系的更多信息,例如:
create table EMPLOYEE_SKILLS
( empid references EMPLOYEES
, skillid references SKILLS
, rating number
, date_certified date
, constraint EMPLOYEE_SKILLS_PK primary key (empid, skillid)
);
理论上,你似乎有一对一和一对多的基本想法 一对一:每个项目A都有一个单独且唯一的项目B 在数据库中,您可以将新数据包含在同一个表中。您可以将其放在单独的表中,并通过使远程表中的id为“唯一”(索引约束)来强制执行一对一约束,强制表中不重复项B的id。在您的示例中,这将是添加到passportid的约束 一对多:每个项目A都有一定数量的项目B 在数据库中,您将表中的键放在“多”侧。因此,许多B都将相同的外键放在表a中。在您的示例中,将orgid作为Foireve键放在employee表中。然后,许多员工可以指向单个组织,而一名员工可以属于一个组织 多对多:一些As可以链接到任意数量的Bs,反之亦然
在数据库中,这通常是作为一个链接表来实现的,只有A和B的ID。在你的例子中,考虑到一个雇员可以是多个组(或项目)的一部分,跨这些组的多任务处理。你可以有一个组表:
群组ID(PK) 组名 然后,链接表将如下所示 LINKID(PK) EMPID(FK至员工) GROUPID(FK到组) 这使得任何员工都可以成为任意数量的组的一部分,并且组可以有任意数量的员工,也就是多对多 附带评论:从技术上讲,您不必在链接表中设置LINKID。但这样可以更轻松地管理该表中的数据,通常被认为是“最佳做法”。从理论上讲,您似乎有一对一和一对多的基本思想 一对一:每个项目A都有一个单独且唯一的项目B 在数据库中,您可以将新数据包含在同一个表中。您可以将其放在单独的表中,并通过使远程表中的id为“唯一”(索引约束)来强制执行一对一约束,强制表中不重复项B的id。在您的示例中,这将是添加到passportid的约束 一对多:每个项目A都有一定数量的项目B 在数据库中,您将表中的键放在“多”侧。因此,许多B都将相同的外键放在表a中。在您的示例中,将orgid作为Foireve键放在employee表中。然后,许多员工可以指向单个组织,而一名员工可以属于一个组织 多对多:尽可能多的