数据库:一对一,一对多,多对多
一对一:就是说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作为主键。
比如
create table test
(
name varchar(19),
id number,
value varchar(10),
primary key (name,id)
)
上面的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这个唯一值。(这就是多对多关系)
复合主键是一个表中 用两个字段来确定数据唯一性
(这个是表中任意字段)
联合主键则是用两个或多个表中的主键组合起来确定数据唯一性
(这个是两个表的主键)
多对多中就是可以用联合主键。(因为两个键可以保证不重复)
数据库:一对一,一对多,多对多相关推荐
- 数据库一对一 一对多 多对多关系
参考:https://blog.csdn.net/u013144287/article/details/79024130 自己在项目中写的实例: '实体'和'公理'具有多对多关系,即一个实体可以对应多 ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis的一对一 一对多 多对多
mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- Django一对一 ,一对多,多对多
Django 数据库一对多,多对多 目录 app01/models.py app01/views.py app01/urls.py Python_Django/urls.py 目录 app01/mod ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- Mybatis中的关系映射(一对一,一对多,多对多)
在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...
最新文章
- Radware:当前,CDN安全远远不足
- 一种快速统计SQL Server每个表行数的方法
- linux 内核模块(驱动) 编译详解
- c语言遇到非法字符,98行的四则计算器.(支持括号)加入了非法字符的检测
- linux设置nexus开机自启动_linux安装nexus(支持jdk1.7)并设置开机启动
- “六级”题公布,觉得WebAPI简单的,勿进!
- 你知道怎么使用DebugView查看调试信息吗?
- sysbench压力工具报错:
- NOI.AC NOIP模拟赛 第四场 补记
- 安卓手机小说阅读器_手机阅读的好帮手,安卓小说神奇的扛把子
- 最新消息!OKR周报新模板!
- 实时数仓入门训练营:Hologres 数据导入/导出实践
- 微信小程序学习之路——API用户信息
- Unity控制物体移动旋转
- PowerMill2019基础到三四五轴编程视频教程全
- 少儿编程强势成2019创业热风口 未来谁才能突围占领C位?
- 安科瑞无线测温装置ARTM的功能特点有哪些
- 如何修改MySQL数据库的密码?
- 管理经济学简答题、计算题与案例分析题
- 电机控制器,FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计