一对一:就是说A表中的一条记录对应着B表的一条记录。大家可能会觉得这不是变得复杂了吗?其实不然,如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。

条件:建立单独的表就行了,

优点

1.   便于管理、可提高一定的查询速度

2.   减轻 CPU 的 IO 读写,提高存取效率。

3.   符合数据库设计的三大范式。

4.   符合关系性数据库的特性。

缺点

1.   增加一定的复杂程度,程序中的读写难度加大

一对多:顾名思义,A表一条数据对应B表多条数据。需要将A表主键作为B表的外键。

sql语句 :A :primary key (‘id’);(指定主键)

B:FOREIGN KEY('B-id') REFERENCES  'A' ('id'); (将外键B-id和主键id关联)

多对多: 需要一张中间表来对应他们的关系。那么此时,A,B表并不需要其他的外键。只需各有自己的主键就行,就像一张单独的表一样。

因为需要一张单独的关系表来映射他们的关系。

就比如这个:将orderid和productid作为联合主键。然后相互对应各自的外键。

有人可能就疑惑了,怎么这里设置了两个主键?

有必要讲下联合主键和复合主键了。

一、复合主键

所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

比如

 
  1. create table test

  2. (

  3. name varchar(19),

  4. id number,

  5. value varchar(10),

  6. primary key (name,id)

  7. )

上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越好 。

这里就会有一个疑惑?  主键是唯一的索引,那么为何一个表可以创建多个主键呢?

其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。

此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?

所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

二、联合主键

联合主键顾名思义就是多个主键联合形成一个主键组合(主键原则上是唯一的,别被唯一值所困扰。)

联合主键的意义:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。

一个简单的例子

主键A跟主键B组成联合主键

主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 
下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系)

复合主键是一个表中 用两个字段来确定数据唯一性

(这个是表中任意字段)

联合主键则是用两个或多个表中的主键组合起来确定数据唯一性

(这个是两个表的主键)

多对多中就是可以用联合主键。(因为两个键可以保证不重复)

数据库:一对一,一对多,多对多相关推荐

  1. 数据库一对一 一对多 多对多关系

    参考:https://blog.csdn.net/u013144287/article/details/79024130 自己在项目中写的实例: '实体'和'公理'具有多对多关系,即一个实体可以对应多 ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  4. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  5. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...

  7. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  8. Django一对一 ,一对多,多对多

    Django 数据库一对多,多对多 目录 app01/models.py app01/views.py app01/urls.py Python_Django/urls.py 目录 app01/mod ...

  9. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  10. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

最新文章

  1. Radware:当前,CDN安全远远不足
  2. 一种快速统计SQL Server每个表行数的方法
  3. linux 内核模块(驱动) 编译详解
  4. c语言遇到非法字符,98行的四则计算器.(支持括号)加入了非法字符的检测
  5. linux设置nexus开机自启动_linux安装nexus(支持jdk1.7)并设置开机启动
  6. “六级”题公布,觉得WebAPI简单的,勿进!
  7. 你知道怎么使用DebugView查看调试信息吗?
  8. sysbench压力工具报错:
  9. NOI.AC NOIP模拟赛 第四场 补记
  10. 安卓手机小说阅读器_手机阅读的好帮手,安卓小说神奇的扛把子
  11. 最新消息!OKR周报新模板!
  12. 实时数仓入门训练营:Hologres 数据导入/导出实践
  13. 微信小程序学习之路——API用户信息
  14. Unity控制物体移动旋转
  15. PowerMill2019基础到三四五轴编程视频教程全
  16. 少儿编程强势成2019创业热风口  未来谁才能突围占领C位?
  17. 安科瑞无线测温装置ARTM的功能特点有哪些
  18. 如何修改MySQL数据库的密码?
  19. 管理经济学简答题、计算题与案例分析题
  20. 电机控制器,FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计

热门文章

  1. Python3时间戳转换为指定格式的日期
  2. Oracle分区表索引
  3. (转)纵观国内外证券公司IT发展史
  4. Java 11 JDK
  5. 硬盘提示初始化是什么意思?数据会丢失吗?
  6. windows驱动程序开发(普及)
  7. 爬取某知名网站的数据
  8. xp系统电脑蓝屏怎么解决,解决xp电脑屏幕蓝屏
  9. java部门管理_系统管理模块_部门管理_实现基本的增删改查功能
  10. 《周志明的软件架构课》学习笔记 Day6