`
kang275284
  • 浏览: 163167 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何定义数据库表之间的关系

阅读更多
下面的数据将要用在本文的例子中,用他们来说明如何定义数据库表之间的关系。通过Boyce-Codd Normal Form(BCNF)对数据进行正规化后,产生了七个关系表:

Books: {Title*, ISBN, Price}

Authors: {FirstName*, LastName*}

ZIPCodes: {ZIPCode*}

Categories: {Category*, Description}

Publishers: {Publisher*}

States: {State*}

Cities: {City*}

 现在所需要做的工作就是说明如何在这些表之间建立关系。

 关系类型

  在家中,你与其他的成员一起存在着许多关系。例如,你和你的母亲是有关系的,你只有一位母亲,但是你母亲可能会有好几个孩子。你和你的兄弟姐妹是有关系的——你可能有很多兄弟和姐妹,同样,他们也有很多兄弟和姐妹。如果你已经结婚了,你和你的配偶都有一个配偶——这是相互的——但是一次只能有一个。在数据表这一级,数据库关系和上面所描述现象中的联系非常相似。有三种不同类型的关系:

 一对多:主键数据表中只能含有一个记录,而在其关系表中这条记录可以与一个或者多个记录相关,也可以没有记录与之相关。这种关系类似于你和你的父母之间的关系。你只有一位母亲,但是你母亲可以有几个孩子。

多对多:两个数据表里的每条记录都可以和另一个数据表里任意数量的记录(或者没有记录)相关。例如,如果你有多个兄弟姐妹,这对你的兄弟姐妹也是一样(有多个兄弟姐妹),多对多这种关系需要引入第三个数据表,这种数据表称为联系表或者连接表,因为关系型系统不能直接实现这种关系。

[Page: ]



 建立关系

  在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉。只有在熟悉数据之后,关联会比你刚开始的时候更明显。你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系。如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录。例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从“Books”和“Authors”这两个数据表中查找相关的匹配值。需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的。

 进行匹配的值都是主键和外键的值。(关系模型不要求一个关系必须对应的使用一个主键来确定。你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准。)主键(primary key)唯一的识别表中的每个记录。而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中。同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键。

 唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同。但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在SQL服务器系统中访问Identity和AutoNumber)之间建立关系。此外,外键的值可以是空(Null),尽管强烈建议在没有特别原因的情况下,不要让外键为空。你有可能永远都不会有机会来使用需要这项功能的数据库。

 现在回到我们的示例关系表,并开始输入合适的外键。(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早。要知道在纸上纠正错误要容易得多。)要记住,你正在把主键的值添加到关系表里。只要调用实体之间的关系就行了,而其他的就简单了:

 书籍和分类是有关系的。 
书籍和出版社是有关系的。

  书籍和作者是有关系的。

  作者和邮政编码(ZIP)是有关系的。

  邮政编码和城市是有关系的。

  城市和州是有关系的。

 这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些。在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键。但是,在你继续规范化剩余数据的时候,外键常常会发生改变。你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高。

 操作数据表

  现在让我们一次操作一个数据表,就从Books数据表开始,它在这个时候只有三个字段。很明显,Authors、Categories和Publishers数据表的主键会被添加到Books里。当你完成的时候,Books数据表就有了七个字段:

Books

Title (PK)

ISBN (PK)

Price

FirstNameFK (FK) Authors.FirstName many-to-many

LastNameFK (FK) Authors.LastName many-to-many

CategoryFK (FK) Categories.Category many-to-many

PublisherFK (FK) Publishers.Publisher one-to-many



[Page: ]

 要记住,Authors数据表里的主键是一个基于姓和名两个字段的复合关键字。所以你必须要把这个两个字段都添加到Books数据表里。要注意,外键字段名的结尾包含有FK这个后缀。加入这个后缀有助于提高可读性和自我归档。通过名称这种方式来区别外键会使得追踪它们更简单。如果主键和外键的名称不同,这没有关系。

 这里出现了三种关系:Books和Authors、Books和Categories,以及Books和Publishers。这三种关系中所存在的两种问题可能没有那么明显:

 Books和Authors之间的关系:一本书可以有多个作者。

  Books和Categories之间的关系:一本书可以被归入多个类。

 这两者的关系是多对多的关系。先前我告诉过你,数据表不能直接实现这样的关系,而需要第三个联系表来实现。(Books和Publishers的关系是一对多的关系,就像现在所说的,这样是没有问题的。) 

这两个新发现的多对多关系将需要一个联系表来包含来自每个数据表的主键,并将其作为外键。新的联系表是:

BooksAuthorsmmlink

TitleFK (FK) Books.Title one-to-many

ISBNFK (FK) Books.ISBN one-to-many

FirstNameFK (FK) Authors.FirstName one-to-many

LastNameFK (FK) Authors.LastName one-to-many


BooksCategoriesmmlink

TitleFK (FK) Books.Title one-to-many

ISBNFK (FK) Books.ISBN one-to-many

CategoryFK (FK) Categories.Category one-to-many
 没有必要更改Categories、Authors或者Publishers数据表。但是,你必须把FirstNameFK、LastNameFK和CategoryFK这三个外键从Books里移走:

Books

Title (PK)

ISBN (PK)

Price

PublisherFK (FK) Publishers.Publisher one-to-many
 现在,让我们转到Authors数据表上来,它现在有两个字段。每个作者都和ZIPCodes数据表中的邮政编码的值相关。但是,每个邮政编码会和多个作者相关。要实现这种一对多的关系,就要把ZIPCodes数据表中的主键添加进Authors数据表作为外键:

Authors

FirstName (PK)

LastName (PK)

ZIPCodeFK (FK) ZIPCodes.ZIPCode one-to-many


[Page: ]

 至此,你已经准备好了处理剩下的地址部分了。看到它们被分在不同的数据表里是很让人奇怪的,但是这是遵照BCNF正确规范化数据的结果。每个邮政编码的值只会有一个对应的城市值和州值。每个城市和州的值只会被输入进其对应的数据表里一次。ZIPCodes和Cities数据表需要外键字段来实现这些关系: 
 ZIPCode (PK)

CityFK (FK) Cities.City one-to-many

Cities

City (PK)

StateFK (FK) States.State one-to-many

States

State (PK)

 从一个到九个

  最后,你有了九个数据表:Books、Authors、Categories、Publishers、ZIPCodes、Cities、States、BooksAuthorsmmlink和BooksCategoriesmmlink。图A是这个示例数据表的数据库最终的图形形式。很难想像一个简单的数据表会被分成九个数据表。

图A



  最初的一个数据表现在需要九个数据表了

  由于这个示例数据库很简单,你可能会问这些关系有什么作用。看起来仍在保存冗余的数据,只不过形式不同罢了——通过外键来实现。这是因为我们的数据表现在只有很少几个字段。试想一下有十几个字段的数据表,会是什么样的一个情形。需要承认的是,你仍然需要把数据表的主键作为外键保存进关系表里,但是至多可能最多增加一到两个字段。比较一下为这个数据表里的每一条记录都添加十几个条目的情形吧。

分享到:
评论

相关推荐

    数据库定义表之间关系(带图).docx

    数据库定义表之间关系(带图).docx

    【实验报告】 数据库的定义与单表查询

    【实验一 数据库的定义与单表查询】 【背景】设计一个简单的图书管理系统,该系统中包括:  图书信息:书号,书名,类别,出版社,作者,定价,备注;  读者信息:读者编号,姓名,单位,性别,电话; 出版社信息...

    对象数据库系统与关系数据库间特性解析

    我们将对象数据库管理系统定义为一个集成了数据库能力与面向对象编程语言能力的数据库管理系统,ODBMS使数据库对象看起来像是已有的一个或多个程序设计语言中的程序设计语言以象。ODBMS在多用户客户机/服务器环境中...

    数据库关系代数数据库原理.pdf

    教学时间:2学时 教学过程: 2 本讲主要讲述: 关系模型的数据结构 关系的定义和性质 关系数据库的基本概念 3 4.1 关系模型 关系模型就是用二维表格结构来表示实体及实体之间 联系的模型。 关系模型是各个关系的框架...

    试简述数据、数据库、数据库管理系统、数据库系统的关系。.pdf

    数据库管理系统是位于⽤户与操作系统之间,具有数据定义、管理和操纵功能的软件集合。 数据库系统是⽀持数据库得以运⾏的基础性的系统,即整个计算机系统。 试述关系模型的要素 关系数据结构:⼆维表称关系,表中的...

    神通数据库-数据库快速入门.pdf

    使用数据库创建应用程序时,过程语言是应用程序和数据库之间的主要编程接口。神通数据库中所提 供的过程语言是 plOSCAR。在使用 plOSCAR 程序时,可用两种方法存储和执行程序。可以在本地存储程 序,并创建向数据库...

    关系型数据库管理系统.pdf

    关系型数据库管理系统 关系型数据库管理系统 1.关系型数据库管理系统的介绍 数据库管理系统(英⽂全拼...数据控制语⾔,进⾏授权与权限回收,如grant,revoke DDL:数据定义语⾔,进⾏数据库,表的管理等,如creat,drop

    [详细完整版]关系数据库.pptx

    这些表存在约束,相互之间定义了关系。关系数据库使用SQL进行查询,结果集通过访问一个或多个表的查询生成。单个查询里被访问到的多个表,一般是利用在表关系列里定义的范式被"连接"到一起的。 规范化 是关系...

    adonisx:通过定义数据库模型及其关系来创建Rest API的最快方法

    通过仅定义数据库模型及其之间的关系, AdonisX是创建Rest API的最快方法。 它基于,是一个很棒的ORM库 。 AdonisX可以利用AdonisJs的力量并加快速度! 它分析模型及其关系,并自动创建所有Rest API路由。 您将能够...

    数据库表结构设计.doc

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基 本情况表、社会关系表、工作简历表。这就是"一张原始单证对应多个实体"的典型例子 。 2. 主键与外键 一般而言,一个实体不能既无主键...

    VB数据库编程.doc

    所谓关系数据 库就是将数据表示为表的集合,通过建立简单表之间的关系来定义结构的一种数据库。 不管表在数据库文件中的物理存储方式如何,它都可以看作一组行和列,与电子表 格的行和列类似。在关系数据库中,行被...

    空间数据库技术应用:关系数据库标准语言SQL.pptx

    SQL是一种介于关系代数和关系演算之间的结构化查询语言,主要功能包括:数据定义、数据查询、数据更新、数据控制。 SQL是一种综合的、通用的、功能极强的关系数据库标准语言。; SQL可以对数据库中的两种基本数据...

    数据库行业报告:国产数据库市场

    关系型数据库是指采用关系模型来组织数据的数据库,以行和列组成二维表的形式存储 数据,由二维表及其各表之间的联系组成数据库。关系型数据库优点是:通用的 SQL 语言 使得操作关系型数据库非常方便;丰富的完整性...

    论文研究-通用映射模式下GML关系数据库存储研究.pdf

    提出了一种将GML文档存储到关系数据库的存储映射模型G2RDB,通过解析GML文档,提取文档的要素信息、空间对象信息和嵌套关系等,根据预先定义的映射规则和要素模型的映射关系表,形成GML数据文档与关系数据库之间的...

    图书馆数据库管理系统

    设计一个图书馆管理系统的数据库,至少包含读者类型、读者信息、图书类型、图书信息、书架、出版社、图书罚款、图书归还、图书借阅和图书征订等表,并定义各表之间的关系以及相关的完整性约束; 设计不同的角色,...

    VFP数据库系统Visual-FoxPro数据库和表的高级应用.pdf

    打开多个数据库 打开一个数据库后,表和表之间的关系就由存储在该数据库中 的信息来控制。您可以同时打开多个数据库。例如,在运行多个 应用程序时,可以使用多个打开的数据库,每个应用程序都以不 同的数据库为...

    数据库学习基础之名词解释

    Sybase提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的...

    什么是NoSQL数据库?

    原本关系型数据库就是以JOIN为前提的,就是说,各个数据之间存在关联是关系型数据库得名的主要原因。为了进行JOIN处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散。相反,NoSQL数据库原本...

    数据库设计--驿站超市

    数据库课程设计报告--小型超市管理系统,通过此次数据库的课程设计,真正达到了学与用的结合,增强了对...其中包括,插入、删除、修改、查询,牵涉表和表之间的联系,主键与外主键的定义,约束项的设置,使逻辑更严密。

    达梦数据库_SQL语言手册

    语言是一种介于关系代数与关系演算之间的语言,其功能主要包括数据定义、查询 操纵和控制四个方面,通过各种不同的语句米实现。按照所实现的功能, 语句分 为以下几种 数据库、登录、用户、模式、基表、视图、索引...

Global site tag (gtag.js) - Google Analytics