什么是数据库中的一对一关系?
什么是数据建模中的一对一关系?如何在数据库中实现这种关系?本文中的示例将回答这些问题。
数据建模中的实体(表)之间有三种类型的关系:
- 一对多关系(也表示为 1:M)。
- 多对多关系 (M:N)。
- 一对一关系(1:1)。
最常见的关系类型是一对多关系,其中一个实体中的记录可以由另一个实体中的多个记录引用。另一种常见类型是多对多关系。这种类型的关系仅用于逻辑数据模型。在物理数据库中,它必须通过使用一对多关系和联结表来实现。
在本文中,我们将讨论第三种类型的关系:一对一关系。这是数据模型中最不常见的关系类型。我们将提供一对一关系的示例,在 ER 图中显示一对一关系的表示法,并在实践中讨论一对一关系。
一对一关系示例
首先,什么是一对一关系?这是一种关系,其中一个实体(表)中的记录与另一个实体(表)中的一条记录完全相关联。
让我们看看一些现实生活中的一对一关系的例子:
- 国家 - 首都:每个国家都有一个首都。每个首都都是一个国家的首都。
- 人 - 他们的指纹。每个人都有一组独特的指纹。每组指纹只能识别一个人。
- 电子邮件 - 用户帐户。对于许多网站,一个电子邮件地址仅与一个用户帐户相关联,每个用户帐户由其电子邮件地址标识。
- 配偶 - 配偶:在一夫一妻制婚姻中,每个人都只有一个配偶。
- 用户配置文件 - 用户设置。一个用户有一组用户设置。一组用户设置仅与一个用户相关联。
为了清楚起见,让我们将这些示例与不是一对一的关系进行对比:
- 国家 - 城市:每个城市正好位于一个国家/地区,但大多数国家/地区都有许多城市。
- 父/母 - 子/女:每个子/女有两个父/母,但每个父/母可以有多个子/女。
- 员工 - 经理:每个员工只有一个直属主管或经理,但每个经理通常监督许多员工。
在 ER 图中表示一对一关系
与所有关系一样,ER 图中的一对一关系表示为连接两个实体的线。“一”基数用一条直线表示。(“许多”基数用鱼尾纹符号表示。
国家和资本之间的一对一关系可以这样表示:
垂直直线表示“强制性”。此图显示,首都必须有一个国家,一个国家必须有一个首都。
另一种可能性是关系的一方或双方是可选的。可选侧用开口圆表示。这张图说,一个人和他们的指纹之间存在一对一的关系。一个人是强制性的(指纹必须分配给一个人),但指纹是可选的(一个人可能没有在数据库中分配指纹)。
物理数据库中的一对一关系
有几种方法可以在物理数据库中实现一对一关系。
主键作为外键
在数据库中实现一对一关系的一种方法是在两个表中使用相同的主键。主键中具有相同值的行是相关的。在此示例中,法国在表country中
id
为1 ,其首都巴黎在表capital
中的id也为 1 。
country
id | name |
---|---|
1 | France |
2 | Germany |
3 | Spain |
capital
id | name |
---|---|
1 | Paris |
2 | Berlin |
3 | Madrid |
从技术上讲,必须将其中一个主键标记为外键,如以下数据模型所示:
表capital
中的主键也是引用表country
中 id 列的外键。由于capital.id
是主键,因此列中的每个值都是唯一的,因此首都最多可以引用一个国家/地区。它还必须引用一个国家/地区 - 它是一个主键,因此不能留空。
具有唯一约束的附加外键
在数据库中实现一对一关系的另一种方法是添加新列并使其成为外键。
在此示例中,我们在表capital
中添加列country_id
。首都中id为
1,马德里,与国家3,西班牙有关。
country
id | name |
---|---|
1 | France |
2 | Germany |
3 | Spain |
capital
id | name | country_id |
---|---|---|
1 | Madrid | 3 |
2 | Berlin | 2 |
3 | Paris | 1 |
从技术上讲,列country_id
应该是引用表country
中的列id
的外键。由于您希望每个资本只与一个国家/地区相关联,因此应使外键列country_id
唯一。
实践中的一对一关系
很少有一对一的关系持续
一对一关系是最不常见的关系类型。其中一个原因是现实生活中很少有一对一的关系。此外,大多数一对一关系仅在一段时间内是一对一的。如果您的模型包含时间分量并捕获更改历史记录(通常情况下),则只有很少的一对一关系。
一夫一妻制的关系可能会破裂,或者其中一个伴侣可能会死亡。如果您模拟一夫一妻制关系(例如婚姻或民事结合)随时间推移的现实,则可能需要模拟它们仅持续一段时间的事实。
你会认为一个人和他们的指纹永远不会改变。但是,如果这个人失去了一根手指或手指严重烧伤怎么办?他们的指纹可能会改变。这不是一个非常常见的情况;不过,在某些模型中,您可能需要考虑这一点。
即使是像国家及其首都这样看似稳定的东西也会随着时间的推移而变化。例如,波恩在第二次世界大战后曾经是西德的首都,当时柏林是东德的一部分。这在德国统一后发生了变化。德国的首都(德国联邦共和国)现在是柏林。是否应该考虑这一点取决于您的业务现实和您正在处理的应用程序。
可行的1:1方案:表的可选部分
对于真正的一对一关系,我可以想到一个可行的方案:表的可选部分。假设您有一个包含用户数据的表用户。该表包含常规用户信息,例如用户名、电子邮件地址和注册日期。它还包含用户设置,例如该应用的颜色主题或自动登录。但是,大多数用户没有任何用户设置。他们使用默认设置。
user
id | name | signup_ date | theme | autologin | |
---|---|---|---|---|---|
1 | Nathanael Talbot | nat@example.com | 2020-12-12 | dark | true |
2 | Talitha Yates | yates@example.com | 2020-12-14 | ||
3 | Markus Weir | weir@example.com | 2020-12-15 | light | false |
4 | Nathalie Hays | hays@example.com | 2020-12-18 | ||
5 | Maurice Church | mch@example.com | 2020-12-20 | ||
6 | Arwa Valdez | arval@example.com | 2020-12-21 |
此表中有很多空字段。您可以将表user
拆分为两个表:user
和user_settings
,其中包含有关选择用户的用户设置的信息。
user
id | name | signup_ date | |
---|---|---|---|
1 | Nathanael Talbot | nat@example.com | 2020-12-12 |
2 | Talitha Yates | yates@example.com | 2020-12-14 |
3 | Markus Weir | weir@example.com | 2020-12-15 |
4 | Nathalie Hays | hays@example.com | 2020-12-18 |
5 | Maurice Church | mch@example.com | 2020-12-20 |
6 | Arwa Valdez | arval@example.com | 2020-12-21 |
user_settings
user_id | theme | autologin |
---|---|---|
1 | dark | true |
3 | light | false |
将数据拆分为两个表会使表查询更加复杂:您必须联接两个表中的数据。另一方面,主用户表更易于管理。
了解有关数据库关系的详细信息
一对一关系是指一个表中的记录与另一个表中的一条记录完全关联的关系。这种类型的关系在现实生活中很少见。如果在数据模型中包括时间,则许多一对一关系将变为一对多或多对多关系。在数据库中使用一对一关系的最常见方案是将一个表拆分为两个表:一个表包含必需列,另一个表包含可选列。
什么是数据库中的一对一关系?相关推荐
- 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战
mabitis中的一对一关系项目实战: 1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好 打开IDE,建立web工程 在lib下面粘贴mybatis的jar,log4 ...
- Mybatis xml中配置一对一关系association一对多关系collection
Mybatis xml中配置一对一关系association&一对多关系collection 今天在配置一对一关系映射以及一对多关系映射的时候,把collection中应该使用的ofType配 ...
- 关系型数据库中所谓的“关系”是指( )。
A.各个记录中的数据彼此间有一定的关联关系 B.是指数据模型符合满足一定条件的二维表格式 C.某两个数据库文件之间有一定的关系 D.表中的两个字段有一定的关系 B :对 关系型数据库中所谓的" ...
- 关系型数据库中多对多关系的中间表的命名规则
在关系型数据库中,除了有一对一,一对多外,还有多对多的关系.前两种关系只需要表本身就能表达清楚,然而多对多需要第三张中间表才能表达清楚多对多的关系. 中间表在一般情况下是由三个字段组成: 1.中间表本 ...
- mysql查询父子关系树_swt 生成树[读取Mysql数据库中的父子关系表]
数据库中的表结构: id pid 1 0 2 1 3 1 4 2 6 2 5 4 需要生成 ...
- 数据库中专门的关系运算——除运算
不是很懂数据库中的除运算,不过看到这位大佬给的解释瞬间懂了. https://blog.csdn.net/skyejy/article/details/80890842 感谢
- 什么是数据库中的多对多关系?
什么是数据库建模中的多对多关系?如何在数据库中实现这种关系?本文中的示例将回答这些问题. 多对多关系可能是在数据库中显示的最棘手的关系.因此,我在本文中的第一步将是解释它们是什么.然后,我将继续给你几 ...
- MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...
- 数据库中一对一,一对多,多对多关系总结
由于最近在学数据库的东西,又想到了大一是老师交的如何通过数据库关系见表,下面就来说一下这三种关系的使用 数据库一对一.一对多.多对多关系 一.首先给出三种关系的实例 1.一对一关系实例 一个人对应一张 ...
最新文章
- legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解
- spark编程基础--5.1RDD编程基础
- 常用的linux的命令行操作
- 关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心
- 前端学习(1920)vue之电商管理系统电商系统之角色列表路由的切换
- android sqlite 备份数据库文件,android – 将SQLite数据库备份和还原到sdcard
- 阿里云语音识别模型端核心技术选讲
- java实验小狗状态_Java第6章-接口与多态实验2(小狗的状态)
- SpringCloud 应用在 Kubernetes 上的最佳实践(一):开发篇 | 凌云时刻
- 全球五百强IT名企智力题精选
- DZ先生怪谈视图库GA/T1400之人脸对象
- java string rt_【Java常用类之String类18】
- 分号的html文本,html分号
- 安卓实训项目源码_实训2019 | 联想云实训心得
- 浙江大学 工程伦理 第十二单元测试答案
- C语言代码覆盖率测试软件,代码覆盖率检测工具GCOV
- python爬虫入门------王者荣耀英雄及皮肤数据爬取项目
- 简单介绍API Platform Core
- 谷粒学院 01_在线教育行业介绍
- 图像仿射变换及图像扭曲(Image Warping)
热门文章
- Ubuntu WPS系统缺失字体symbol、wingdings、wingdings wingdings webding
- 百度图像识别API调用(python)
- Javascript实现表单检验(如注册界面)
- 自定义广告联盟接入解决方案,适用所有广告商接入。
- 关于数据驱动消费金融业务的几点看法
- 【什么办公软件好用】万彩办公大师教程丨PDF转图片工具
- 流利阅读12.27 Why life expectancy in America is down again
- SQL Server监控常规计数器收集参考(mssql阻塞的跟踪查询,死锁的跟踪查询,改善)
- 二维码的生成加背景图片的嵌套-支付宝(Java)
- 用代码写一个表白biu小心心