数据库设计——表的关系与范式

2023-11-12

一、表的关系

1.一对一关系(1:1):

概念描述:

例如:一个人只能拥有一张身份证,一张身份证也只能对应一个人。

那么这里的一个人和身份证就是一对一的关系。

多表之间一对一关系如何实现?

两个一对一关系的表,可以在任意一方添加外键,并将外键指向另一方的主键。(实现的提前条件必须使用关键字unique对外键进行唯一约束。一般一对一关系的表,直接合并成一张表,很少用,了解即可)

2.一对多关系(1:n):

概念描述:

例如:一个学生只能属于一个系,但一个系可以有很多的学生。

那么这里的一个系和学生就是1:n关系。

多表之间的一对多关系如何实现?

例如一个系和学生。在学生的表(多的一方)中建立外键,指向系的主键。

3.多对多关系(m:n):

 概念描述:

例如:一个学生可以选择多门课程,一门课程可以被多个学生选择。

那么这里的学生和课程就是m:n关系。

多表之间的多对多关系如何实现?

借助中间表来实现。在中间表中至少包含两个字段,并且两个多对多关系的表主键作为外键写入中间表。

 二、范式

第一范式

在表中,所有的列都是不可再分的原子项。(了解即可,因为表一创建便满足第一范式)

第二范式

在第一范式的基础上,消除部分函数依赖。关于部分函数依赖,又引申出以下几点,具体参照如下图:

函数依赖:A-->B,通过A属性(属性组)就可以确认唯一B属性的值。

例如:学号-->名字,(学号,课程名称)-->分数

(简单翻译:通过学号可以确定名字的唯一值,通过学号,课程名称就可以确定唯一的分数值。这里的学号是属性,学号,课程名称是属性组)

完全函数依赖:: A-->B,如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。

例如:(学号,课程名称)-->分数

(简单翻译:参照上图。

学号10010它可以查询出很多科目的分数,课程大学英语也可以查询出很多个同学的成绩分数,所以说单是学号或者是课程名没有办法去确定唯一的分数。想要获得分数的某个值,必须要依赖学号和课程名称这两个属性去确认,这个就叫完全函数依赖

部分函数依赖:A-->B,如果A是 一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。

例如:(学号,课程名称)-->系名

(简单翻译:只要通过查询某个学生的学号,就可以确定他是哪个系的,完全不需要课程名称这个属性,这就是部分函数依赖)

传递函数依赖:A-->B,B -->C .如果通过A属性(属性组)的值,可以确定唯一B属性的值, 在通过B属性(属性组)的值可以确定唯一C
属性的值,则称c传递函数依赖于A

例如:学号-->系名,系名-->系主任,最终学号-->系主任

码:如果在一张表中,一个属性或属性组, 被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。

例如:(学号,课程名称)-->分数

学号,课程名称就是表的码。

第三范式:在第二范式的基础上,消除传递依赖

3.第一范式到第三范式的演变范例:

(1)创建一张表,包含以下信息(表一创建就满足第一范式)

(2)满足第二范式(在第一范式的基础上,消除部分函数依赖)

部分函数依赖:学号-->姓名,学号-->系名,系名-->系主任,学号-->系主任(传递依赖)

完全函数依赖:(学号,课程名称)-->分数

消除部分函数依赖:消除姓名,系名,系主任等列,得到下图,满足第二范式。

 

 (3)满足第三范式(在第二范式的基础上,消除传递依赖)

由第二范式的图可知,传递依赖:学号-->系名,系名-->系主任,学号-->系主任

消除传递依赖:将系名、系主任去除。

满足第三范式。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库设计——表的关系与范式 的相关文章

  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 在 SELECT IN 中使用 Oracle 参数时出现问题

    我在将一串数字插入sql查询时遇到问题 SELECT FROM tablename a WHERE a flokkurid IN 3857 3858 3863 3285 ORDER BY sjodategund rodun or SELEC
  • 我怎样才能知道oracle 9i中哪些值是数字

    我有这个包含 varchar 的数据库 我想知道哪些记录保存数值 我试过REGEXP COUNT和其他 但我在 9i 上运行 我认为这是针对 10g gt 我怎样才能实现这个目标 I tried select to number my co
  • SQL 错误:“没有这样的表”

    我试图解决为什么我的代码为所有查询返回 null 的原因 最后发现 sql 查询什么也没有返回 我使用简约代码创建了一个新的 AIR 文档 s WindowedApplication
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • Java.lang.Byte类之shortValue()方法的功能说明

    转自 Java lang Byte类之shortValue 方法的功能说明 下文笔者将讲述Java lang Byte类中shortValue 方法的功能简介说明 如下所示 shortValue 方法的功能 java lang Byte s
  • pycharm错误ERROR: Command errored out with exit status 1:

    报错 ERROR Command errored out with exit status 1 错误原因 python版本与pycharm要求的版本不一致 解决方法 1 在pycharm中找到File 打开Settings 2 在Setti
  • FMQL在linux下GPIO的映射关系与使用

    最近几年国产化芯片的使用如火如荼 部分国产手册说明杂且描述不清 尤其是一些映射关系使用文字描述非常不直观 博主在使用GPIO功能输出的时候反复看了几遍再去尝试控制耗费了不少时间 现结合相关文档总结GPIO映射表格 方便读者使用 1 GPIO
  • 性能测试——结果量含义(系统吞吐量(TPS)、用户并发量)

    性能测试 首先 开发软件的目的是为了让用户使用 我们先站在用户的角度分析一下 用户需要关注哪些性能 对于用户来说 当点击一个按钮 链接或发出一条指令开始 到系统把结果已用户感知的形式展现出来为止 这个过程所消耗的时间是用户对这个软件性能的直
  • Run-Time Check Failure #2 – Stack around the variable 'a' was corrupted.

    Run Time Check Failure 2 Stack around the variable a was corrupted 今天在用VS调代码的时候 会出现这个问题 经过查找以及DEBUG 最终发现是由于建立的数组下标溢出造成的
  • 在linux上开关swap

    swapon a 会开启 etc fstab上定义的所有swap swapoff a会关闭所有swap cat proc meminfo会显示swap的情况 另外下面的命令也会显示swap swapon s Filename Type Si
  • 什么是域名,怎么买服务器

    1 域名 域名 是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称 用于在数据传 输时标识计算机的电子方位 www baidu com com是顶级域名 baidu是一级域名 www是二级域名 每个域名可以对应一个i
  • tars协议序列化分析

    引言 tars序列化过程 TARS编码协议是一种数据编解码规则 它将整形 枚举值 字符串 序列 字典 自定义结构体等数据类型按照一定的规则编码到二进制数据流中 对端接收到二进制数据流之后 按照相应的规则反序列化可得到原始数值 简单理解 TA
  • os.walk详解

    https www jianshu com p bbad16822eab python中os walk是一个简单易用的文件 目录遍历器 可以帮助我们高效的处理文件 目录方面的事情 1 载入 要使用os walk 首先要载入该函数 可以使用以
  • 关于MP3文件中找不到TAG标签的问题

    今天做项目需要上传mp3文件 在postman中测试的时候发现找不到这个mp3文件中的TAG标签 心想着不应该啊 我这是正规音频啊 如果是图片把后缀改成mp3没有TAG是肯定的 但是我这个音频为什么也没有呢 经过百度一番 初步判断有可能问题
  • xcode常用快捷键 快捷生成代码分享

    快速打印 NSLog lt text gt 快速string NSString 快速for循环 for int i 0 i lt lt max gt i lt code gt 快速setter和getter property lt type
  • STM32F103 - 配置规则通道参数 - 05 - unfinished -unfinished-unfinished

    五 配置规则通道参数 设置指定ADC的规则组通道 一个序列 采样时间 常规通道配置 ADC RegularChannelConfig ADC1 ch 1 ADC SampleTime 239Cycles5 ADC1 ADC通道 采样时间为2
  • ubuntu安装教程及docker安装容器,前后端部署

    1 0 Linux的常用命令 删除目录中的文件 rm fate txt 删除一个目录及其内容 rm r dir r 选项作用递归删除目录及其子目录中的所有内容 dir是文件夹名称 创建一个文件 touch fate txt 创建的是一个空文
  • CentoS8 安装篇十一:ngrok内网穿透工具搭建

    一 准备工作 1 外网域名 域名备案 2 服务器 有固定ip 3 服务器开放端口 80 443 4443 端口下面使用 注意与其他端口有冲突 4 域名映射 下面使用到ngrok xxx com必须映射至该服务器 5 添加泛域名映射至该服务器
  • R

    文章目录 Windows下更新R版本及Rstudio 一 更新R版本 二 Rstudio中更新R Windows下更新R版本及Rstudio 在R中安装一些包时 经常会出现包与旧版本R不兼容的问题 所以就对Windows下R的版本进行了更新
  • python数据精度问题

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • go实现bcrypt加密

    什么是bcrypt Bcrypt 是一款加密工具 它生成的密文是60位的 而且每次加密生成的值是不一样的 MD5 加密虽然不可逆 但是它每次生成的密文是相同的 这便给暴力破解留下了余地 所以推荐使用bcrypt进行加密 简单实现 packa
  • Linux 后台运行的进程printf输出到什么地方,是否消耗内存

    分析 正常情况下printf 输出到 stdout 输出流 可以通过 freopen 改变 stdout 转向到du文件 例如 freopen test txt w stdout printf abcd 98765 会把 abcd 9876
  • 【专题5:硬件设计】 之 【48.推挽电路驱动MOS管】

    嵌入式工程师成长之路 系列文章 总目录 系列文章总目录 希望本是无所谓有 无所谓无的 这正如脚下的路 其实地上本没有路 走的人多了 也便成了路 原创不易 文章会持续更新 欢迎微信扫码关注公众号 承接 小程序 嵌入式 PC端项目开发 联系作者
  • 数据库设计——表的关系与范式

    一 表的关系 1 一对一关系 1 1 概念描述 例如 一个人只能拥有一张身份证 一张身份证也只能对应一个人 那么这里的一个人和身份证就是一对一的关系 多表之间一对一关系如何实现 两个一对一关系的表 可以在任意一方添加外键 并将外键指向另一方