数据库定义表之间关系(带图)
- 格式:docx
- 大小:37.60 KB
- 文档页数:5
如何绘制逻辑图——逻辑的表达:数据逻辑(8)编辑导语:我们在日常工作中经常会遇到各种各样的逻辑关系,逻辑可以让我们的工作提高效率;作者在前一篇介绍了逻辑中的“业务逻辑”表达方式,本篇文章作者继续介绍“数据逻辑”的表达方式,我们一起来看一下。
多数没有开发背景的需求工程师对数据面层的分析、设计是比较生疏的,面对比较复杂的数据关系时或多或少都有一些畏惧,不太愿意深究,尽量交给后续的程序员去处理。
这个做法是不对的,数据逻辑来源于业务逻辑,需求分析师能够向程序员说明数据逻辑关系,那么后者的工作效率会提升很多(否则、不熟悉业务的后者还要花费很多时间去研究业务逻辑);同时是否能够清楚地表达数据逻辑关系也说明了需求分析师具有的能力和水平。
一、数据逻辑的概念数据逻辑:表达的是数据层数据之间的逻辑关系,这个层的要素是数据。
为了理解数据逻辑,要先理解为什么存在着业务逻辑和数据逻辑二种不同的表达形式呢?这首先是因为两者存在于不同的层面上、且要素不同。
1. 业务逻辑表达的是以客户“活动、规则”等内容为要素的逻辑关系。
业务逻辑表达的是业务活动之间的关系,是以客户的业务知识、业务事理为基础的。
举例说明,图1是一个生产过程的业务架构图(流程图),我们对客户业务的理解首先是从业务架构图获得的,从图的表面上只看到业务活动之间的关系,如:活动“4.采购”完成后下一个活动是“5.物流”。
图1 生产流程图在表面上虽然直接看不到数据的存在,但是在两个活动之间的关联线中流动着如下的数据:采购物品名称、数量、单价、交付日期等。
2. 数据逻辑表达的是以“数据”为要素的逻辑关系。
数据逻辑是数据间的关系。
数据架构层在业务架构层的下面,图2是一个业务逻辑与数据逻辑关系的示意图。
从业务架构图上是不能直接看到数据逻辑的,数据是业务活动产生的结果(沉淀),数据逻辑的获取是依赖于业务逻辑的,但在数据获取后,数据间的引用关系要远多于业务活动间的关联关系,如图2所示。
【转】如何画关系代数的连接图(数据库关系代数中笛卡⼉积、θ连接、等值连接、⾃然连接、外连接)
关系代数中的连接是⼀个重要⽽且容易混乱的知识点,我通过查阅很多资料总结了与连接有关的知识点,并发现了他们之间的关系。
本⽂通过理论知识先了解连接相关的重要名词意思,然后通过画图来理解画连接的思路以及他们之间的关系。
理论知识
定义:
⼀、笛卡⼉积
⼆、θ连接
(⼀)等值连接
(⼆)⾮等值连接
θ不为“=”的连接运算称为⾮等值连接。
三、⾃然连接
五、外连接
(⼀)左外连接(Left outer join/ left join)
如果只把左边关系R要舍弃的元组在⾃然连接的基础上保留就叫左外连接。
(⼆)右外连接(rightouter join/ right join)
如果只把右边关系S中要舍弃的元组在⾃然连接的基础上保留叫右外连接。
(三)全外连接(fullouter join/ full join)
左表和右表都不做限制,所有的记录都显⽰,两表不⾜的地⽅⽤null 填充。
画图
题⽬
⼀、笛卡⼉积
⼆、θ连接
(⼀)等值连接
(⼆)⾮等值连接
三、⾃然连接
五、外连接。
数据库和表(一)(总分200, 做题时间90分钟)一、选择题1.“字段大小”属性用来控制允许输入字段的最大字符数,以下______不属于常用的字段的大小。
SSS_SINGLE_SELA OLEB 整型C 长整型D 双精度型分值: 2答案:A2.Access中包含有______个数据库对象。
SSS_SINGLE_SELA 5B 6C 7D 8分值: 2答案:C3.创建交叉表查询必须对______字段进行分组(Group By)操作。
SSS_SINGLE_SELA 标题B 列表题C 行标题和列标题D 行标题、列标题和值分值: 2答案:C4.文本型字段最多可以存放______个字符。
SSS_SINGLE_SELA 250B 252C 254D 255分值: 25.Access字段名可包含的字符是______。
SSS_SINGLE_SELA “.”B “!”C 空格D “[]”分值: 2答案:C6.下列对主关键字段的叙述,错误的是______。
SSS_SINGLE_SELA 数据库中的每个表都必须有一个主关键字段B 主关键字段值是惟一的C 主关键字可以是一个字段,也可以是一组字段D 主关键字段中不许有重复值和空值分值: 2答案:A7.Access是______办公套件中的一个重要组成部分。
SSS_SINGLE_SELA OfficeB WordC ExcelD Lotus分值: 2答案:A8.Access中,______字段类型的长度由系统决定。
SSS_SINGLE_SELA 是/否B 文本C 货币D 备注分值: 2答案:A9.在数据据表的设计视图中,数据类型不包括______类型。
SSS_SINGLE_SELB 逻辑C 数字D 备注分值: 2答案:B10.以下不属于Microsoft Office 2000系列软件的是______。
SSS_SINGLE_SELA Access2000B Word2000C Excel2000D WPS2000分值: 2答案:D11.在Access数据库系统中,不能建立索引的数据类型是______。
数据结构的定义数据结构是计算机中存储、组织数据的方式,它定义了数据元素之间的逻辑关系以及如何在计算机中表示这些关系。
提高算法效率合适的数据结构可以显著提高算法的执行效率,降低时间复杂度和空间复杂度。
简化程序设计数据结构为程序设计提供了统一的抽象层,使得程序员可以更加专注于问题本身,而不是底层的数据表示和访问细节。
便于数据管理和维护良好的数据结构设计可以使得数据的管理和维护变得更加方便和高效。
数据结构的定义与重要性线性数据结构中的元素之间存在一对一的关系,如数组、链表、栈和队列等。
线性数据结构非线性数据结构中的元素之间存在一对多或多对多的关系,如树、图等。
非线性数据结构静态数据结构在程序运行期间不会发生改变,如数组、静态链表等。
静态数据结构动态数据结构在程序运行期间可以动态地添加或删除元素,如链表、动态数组等。
动态数据结构数据结构的分类01020304在计算机科学中,数据结构是算法设计和分析的基础,广泛应用于操作系统、编译原理、数据库等领域。
计算机科学在软件工程中,数据结构是软件设计和开发的重要组成部分,用于实现各种软件功能和性能优化。
软件工程在人工智能中,数据结构用于表示和处理各种复杂的数据和知识,如神经网络、决策树等。
人工智能在大数据处理中,数据结构用于高效地存储、管理和分析海量数据,如分布式文件系统、NoSQL 数据库等。
大数据处理数据结构的应用领域0102线性表是具有n个数据元素的有限序列创建、销毁、清空、判空、求长度、获取元素、修改元素、插入元素、删除元素等线性表的定义线性表的基本操作线性表的定义与基本操作03用一段地址连续的存储单元依次存储线性表的数据元素顺序存储结构的定义可以随机存取,即可以直接通过下标访问任意元素;存储密度高,每个节点只存储数据元素顺序存储结构的优点插入和删除操作需要移动大量元素;空间利用率不高,需要提前分配存储空间顺序存储结构的缺点链式存储结构的定义01用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的链式存储结构的优点02插入和删除操作不需要移动大量元素,只需要修改指针;空间利用率高,不需要提前分配存储空间链式存储结构的缺点03不能随机存取,只能通过从头节点开始遍历的方式访问元素;存储密度低,每个节点除了存储数据元素外,还需要存储指向下一个节点的指针0102定义栈(Stack)是一种特殊的线性数据结构,其操作只能在一端(称为栈顶)进行,遵循后进先出(LIFO)的原则。
数据库系统(四)---关系型数据库设计及E-R图1、关系型数据库: 关系型数据库是⼀类采⽤关系模型作为逻辑数据模型的数据库系统,遵从数据库设计的基本步骤,包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库的运⾏和维护等阶段。
概念结构设计与逻辑结构设计是关系数据库整个设计过程的关键。
2、关系数据库设计过程与各级模式 在关系数据库设计的不同阶段,会形成数据库的各级模式。
1)需求分析阶段,综合各个⽤户的应⽤需求; 2)概念结构设计阶段,形成独⽴于机器特点、独⽴于各个关系数据库管理系统产品的概念模式; 3)逻辑结构设计阶段,将 E-R 图转换成具体的数据库产品⽀持的关系数据模型,形成数据库逻辑模式,然后根据⽤户处理的要求、安全性的考虑,在基本表的基础上再建⽴必要的视图,形成数据的外模式; 4)物理结构的设计阶段,根据关系数据库管理系统的特点和处理的需要,进⾏物理存储安排,建⽴索引,形成数据库内模式。
3、概念结构设计⽅法 关系数据库的概念结构设计通常采⽤⾃顶向下法,它通过两个步骤来完成概念设计,⾸先建⽴局部信息结构,然后将局部信息结构合成为全局信息结构并优化,使⽤ E-R 图作为概念模型的描述⼯具。
1)局部信息结构设计 局部信息结构设计:根据需求分析报告中标明的不同⽤户视图范围所建⽴的满⾜该范围内⽤户需求的信息结构,称为局部信息结构。
局部信息结构设计的步骤包括:确定局部范围;选择实体;选择实体关键字;确定实体间联系;确定实体的属性。
2)E-R 图的表⽰⽅法 概念结构设计就是将需求分析得到的⽤户需求抽象为信息结构的过程,通常使⽤ E-R 图来作为描述现实世界的建模⼯具。
E-R 图提供了表⽰信息世界中实体、属性和联系的⽅法。
1.实体型,⽤矩形表⽰,写明实体的名称; 2.属性,⽤椭圆形表⽰,并⽤⽆向边将其与其相应的实体连接起来。
3.联系,⽤菱形表⽰,写明联系的名称,⽤⽆向边分别与有关实体连接起来,同时在⽆向边旁标注联系的类型(1:1、1:N 或 M:N),如果⼀个联系具有属性,则这些属性也要⽤⽆向边与该联系连接起来。
《数据库原理》第一章、绪论1.四个基本概念的掌握:数据——描述事物的符号记录数据库——长期存储在计算机内的有组织,可共享的数据集合。
例如:SQLServer2000中默认的数据库master。
DBMS——位于用户与操作系统之间的一层数据管理软件。
例如:SQLServer2000,Access,Orecal 等。
数据库系统——数据库、DBMS、应用程序等有关软件、硬件及各类人员(数据库管理员和用户)。
例如:学生个人信息管理系统。
数据库系统的核心是数据库管理系统。
2.四者的关系,核心,理解P6图1.13.数据管理的三个阶段——人工管理、文件系统、数据库系统,了解每个阶段的特点4.数据库系统的特点——数据整体结构化;数据冗余度低,共享性高,易扩充;数据的物理独立性与逻辑独立性强(物理、逻辑独立性的概念,体现在那些地方);由DBMS统一管理控制的四个功能(P11四点)5.数据模型的组成要素——数据结构、数据操作、数据的完整性约束6.概念模型——实际上是现实世界到机器世界的一个中间层次(第一层抽象),表示方法——E-R图(能熟练掌握绘制方法)。
7.概念模型中的基本概念——实体、属性、码、域、实体型、实体集、联系(事物内部的联系、两个事物之间的联系【1:1,1:n,n:m】、多个事物之间的联系)P158.数据模型——层次、网状、关系(主流)9.关系模型中的概念——关系,元组,属性,码,域,分量,关系模式P2910.模式,外模式,内模式定义,有哪两种模式映像及其作用P31-P34书上习题回顾—— p.19-20 1.6.2和1.6.3(1、2题)第二章关系数据库1.关系模型的组成要素——关系数据结构(关系)、关系操作集合(选择、投影、连接、除、并、交、差等查询操作和增加、删除、修改操作,特别是某些关系操作的表达式)、关系完整性约束(后面具体介绍)2.基本概念——笛卡尔积、关系候选码、主码、主属性、非码属性、全码3.基本关系的性质——P45六点4.关系的完整性:实体完整性——规定关系中的所有主属性不能为空,而不仅是整体不能为空NULL的含义(不知道或者无意义的值)。
如何定义数据库表之间的关系特别说明数据库的正规化是关系型数据库理论的基础。
随着数据库的正规化工作的完成,数据库中的各个数据表中的数据关系也就建立起来了。
在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据表中。
一旦完成了对这些数据元素的分类,对于数据的操作将依赖于这些数据表之间的关系,通过这些数据表之间的关系,就可以将这些数据通过某种有意义的方式联系在一起。
例如,如果你不知道哪个用户下了订单,那么单独的订单信息是没有任何用处的。
但是,你没有必要在同一个数据表中同时存储顾客和订单信息。
你可以在两个关系数据表中分别存储顾客信息和订单信息,然后使用两个数据表之间的关系,可以同时查看数据表中每个订单以及其相关的客户信息。
如果正规化的数据表是关系型数据库的基础的话,那么这些数据表之间的关系则是建立这些基础的基石。
出发点下面的数据将要用在本文的例子中,用他们来说明如何定义数据库表之间的关系。
通过Boyce-Codd Normal Form(BCNF)对数据进行正规化后,产生了七个关系表:Books: {Title*, ISBN, Price}Authors: {FirstName*, LastName*}ZIPCodes: {ZIPCode*}Categories: {Category*, Description}Publishers: {Publisher*}States: {State*}Cities: {City*}现在所需要做的工作就是说明如何在这些表之间建立关系。
关系类型在家中,你与其他的成员一起存在着许多关系。
例如,你和你的母亲是有关系的,你只有一位母亲,但是你母亲可能会有好几个孩子。
你和你的兄弟姐妹是有关系的——你可能有很多兄弟和姐妹,同样,他们也有很多兄弟和姐妹。
如果你已经结婚了,你和你的配偶都有一个配偶——这是相互的——但是一次只能有一个。
在数据表这一级,数据库关系和上面所描述现象中的联系非常相似。
UML的类图关系分为:关联、聚合组合、依赖、泛化(继承)UML的类图关系分为:关联、聚合/组合、依赖、泛化(继承)。
⽽其中关联⼜分为双向关联、单向关联、⾃⾝关联;下⾯就让我们⼀起来看看这些关系究竟是什么,以及它们的区别在哪⾥。
1、关联双向关联:C1-C2:指双⽅都知道对⽅的存在,都可以调⽤对⽅的公共属性和⽅法。
在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适⽤的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引⽤或指针。
对象引⽤本⾝就是有向的,更适合表达我们所讨论的那种关系。
所以这种关系在设计的时候⽐较少⽤到,关联⼀般都是有向的。
使⽤ROSE ⽣成的代码是这样的:class C1...{public:C2* theC2;};class C2...{public:C1* theC1;};双向关联在代码的表现为双⽅都拥有对⽅的⼀个指针,当然也可以是引⽤或者是值。
单向关联:C3->C4:表⽰相识关系,指C3知道C4,C3可以调⽤C4的公共属性和⽅法。
没有⽣命期的依赖。
⼀般是表⽰为⼀种引⽤。
⽣成代码如下:class C3...{public:C4* theC4;};class C4...{};单向关联的代码就表现为C3有C4的指针,⽽C4对C3⼀⽆所知。
⾃⾝关联(反⾝关联):⾃⼰引⽤⾃⼰,带着⼀个⾃⼰的引⽤。
代码如下:class C14...{public:C14* theC14;};就是在⾃⼰的内部有着⼀个⾃⾝的引⽤。
2、聚合/组合当类之间有整体-部分关系的时候,我们就可以使⽤组合或者聚合。
聚合:表⽰C9聚合C10,但是C10可以离开C9⽽独⽴存在(独⽴存在的意思是在某个应⽤的问题域中这个类的存在有意义。
这句话怎么解,请看下⾯组合⾥的解释)。
代码如下:class C9...{public:};class C10...{};组合(也有⼈称为包容):⼀般是实⼼菱形加实线箭头表⽰,如上图所⽰,表⽰的是C8被C7包容,⽽且C8不能离开C7⽽独⽴存在。
数据库表结构设计1. 原始单据与实体之间的关系可以是一对一、一对多、多对多的关系。
在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。
在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。
这里的实体可以理解为基本表。
明确这种对应关系后,对我们设计录入界面大有好处。
〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。
这就是“一张原始单证对应多个实体”的典型例子。
2. 主键与外键一般而言,一个实体不能既无主键又无外键。
在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
主键与外键的设计,在全局数据库的设计中,占有重要地位。
当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。
因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。
3. 基本表的性质基本表与中间表、临时表不同,因为它具有如下四个特性:(1) 原子性。
基本表中的字段是不可再分解的。
(2) 原始性。
基本表中的记录是原始数据(基础数据)的记录。
(3) 演绎性。
由基本表与代码表中的数据,可以派生出所有的输出数据。
(4) 稳定性。
基本表的结构是相对稳定的,表中的记录是要长期保存的。
理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。
4. 范式标准基本表及其字段之间的关系, 应尽量满足第三范式。
但是,满足第三范式的数据库设计,往往不是最好的设计。
为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。
〖例2〗:有一张存放商品的基本表,如表1所示。
“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。
数据库设计的基本步骤(1)需求分析阶段:需求收集和分析,得到数据字典和数据流图。
(2)概念结构设计阶段:对用户需求综合、归纳与抽象,形成概念模型,用E-R图表示。
(3)逻辑结构设计阶段:将概念结构转换为某个DBMS所支持的数据模型。
(4)数据库物理设计阶段:为逻辑数据模型选取一个最适合应用环境的物理结构。
(5)数据库实施阶段:建立数据库,编制与调试应用程序,组织数据入库,程序试运行。
(6)数据库运行和维护阶段:对数据库系统进行评价、调整与修改。
1 数据库设计概述数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据。
数据库设计的基本步骤:∙需求分析∙概念结构设计∙逻辑结构设计∙物理结构设计∙数据库的建立和测试∙数据库运行和维护。
数据库各阶段设计描述2 概念结构设计在早期的数据库设计,在需求分析阶段后,就直接进行逻辑结构设计。
由于此时既要考虑现实世界信息的联系与特征,又要满足特定的数据库系统的约束要求,因而对于客观世界的描述受到一定的限制。
同时,由于设计时要同时考虑多方面的问题,也使设计工作变得十分复杂。
1976年P.P.S.Chen提出在逻辑结构设计之前先设计一个概念模型,并提出了数据库设计的实体--联系方法(Entity--Relationship Approach)。
这种方法不包括深的理论,但提供了一个简便、有效的方法,目前成为数据库设计中通用的工具。
有许多商业软件支持E-R模型,如Sybase公司的PowerDesigner DataArchitect(最新版本v9.5.1 for Windows)、微软公司Microsoft InfoModeler (VisioModeler)等。
图 S-designer DataArchitect 5.1 设计的E-R模型使用E-R模型来进行概念模型的设计通常分两步进行,首先是建立局部概念模型,然后综合局部概念模型,成为全局概念模型。
如何定义数据库表之间的关系特别说明数据库的正规化是关系型数据库理论的基础。
随着数据库的正规化工作的完成,数据库中的各个数据表中的数据关系也就建立起来了。
在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据表中。
一旦完成了对这些数据元素的分类,对于数据的操作将依赖于这些数据表之间的关系,通过这些数据表之间的关系,就可以将这些数据通过某种有意义的方式联系在一起。
例如,如果你不知道哪个用户下了订单,那么单独的订单信息是没有任何用处的。
但是,你没有必要在同一个数据表中同时存储顾客和订单信息。
你可以在两个关系数据表中分别存储顾客信息和订单信息,然后使用两个数据表之间的关系,可以同时查看数据表中每个订单以及其相关的客户信息。
如果正规化的数据表是关系型数据库的基础的话,那么这些数据表之间的关系则是建立这些基础的基石。
出发点下面的数据将要用在本文的例子中,用他们来说明如何定义数据库表之间的关系。
通过Boyce-Codd Normal Form(BCNF)对数据进行正规化后,产生了七个关系表:Books: {Title*, ISBN, Price}Authors: {FirstName*, LastName*}ZIPCodes: {ZIPCode*}Categories: {Category*, Description}Publishers: {Publisher*}States: {State*}Cities: {City*}现在所需要做的工作就是说明如何在这些表之间建立关系。
关系类型在家中,你与其他的成员一起存在着许多关系。
例如,你和你的母亲是有关系的,你只有一位母亲,但是你母亲可能会有好几个孩子。
你和你的兄弟姐妹是有关系的——你可能有很多兄弟和姐妹,同样,他们也有很多兄弟和姐妹。
如果你已经结婚了,你和你的配偶都有一个配偶——这是相互的——但是一次只能有一个。
在数据表这一级,数据库关系和上面所描述现象中的联系非常相似。
有三种不同类型的关系:一对一:在这种关系中,关系表的每一边都只能存在一个记录。
每个数据表中的关键字在对应的关系表中只能存在一个记录或者没有对应的记录。
这种关系和一对配偶之间的关系非常相似——要么你已经结婚,你和你的配偶只能有一个配偶,要么你没有结婚没有配偶。
大多数的一对一的关系都是某种商业规则约束的结果,而不是按照数据的自然属性来得到的。
如果没有这些规则的约束,你通常可以把两个数据表合并进一个数据表,而且不会打破任何规范化的规则。
一对多:主键数据表中只能含有一个记录,而在其关系表中这条记录可以与一个或者多个记录相关,也可以没有记录与之相关。
这种关系类似于你和你的父母之间的关系。
你只有一位母亲,但是你母亲可以有几个孩子。
多对多:两个数据表里的每条记录都可以和另一个数据表里任意数量的记录(或者没有记录)相关。
例如,如果你有多个兄弟姐妹,这对你的兄弟姐妹也是一样(有多个兄弟姐妹),多对多这种关系需要引入第三个数据表,这种数据表称为联系表或者连接表,因为关系型系统不能直接实现这种关系。
建立关系在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉。
只有在熟悉数据之后,关联会比你刚开始的时候更明显。
你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系。
如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录。
例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从“Books”和“Authors”这两个数据表中查找相关的匹配值。
需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的。
进行匹配的值都是主键和外键的值。
(关系模型不要求一个关系必须对应的使用一个主键来确定。
你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准。
)主键(primary key)唯一的识别表中的每个记录。
而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中。
同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键。
唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同。
但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在SQL服务器系统中访问Identity和AutoNumber)之间建立关系。
此外,外键的值可以是空(Null),尽管强烈建议在没有特别原因的情况下,不要让外键为空。
你有可能永远都不会有机会来使用需要这项功能的数据库。
现在回到我们的示例关系表,并开始输入合适的外键。
(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早。
要知道在纸上纠正错误要容易得多。
)要记住,你正在把主键的值添加到关系表里。
只要调用实体之间的关系就行了,而其他的就简单了:书籍和分类是有关系的。
书籍和出版社是有关系的。
书籍和作者是有关系的。
作者和邮政编码(ZIP)是有关系的。
邮政编码和城市是有关系的。
城市和州是有关系的。
这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些。
在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键。
但是,在你继续规范化剩余数据的时候,外键常常会发生改变。
你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高。
操作数据表现在让我们一次操作一个数据表,就从Books数据表开始,它在这个时候只有三个字段。
很明显,Authors、Categories和Publishers数据表的主键会被添加到Books里。
当你完成的时候,Books数据表就有了七个字段:BooksTitle (PK)ISBN (PK)PriceFirstNameFK (FK) Authors.FirstName many-to-manyLastNameFK (FK) stName many-to-manyCategoryFK (FK) Categories.Category many-to-manyPublisherFK (FK) Publishers.Publisher one-to-many要记住,Authors数据表里的主键是一个基于姓和名两个字段的复合关键字。
所以你必须要把这个两个字段都添加到Books数据表里。
要注意,外键字段名的结尾包含有FK这个后缀。
加入这个后缀有助于提高可读性和自我归档。
通过名称这种方式来区别外键会使得追踪它们更简单。
如果主键和外键的名称不同,这没有关系。
这里出现了三种关系:Books和Authors、Books和Categories,以及Books和Publishers。
这三种关系中所存在的两种问题可能没有那么明显:Books和Authors之间的关系:一本书可以有多个作者。
Books和Categories之间的关系:一本书可以被归入多个类。
这两者的关系是多对多的关系。
先前我告诉过你,数据表不能直接实现这样的关系,而需要第三个联系表来实现。
(Books和Publishers的关系是一对多的关系,就像现在所说的,这样是没有问题的。
)这两个新发现的多对多关系将需要一个联系表来包含来自每个数据表的主键,并将其作为外键。
新的联系表是:BooksAuthorsmmlinkTitleFK (FK) Books.Title one-to-manyISBNFK (FK) Books.ISBN one-to-manyFirstNameFK (FK) Authors.FirstName one-to-manyLastNameFK (FK) stName one-to-manyBooksCategoriesmmlinkTitleFK (FK) Books.Title one-to-manyISBNFK (FK) Books.ISBN one-to-manyCategoryFK (FK) Categories.Category one-to-many没有必要更改Categories、Authors或者Publishers数据表。
但是,你必须把FirstNameFK、LastNameFK和CategoryFK这三个外键从Books里移走:BooksTitle (PK)ISBN (PK)PricePublisherFK (FK) Publishers.Publisher one-to-many现在,让我们转到Authors数据表上来,它现在有两个字段。
每个作者都和ZIPCodes数据表中的邮政编码的值相关。
但是,每个邮政编码会和多个作者相关。
要实现这种一对多的关系,就要把ZIPCodes数据表中的主键添加进Authors数据表作为外键:AuthorsFirstName (PK)LastName (PK)ZIPCodeFK (FK) ZIPCodes.ZIPCode one-to-many至此,你已经准备好了处理剩下的地址部分了。
看到它们被分在不同的数据表里是很让人奇怪的,但是这是遵照BCNF正确规范化数据的结果。
每个邮政编码的值只会有一个对应的城市值和州值。
每个城市和州的值只会被输入进其对应的数据表里一次。
ZIPCodes和Cities数据表需要外键字段来实现这些关系:ZIPCodesZIPCode (PK)CityFK (FK) Cities.City one-to-manyCitiesCity (PK)StateFK (FK) States.State one-to-manyStatesState (PK)从一个到九个最后,你有了九个数据表:Books、Authors、Categories、Publishers、ZIPCodes、Cities、States、BooksAuthorsmmlink和BooksCategoriesmmlink。
图A是这个示例数据表的数据库最终的图形形式。
很难想像一个简单的数据表会被分成九个数据表。
图A最初的一个数据表现在需要九个数据表了由于这个示例数据库很简单,你可能会问这些关系有什么作用。
看起来仍在保存冗余的数据,只不过形式不同罢了——通过外键来实现。
这是因为我们的数据表现在只有很少几个字段。
试想一下有十几个字段的数据表,会是什么样的一个情形。
需要承认的是,你仍然需要把数据表的主键作为外键保存进关系表里,但是至多可能最多增加一到两个字段。
比较一下为这个数据表里的每一条记录都添加十几个条目的情形吧。
(。