多对多表的设计小案例

Posted deepsleeping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多对多表的设计小案例相关的知识,希望对你有一定的参考价值。

多对多数据表设计

  场景模拟:

    员工与角色:一个员工可以扮演多个角色,一个角色可以被多个员工扮演

    三张表:  employee,role,(关系表)emp_role

        employee 中的eid,关联到关系表中的r_eid,然后可以找到和r_eid同一行的一个或多个r_rtype 利用r_rtype 又可以到role表中找到rtype对应的rname,这样从第一张表的员工id到中间表的绑定关联,根据中间表的rtype字段可以引用到第三章表(role)表中,从而获取role表中的rname。如下图:

  技术分享图片

 

DROP TABLE IF EXISTS emp_role;
DROP TABLE IF EXISTS employee;
DROP TABLE IF EXISTS role;

CREATE TABLE employee(
        eid            INT    PRIMARY KEY AUTO_INCREMENT,
        ename         VARCHAR(20),
        egender     CHAR(10),
        ephone         VARCHAR(30)
);

CREATE TABLE role(
        rtype        INT  PRIMARY KEY AUTO_INCREMENT,
        rname        VARCHAR(20)
);

CREATE TABLE emp_role(
        r_eid     INT,
        r_type    INT,
        
        CONSTRAINT pk_r_eid_type PRIMARY KEY(r_eid,r_type),
        CONSTRAINT fk_employee_emp_role FOREIGN KEY(r_eid) REFERENCES employee(eid),
        CONSTRAINT fk_role_emp_role FOREIGN KEY(r_type) REFERENCES role(rtype)
);


-- 增加员工信息
INSERT INTO employee(eid,ename,egender,ephone) VALUES(1002125,李永强,,13849753654);
INSERT INTO employee(ename,egender,ephone) VALUES(冯美美,,13754896369);
-- 增加角色信息
INSERT INTO role(rtype,rname) VALUES(1,高管);
INSERT INTO role(rname) VALUES(前台),(保洁);
-- 增加关系信息
INSERT INTO emp_role(r_eid,r_type) VALUES(1002125,2),(1002125,3);

技术分享图片

技术分享图片

技术分享图片

 



以上是关于多对多表的设计小案例的主要内容,如果未能解决你的问题,请参考以下文章

跨多对多表的关系

多对多表的创建方式 forms组件 session与cookie

用于连接多对多表的 Linq 查询

实体框架更改生成的多对多表的名称

Django中ORM多对多表的操作

MySQL严格选择涉及多对多表的行