表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的。

在一个关系型数据库中,利用关系可以避免多余的数据。例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名、出版日期和出版社。您也可能保存有关出版社的信息,诸如出版社的电话、地址和邮政编码。如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码。

更好的方法是将有关出版社的信息在单独的表,publishers,中只保存一次。然后可以在 titles 表中放置一个引用出版社表中某项的指针。

为了确保您的数据同步,可以实施 titles 和 publishers 之间的参照完整性。参照完整性关系可以帮助确保一个表中的信息与另一个表中的信息相匹配。例如,titles 表中的每个书名必须与 publishers 表中的一个特定出版社相关。如果在数据库中没有一个出版社的信息,那么该出版社的书名也不能添加到这个数据库中。

为了更好地理解表关系,请参阅:

  • 定义表关系
  • 实施参照完整性

定义表关系

关系的确立需要通过匹配键列中的数据(通常是两表中同名的列)。在大多数情况下,该关系会将一个表中的主键(它为每行提供了唯一标识)与另一个表的外部键中的某项相匹配。例如,通过创建 titles 表中的 title_id(主键)与 sales 表中的 title_id 列(外部键)之间的关系,则销售额就与售出的特定书名相关联了。

表之间有三种关系。所创建关系的类型取决于相关列是如何定义的。

  • 一对多关系
  • 多对多关系
  • 一对一关系

一对多关系

一对多关系是最普通的一种关系。在这种关系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers 和 titles 表之间具有一对多关系:每个出版社出版很多书,但是每本书名只能出自一个出版社。

只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。

多对多关系

在多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。例如,authors 和 titles 表具有多对多关系,这是由于这些表都与 titleauthors 表具有一对多关系。titleauthors 表的主键是 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)的组合。

一对一关系

在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。如果相关列都是主键或都具有唯一约束,则可以创建一对一关系。

这种关系并不常见,因为一般来说,按照这种方式相关的信息都在一个表中。可以利用一对一关系来:

  • 分割具有多列的表。
  • 由于安全原因而隔离表的一部分。
  • 保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。
  • 保存只适用于主表的子集的信息。

实施参照完整性

参照完整性是一个规则系统,能确保相关表行之间关系的有效性,并且确保不会在无意之中删除或更改相关数据。

当实施参照完整性时,必须遵守以下规则:

  • 如果在相关表的主键中没有某个值,则不能在相关表的外部键列中输入该值。但是,可以在外部键列中输入一个 null 值。例如,不能将一项工作分配给一位没有包含在 employee 表中的雇员,但是可以在 employee 表的 job_id 列中输入一个 null 值,表明一位雇员没有分配工作。
  • 如果某行在相关表中存在相匹配的行,则不能从一个主键表中删除该行。例如,如果在 employee 表中表明某些雇员分配了某项工作,则不能在 jobs 表中删除该工作所对应的行。
  • 如果主键表的行具有相关行,则不能更改主键表中的某个键的值。例如,如果一位雇员分配了 jobs 表中的某项工作,则不能从 employee 表中删除该雇员。

当符合下列所有条件时,才可以设置参照完整性:

    • 主表中的匹配列是一个主键或者具有唯一约束。
    • 相关列具有相同的数据类型和大小。
    • 两个表属于相同的数据库。

原文地址:https://www.cnblogs.com/tanzq/p/8409940.html

时间: 2024-10-19 20:54:20

表关系(一对一,一对多,多对多)的相关文章

django mysql 表的一对一 一对多 多对多

表结构的设计 一对一 多对一  将key写在多 多对多 外键: 描述  多对一的关系 写在多的一方 class Book(models.Model) title = models.CharField(max_length=32,unique=Ture) publisher = models.ForeignKey (to=Publisher,on_deleete=models.CASADE) publisher = models.ForeignKey(to='Publisher', on_dele

mysql表的一对一/一对多/多对多联系

1.数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多. 2.通过表的关系,来帮助我们怎样建表,建几张表. 一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住址和联系人为不常用数据 如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用 常用信息表:ID(P),姓名,性别,年龄,身高,体重 不常用信息表:ID(

多表关系一对一

多表关系一对一 一.多表关系 外键:建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以) 一对一关系:外键在任何一方都可以,此时外键要设置 唯一键 一对多关系:外键必须放在多的一方,此时外键值不唯一 多对多关系:一定要创建第三张表(关系表),每一个外键值不唯一,可以多个外键建立联合唯一 二.一对一无级联关系 创建数据库 # 作者详情(author_detail): id,info,address create table author_detail( id int pr

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

057:表关系之一对多

表关系:表之间的关系都是通过外键来进行关联的.而表之间的关系,无非就是三种关系:一对一.一对多(多对一).多对多等.以下将讨论一下三种关系的应用场景及其实现方式. 一对多:1. 应用场景:比如文章和作者之间的关系.一个文章只能由一个作者编写,但是一个作者可以写多篇文章.文章和作者之间的关系就是典型的多对一的关系.2. 实现方式:一对多或者多对一,都是通过 ForeignKey 来实现的.还是以文章和作者的案例进行讲解. models.py: class Category(models.Model

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

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

数据库表与表之间的一对多多对多的关系

一对一要约束 unique 多对多和一对一事通过一对多的基础上模拟的 原文地址:https://www.cnblogs.com/jintian/p/11161225.html

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理,在 Laravel Administrator(后台扩展包) 您的数据库可能是彼此相关的.比如,一篇博客文章可能有许多评论,或者一个订单与下订单的用户相关.Eloquent 使得管理和处理这些关系变得简单.Laravel 提供了四种类型的关系: -一对一 -一对多 - 多对多 - 多态关系 一对多 一个一对多关系的例子是一篇博客文章有许多评