-
2018-08-28 20:03:10
2018年06月04日 16:35:57 阅读数:322更多
个人分类: 数据库设计
设计数据表,遇到一个很常见的情况。一、中间表-多对多关系的转化
实际中,经常存在多对多关系。以订单和商品为例,一个订单对应多个商品,一个商品也对应多个订单。此时在将E-R图转化为关系模型时,需要引入中间表(也叫做连接表)。中间表包含两个实体表的主键,建立两张表沟通。中间表也可以有普通字段。例如商品数量,和每种商品总和。注意:要把他们与实体表中字段含义区分开。
参考连接:https://zhidao.baidu.com/question/1732427061119828187.html
二、中间表主键
中间表的主键,可以是两个外键作为联合主键,也可以是再增加一个主键字段。由于我的表中除了两个外键,还有普通字段,增加一个主键后,逻辑更清楚,所以我建议再增加一个主键字段。
三、三个实体间均存在多对多的关系
三个实体存在多对多关系有以下三种情况:1.有一个实体与剩下两个实体存在N:M关系,剩下两个实体没有N:M关系。
图1
2.三个实体间均存在多对多关系。以下这两种情况搞不清楚有什么区别,实际应用时哪种方式更好一点?个人感觉由于图2生成的中间表包含所有的关系,一张表可以连接三个表,查询会更快捷,所以采用了图2。哪位大佬若是了解透彻,还请不吝赐教,指点一二奋斗奋斗
图2
参考链接:http://www.cnblogs.com/huangfr/archive/2011/10/10/2206706.html
更多相关内容 -
Mysql多对多关系利用中间表查询
2019-05-25 17:24:171、多对多关系,我们举个简单的例子,一个顾客可以买多件商品,同时一类商品(指多件相同的商品)也可以也可以让多个用户购买 下面是对应的表,用户表,商品表以及关系表,其中关系表中userId、metId的外键分别是...1、多对多关系,我们举个简单的例子,一个顾客可以买多件商品,同时一类商品(指多件相同的商品)也可以也可以让多个用户购买
下面是对应的表,用户表,商品表以及关系表,其中关系表中userId、metId的外键分别是userTable 的userId 、materialTable 的matId
userTable materialTable
materil_user
如果我们要查询用户a1买了哪些商品我们可以这样
SELECT user.userName,user.userId,mat.matName,mat.matId FROM materil_user mu LEFT JOIN userTable user on user.userId=mu.userId LEFT JOIN materialTable mat on mat.matId=mu.matId WHERE mu.userId=1
查询结果:
-
数据表(中间表)的设计:多对多关系
2021-03-01 17:19:57中间表-多对多关系的转化: 在表的使用中,经常存在多对多的关系,以订单和商品为例,一个订单对应多个商品,一个商品也对应多个订单,此时把E-R图(E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示...中间表-多对多关系的转化:
在表的使用中,经常存在多对多的关系,以订单和商品为例,一个订单对应多个商品,一个商品也对应多个订单,此时把E-R图(E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型)转化为关系模型时,需要引入中间表。
中间表包含两个实体类的主键,建立两张表沟通。
中间表也可以有普通字段,例如商品数量,每种商品总和(需要把他们与实体表中字段含义区分开)。
中间表主键:
中间表的主键可以是两个外键作为联合主键( 联合主键就是说,当一个字段可能存在重复值,无法确定这条数据的唯一性时,再加上一个字,两个字段联合起来确定这条数据的唯一性。比如你提到的id和name为联合主键,在插入数据时,当id相同,name不同,或者id不同,name相同时数据是允许被插入的,但是当id和name都相同时,数据是不允许被插入的),也可以是再增加一个主键字段。
三个实体间存在多对多的关系:
有一个实体与剩下两个实体存在N:M关系,剩下两个实体没有
三个实体间存在多对多关系
中间表简述:
中间表是业务逻辑中的概念,就是将计算结果先保存在一个临时的表中,然后再从这个表中计算,减少程序的复杂度。临时表是中间表多采用的一种技术,使用 Oracle临时表功能可以免去中间表数据的维护工作。
中间表举例:
分析表1(tableOne),找到唯一的业务主键,这是一个班级课程表,存储了课程的信息,主键就id。
分析表2(tableTwo)找到唯一的业务主键,这是一个课程单元表,存储了所有课程单元。
因为课程表和单元表没有关联信息,所以无法关联查询,这时需要中间表把两个表进行关联。
建立索引。
查询测试。
检验测试查询结果。
-
mysql数据表之间是多对多的关系时,中间表如果加上`id`主键,会不会比不加主键快?
2021-01-18 21:37:49聚簇索引:MySQLInnoDB一定会建立聚簇索引,把实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚簇索引,即MySQL不会一次把数据行保存在二个地方。1)InnoDB通常根据主键值(primarykey)进行聚簇2)如果...慕的地10843
补充一点,希望有些帮助。聚簇索引:MySQLInnoDB一定会建立聚簇索引,把实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚簇索引,即MySQL不会一次把数据行保存在二个地方。1)InnoDB通常根据主键值(primarykey)进行聚簇2)如果没有创建主键,则会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引3)上面二个条件都不满足,InnoDB会自己创建一个虚拟的聚集索引优点:聚簇索引的优点,就是提高数据访问性能。聚簇索引把索引和数据都保存到同一棵B+树数据结构中,并且同时将索引列与相关数据行保存在一起。这意味着,当你访问同一数据页不同行记录时,已经把页加载到了Buffer中,再次访问的时候,会在内存中完成访问,不必访问磁盘。不同于MyISAM引擎,它将索引和数据没有放在一块,放在不同的物理文件中,索引文件是缓存在key_buffer中,索引对应的是磁盘位置,不得不通过磁盘位置访问磁盘数据。缺点:1)维护索引很昂贵,特别是插入新行或者主键被更新导至要分页(pagesplit)的时候。建议在大量插入新行后,选在负载较低的时间段,通过OPTIMIZETABLE优化表,因为必须被移动的行数据可能造成碎片。使用独享表空间可以弱化碎片2)表因为使用UUId作为主键,使数据存储稀疏,这就会出现聚簇索引有可能有比全表扫面更慢,所以建议使用int的auto_increment作为主键3)如果主键比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值;过长的主键值,会导致非叶子节点占用占用更多的物理空间引自:http://blog.csdn.net/wyzxg/article/details/8779235
-
数据库两张表多对多关系为什么用中间表而不用相互外建
2016-03-01 10:21:02数据库两张表多对多关系为什么用中间表而不用相互外建,菜鸟求指点 -
Hibernate多对多之中间表只有两个外键做联合主键
2015-12-02 21:26:21一般情况下,多对多的关联关系是需要中间表的; 情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用ManyToMany(不用写中间表的Model,只需要写出两张主表的model即可) 学生表 @... -
关系型数据库中多对多关系的中间表的命名规则
2020-04-16 14:25:35前两种关系只需要表本身就能表达清楚,然而多对多需要第三张中间表才能表达清楚多对多的关系。 中间表在一般情况下是由三个字段组成: 1、中间表本身的自增主键 2、两张表各自的主键。 这时候命名就成为了一个... -
多对多关系的中间表命名
2019-09-24 11:00:09在网上看一些,以及我个人使用的方法,总结一个规则:table1_table2 转载于:https://www.cnblogs.com/Jerrycjc/p/7146971.html -
27.一对一,一对多,多对多关系表的各种骚操作
2021-08-31 10:22:33(1)一对多表关系的数据的添加修改 ①学院表信息的插入: 常规方法是写个视图函数,在视图函数里添加插入数据的逻辑代码。但是这样的话——你得访问此视图函数对应的接口才能添加成功!岂不麻烦~ 所以,本博主... -
在MySQL中建立多对多关系的映射(建立中间表)
2020-11-11 15:14:27但是在建立多对多关系的映射时,我们要借助一张中间表,并在中间表里添加外键,所以两张表的建表语句就是正常的建表语句,只需要添加每个表本身的字段即可,不需要添加额外属性。 随便举个例子吧,route表(线路)... -
Django - ORM 多对多关系 - 中间关系表的创建方式探讨
2018-11-19 17:45:09多对多关系 - 三种中间表的创建方式 - 优劣总结 方式一、手动创建第三张表 方式二、自动创建第三张表 - MandyToManyField 方式三、半自动创建第三张表 -- 手动创建第三张表+ManyToMany建立关系(推荐使用) 多... -
jpa配置多对多关系(中间表)
2018-04-03 10:24:54现在我们再tb_user或者tb_role中任意一个里面进行维护关系,多对对的情况下我们需要创建一个中间表来完成这个关系的映射,我们再tb_user中添加注解@ManyToMany然后再添加一个注解@JoinTable因为我们是要创建中间表... -
数据表设计:中间表——多对多关系E-R图转换
2018-06-04 16:35:57一、中间表-多对多关系的转化实际中,经常存在多对多关系。以订单和商品为例,一个订单对应多个商品,一个商品也对应多个订单。此时在将E-R图转化为关系模型时,需要引入中间表(也叫做连接表)。中间表包含两个实体... -
数据库在一对一、一对多、多对多怎么设计表关系
2021-01-19 17:19:28里面放丈夫和妻子2、一对多可以建两张表,将一这一方的主键作为多那一方的外键,例如一个学生表可以加一个字段指向班级(班级与学生一对多的关系)3、多对多可以多加一张中间表,将另外两个表的主键放到这个表中(如... -
Springboot-多表关联的建立(中间表)
2018-07-12 16:49:28场景:用户表、项目表、用户和项目中间表 多对多表的实体创建,记得在配置文件中加: spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect MyISAM和InnoDB详解:... -
JPA 多对多关联 中间表带有属性 两个外键作为中间表的联合主键时 直接操作中间表查询修改的方法
2018-10-30 15:35:23因为中间表带有属性,采用的多对多映射方式 两个实体类都使用 @OneToMany( mappedBy="workDateTime") 需求:因为中间表使用两个外键作为联合主键 ,如果需要对中间表的属性进行修改, 1、一般做法 ... -
如何向多对多关系的中间表添加数据
2015-12-04 03:35:32 -
mybatis-plus多表查询(三表多对多关系)
2021-06-15 19:40:47数据库表的关系无非就四种:1、一对多(多对一),2、一对一,3、多对多,4、没有关系。其实面对数据表的多对多关系并没有那么复杂,那要看你怎么实现,传统的方法无非就是查询sql语句,而我要的是不通过自己写sql... -
数据表对应关系(一对一、一对多、多对多)
2018-04-27 14:54:54一对一Ø 一对一是将数据表“垂直切分”,其实是不常见,或不常用的。也就是 A 表的一条记录对应 B 表的一条记录,为什么要这样的设计呢,不是增加了程度的复杂性吗,然而并不一定,举例说明: 1) 一个系统... -
mybatis通过中间表实现一对多查询
2020-05-09 22:36:221.student:学生表 2.subject:科目表 3.stu_sub:学生-科目表(这里的成绩字段没用到,不用管) 实体类( get、set方法省略): 1.student public class Student implements Serializable { private int id; ... -
26.Django实现表关系(一对多,一对一,多对多))
2021-08-30 17:06:26表关系的实现: 实践: (1)模型的定义(models.py文件): class Department(models.Model): """ 学院表 """ d_id = models.AutoField(primary_key=True) d_name = models.CharField(max_length=30) def ... -
laravel删除多对多中间表关联关系
2018-03-22 16:32:49detach方法将会从中间表中移除相应的记录 -
Hibernate 学习心得1: 多对多关系中,中间表无法插入数据。
2018-03-07 13:37:15Hibernate 学习心得之一 多对多关系中,中间表无法插入数据。最近学习 spring4+hibernate4,学习中遇到了很多坑。在这里我来说说我遇到的坑,这里就不介绍如何spring如何集成hibernate。目前学习过程中,我遇到的两... -
Spring Boot 学习笔记 14 : JPA 双向多对多映射中间表插入数据失败
2019-02-19 16:11:14最近在做项目的权限控制这一块,在编写修改角色权限部分代码时遇到角色-权限中间表数据插入失败的问题,原因是将中间表维护放在了权限表这一端来进行。 角色实体类如下: @Entity @Table(name = "sys_role&... -
Hibernate 多对多之拆分中间表增加有多个关系字段
2016-08-04 11:19:28Hibernate多对多关系中间表有其他属性的配置方式 一、需求原因 在我做系统架构时遇到情况是这样:资源菜单实体类(Resource)和角色实体类(Role)是多对多关系,需要各个角色可以个性化自己的资源菜单顺序。 二、... -
JPA中多对多表关系的删除操作,如何删除放弃维护关联关系的一方和中间表的纪录
2018-11-16 10:21:17数据库中的表 用户表:在配置实体类的时候放弃...需求:删除t_user表中的user_id 为1的用户,并删除相关的中间表纪录。 代码: @Test public void testRemove() { EntityManager manager = JPAUtil.createEn... -
MyBatis 多对多 中间表插入数据
2017-05-10 18:45:55在做这个员工管理系统demo的时候,由于user和role是多对多关系,且user主键是自增的,所有我们没办法提前知晓这个user_id,所以插入的时候,就需要先插入user,然后再找到刚插入的id拿出来,再插入中间表user_role,... -
JPA(3) 表关联关系(多对一、一对多、多对多、一对一)
2018-11-15 19:57:39单向多对一: 给多方加上@ManyToOne ex:【产品类Product--多方 ,产品分类ProductDir--一方】 单向一对多:给一方加上@OneToMany ex:【产品类Product--多方 ,产品分类ProductDir--一方】 双向多对一、... -
数据库怎么设计多对多的数据表
2021-01-19 19:55:55数据库怎么设计多对多的数据表一、...比如老师和学生,建立一个关系表,表id,老师id,学生id即可二、数据表设计(一对多,多对多)做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表。然而在实际开发... -
在MySQL数据库建立多对多的数据表关系
2021-01-18 19:23:06在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表步骤1:创建三张数据表Student ,...