DBS note7 (end):DB Design

news2025/1/13 15:58:19

目录

一、前言

二、引言

三、Entity-Relationship Models(实体-关系模型)

1、关系约束

三、函数依赖和正则化

1、BCNF分解

2、无损分解

3、依赖关系保留分解


一、前言

略读过一遍CS186,对于CS186来说,绝对不止这 7 篇笔记(包括这一篇)中呈现的内容,我把我的note 7作为该课程的收尾笔记是因为我目前深究课程里面的部分内容性价比不高,我要把精力花在刀刃上,另一原因是我还没有找到比较好的学习数据库的节奏和方法,这7篇note不是结束,只是开始,虽说没有给我带来很多硬核知识上的领悟,但这给我方向上的指引,日后遇到类似知识,可以在博客进行修订补充,不管怎么说,跌跌撞撞前进总比没有前进来得好。结束这一篇note后,下一篇就是新开课程学习著名神课15-445。下面言归正传。

二、引言

到目前为止,我们已经学会了如何使用已经构建好的数据库:SQL查询。但是,如果我们获得了有关我们想要存储的数据的高级描述,我们该怎么设计一个能满足我们需求的数据库呢?

三、Entity-Relationship Models(实体-关系模型)

在设计数据库时,我们经常使用实体-关系模型(也称为 “E-R” 模型)。这些模型有两个主要组成部分。

第一个主要组成部分是实体:由一组属性值描述的现实世界对象。

在我们的 E-R 模型中,实体通常表示为一个矩形。

此外,与实体关联的属性/字段被描绘为椭圆形。

例如,以下图示显示了员工作为实体在我们的 E-R 模型中,具有以下字段:SSN 号码、姓名和其他信息。请注意,“ssn”属性被加下划线,因为它是该实体的识别属性!在模式中,这将是主键。

第二个主要组成部分是关系:两个或多个实体之间的关联。

在我们的 E-R 模型中,关系通常表示为一个菱形。同样,与关系相关的属性被描绘为椭圆形。例如,以下图示显示了员工和部门之间的 “works in” 关系。"works in" 关系具有属性 "since"。

请注意,相同的实体集可以参与不同的关系集,或者在同一个关系集中扮演不同的 “角色”。

1、关系约束

到目前为止,我们一直用一条细黑线将我们的实体连接到关系。这条线表示多对多的关系。这意味着每个实体可以在关系中参与0次或多次,反之亦然。

例如,对于上面的图表,这意味着许多员工可以在许多部门工作(0次或多次),而部门可以有许多员工(0次或多次)。

相比之下,我们希望我们的模型反映每个部门至多有一个经理。我们通过使用 “键约束” 来实现这一点,该约束表示最多有一个,或者是一对多的关系。键约束由细箭头表示。需要注意箭头的方向,它指向在关系中有 0 或 1 的实体,指向有许多实体的方向。例如,对于以下图表,这意味着每个部门最多有一个经理(0 或 1),而员工可以是许多部门的经理(0 次或多次)。

如果我们希望我们的模型显示每个员工至少在一个部门工作,我们可以使用参与约束,该约束表示至少有一个关系。参与约束由一条粗线表示。例如,在下图中,我们添加了两条粗线。其中一条表示每个员工至少在一个部门工作。另一条表示每个部门至少有一个员工。

此外,可以看到我们添加了一条从部门指向管理者的粗箭头。这既是一个键约束,也是一个参与约束:每个部门恰好有一个经理。

弱实体只能通过考虑另一个(所有者)实体的主键来唯一标识。所有者实体和弱实体必须参与一对多的关系(一个所有者,多个弱实体)。弱实体必须在这个识别关系集中具有总参与度。我们通过加粗矩形和关系来表示弱实体,如下所示。此外,弱实体只有一个 “部分键”(虚线下划线)。在下面的示例中,我们说每个依赖项都通过其 pname 和员工的 ssn 唯一标识,并且每个员工都有 0 个或更多个附属项。

现在我们已经绘制出了我们的 E-R 模型,那么我们如何将其实际组织成关系呢?我们可以将每个实体和关系转化为自己的表,并根据表之间的关系设置主键和外键。一般来说,有很多种方法可以设置关系来表示相同的 E-R 模型。

三、函数依赖和正则化

现在我们已经建立了我们的数据库,我们想要进行优化!我们想要避免的一件事是我们模式中的冗余。这是一种浪费存储空间的情况,同时也会导致插入/删除/更新异常。我们解决这个问题的方法将是函数依赖(Functional Dependencies)。一个函数依赖 X->Y 表示 X 列在表 R 中决定了 Y 列。这意味着对于表 R 中的任意两个元组,如果它们的 X 值相同,那么它们的 Y 值必须相同(但反之则不然)。让我们看几个例子,以更好地理解函数依赖和“决定”是什么意思。在下面的例子中,两行具有相同的 X 值(1),但不同的 Y 值(5和6),因此我们不能说 X 决定了 Y:

对于以下示例,我们可以看到具有相同 X 值的所有行都具有相同的 Y 值。更具体地说,所有 X=1 的行都有 Y=2,所有 X=2 的行都有 Y=4,所有 X=3 的行都有 Y=4。在这种情况下,X 可能确定 Y(即 X->Y):

请注意,在上面的示例中,尽管两行的 Y=4,但它们的 X 值不必相同才能说 X 确定 Y。我们只关心特定 X 值的 Y 值是否相同,反之亦然!主键是函数依赖的特殊情况。超键是一组确定表中所有列的列。如果 X 是表 R 的超键,则 X->R。

候选键是一组列,确定表中的所有列,以至于如果我们移除候选键中的任何列,得到的集合将不是关系的超键。您可以将其视为表的超键的最小列集。如果 X 是 R 的候选键,则 X->R,对于每个严格的子集 Y\subsetX,Y\nrightarrowR。

例如,如果列 K、L 是表中的列,并且 K 是表的主键(即列 K 单独确定表中的所有列),那么 KL 是超键,K 是超键,也是候选键。

我们将使用函数依赖来分解关系以避免冗余。但首先,我们定义 F 的闭包,表示为 F+,是由 F 隐含的所有 FD 的集合。更广泛地说,闭包是可以从已知 FD 推断出的表关系的完整集合。

下面看个例子:

1、BCNF分解

这里只提供一个学习的方向性指引,具体BCNF分解的内容自己去找一下资料,网上很多。

2、无损分解

这里只提供一个学习的方向性指引,具体无损分解的内容自己去找一下资料,网上很多。

3、依赖关系保留分解

这里只提供一个学习的方向性指引。

以上,DBS note7 (end):DB Design

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1281563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序

注意 千万不要去下载什么驱动精灵,太垃圾不好用还一堆附带的软件。按以下步骤进行解决: 解决方法 可能是显卡驱动的问题,我的笔记本按照如下步骤重启一下驱动后解决了,步骤如下: 右键点击桌面的开始菜单,选择”设备…

算法通关村第十六关-白银挑战滑动窗口经典题目

大家好我是苏麟 , 今天带来滑动窗口经典的一些题目 . 我们继续来研究一些热门的、高频的滑动窗口问题 大纲 最长子串专题无重复字符的最长子串 长度最小的子数组盛最多水的容器 最长子串专题 无重复字符的最长子串 描述 : 给定一个字符串 s ,请你找出其中不含有重…

React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中,可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样,不过需要声明元素的类型 基本语法及展示如下, import styled from "styled-component…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

Swing程序设计(7)JPane面板,滑动面板

文章目录 前言一、JPane面板&#xff0c;滑动面板是什么&#xff1f;二、实操展示 1.JPane面板2.JScrollPane面板总结 前言 该篇博客介绍Java的Swing程序中JPane面板以及&#xff0c;滑动面板的使用。面板的使用&#xff0c;各个组件在不同的面板上被不同地摆放&#xff0c;让插…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

Github无法打开

文章目录 一、问题二、解决2.1、科学上网&#xff08;使用中&#xff09;2.2、使用代理&#xff08;不稳定&#xff09;2.3、修改hosts&#xff08;得更新&#xff09;2.3.1、找到hosts文件2.3.2、复制hosts文件2.3.3、添加记录2.3.4、替换原来的hosts文件2.3.5、成功访问Githu…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

2023年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)

本心、输入输出、结果 文章目录 了解大模型 RAG &#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;大模型外挂知识库 &#xff08;检索增强技术&#xff09;前言什么是检索增强技术 RAG &#xff08;Retrieval-Augmented Generation&#xff09;检索增强技术…

RocketMQ领域模型详解

1、主题&#xff08;Topic&#xff09; 1.1、定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义数据的分类隔离&#xff1a; 在 Apache RocketMQ 的方案设计中&#xff0c;建议将不同…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

类 —— 多态、抽象类

多态 通常说的多态&#xff0c;是指发生在类之间的多态。即相同的代码&#xff0c;实现不同的功能。 函数重载 —— 静态多态/编译时多态。 类之间的多态 —— 动态多态/运行时多态。 前提 继承、虚函数、函数重写。 函数重写&#xff08;override&#xff09; 在子类中重…

正则表达式从放弃到入门(2):grep命令详解

正则表达式从放弃到入门&#xff08;2&#xff09;&#xff1a;grep命令详解 总结 本博文转载自 这是一篇”正则表达式”扫盲贴&#xff0c;如果你还不理解什么是正则表达式&#xff0c;看这篇文章就对了。 如果你是一个新手&#xff0c;请从头阅读这篇文章&#xff0c;如果你…

设计一门编程语言:你认为最重要的一定要有的特性会是哪些?

当我们站在软件工程师的角度来考虑设计一门编程语言时&#xff0c;我们需要关注那些能够提升代码质量、开发效率和程序可维护性的特性。 以下是我认为最重要的几个特性&#xff1a; 1、简洁而明确的语法&#xff1a;语法是程序员与编程语言交互的基础。简洁明了的语法可以降低…

Pandas实战:电商平台用户分析

数据分析 1.行为概况 首先&#xff0c;我们要对用户的行为类型有一定的理解&#xff0c;了解每个行为所代表的含义。 浏览&#xff1a;作为用户与商品接触的第一个行为&#xff0c;它的数量级与其他行为类型相比而言是非常庞大的&#xff0c;因为&#xff1a; 用户购买之前需…

JavaSE基础50题:7. 写一个方法返回参数二进制中1的个数(3种方法!)

文章目录 概述方法1方法2方法3 概述 返回参数中二进制中1的个数。 如&#xff1a; 15(十进制) —— 0000 1111(二进制) —— 4个1 ①我们把二进制的数字的每一位都&1&#xff0c;其中&#xff1a;1&11 、0&10 ②用无符号右移&#xff08;>>>&#xff09;来…

第一百八十八回 分享三个使用TextField的细节

文章目录 1. 概念介绍2. 使用方法2.1 修改组件的填充颜色2.2 修改组件的高度2.3 给组件添加圆角3. 示例代码4. 内容总结我们在上一章回中介绍了"DropdownButton组件"相关的内容,本章回中将介绍**TextField组件的细节.**闲话休提,让我们一起Talk Flutter吧。 1. 概念…

栈的链式存储(详解)

栈的链式存储 栈的链式存储是通过链表来实现的&#xff0c;每个节点包含一个元素和一个指向下一个节点的指针。链式存储的栈不需要提前分配内存空间&#xff0c;可以动态地增加或减少元素。 在链式存储中&#xff0c;栈顶元素通常是链表的头节点&#xff0c;栈底元素是链表的…