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”、“管理”等。一名员工可能拥有多种技能(例如,可能知道SQLJavascript),而许多员工可能拥有某种特定技能(例如,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”、“管理”等。一名员工可能拥有许多技能(例如,可能知道SQLJavascript),而许多员工可能拥有一种特殊技能(例如,杰克和吉尔都知道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表中。然后,许多员工可以指向单个组织,而一名员工可以属于一个组织

    多对多:尽可能多的