`
kang275284
  • 浏览: 166932 次
  • 性别: 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

    数据库定义表之间关系 数据库定义表之间关系是关系型数据库理论的基础。关系型数据库理论的基础是将数据元素如何分配到各个关系数据表中,并建立这些数据表之间的关系。关系型数据库的正规化是将数据元素如何分配到...

    数据库设计,讲解业务实体对象到数据库表的映射关系。

    ### 数据库设计与业务实体对象到数据库表的映射关系 #### 一、数据库设计概述 数据库设计是在软件工程和信息系统领域中一个重要的环节,它涉及到如何有效地组织数据以满足特定业务需求。良好的数据库设计不仅能...

    从UML类图到关系数据库表的代码生成方法

    类图和关系数据库表之间存在着自然的对应关系,通过对UML类图的理解,可以自动生成对应的关系数据库表结构,从而提高开发效率,减少重复劳动,确保数据库设计的一致性和准确性。 一、UML类图基础知识点 UML类图...

    泛微Ecology 9 最新数据库表结构

    - 数据库表结构是数据库设计的核心,它定义了各个表之间的关系,以及表中的字段类型、长度、约束等属性。在泛微Ecology 9中,这些表结构支撑着系统的用户管理、流程管理、文档管理、权限控制等多个模块。 2. **E9...

    数据表的关联关系图-父表与子表的关联关系

    在数据库设计中,数据表之间的关联关系是至关重要的,它定义了不同表之间的逻辑联系,使得数据能够有效地组织和查询。本话题主要讨论的是“数据表的关联关系图”,特别是父表与子表的关联关系,涉及到的核心概念包括...

    速达5000数据库表结构物理模型

    "SD5000物理模型.pdm"文件就是速达5000数据库的物理模型,通过PowerDesigner打开,我们可以清晰地看到各个表的定义、字段类型、索引以及表间的关联。 1. **表结构分析**: - **基础表**:通常包括客户表、供应商表...

    asp.net mvc 关系数据库表之间的映射

    下面我们将详细讨论如何在ASP.NET MVC中进行数据库表之间的映射。 首先,我们来看一对多关系的例子。在描述中提到的`Product`和`Category`类展示了这种关系。`Product`类有一个`Category`属性,表示一个产品属于一...

    数据库表设计工具

    - 主键和外键:主键用于唯一标识表中的每条记录,外键则建立了不同表之间的关系,支持数据库的完整性。 - 索引设计:通过添加索引,可以提高数据查询的性能,特别是对经常查询的字段。 - 规范化:遵循一定的规范...

    关系型数据库和非关系型数据库.pdf

    MongoDB 是一种非关系型数据库,基于文档的存储,是介于关系数据库和非关系数据库之间的产品。 MongoDB 的特点包括: 1. MongoDB 支持的数据结构非常松散,是类似 json 的 bjson 格式。 2. MongoDB 的模式自由...

    数据库表映射成实体类

    以Hibernate为例,我们在Hibernate配置文件中定义每个JavaBean与数据库表的关系,然后在Java代码中就可以直接操作对象,而无需关心底层的SQL。比如,要获取`User`表中的所有记录,只需执行查询,Hibernate会自动处理...

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

    实验的目的在于让学习者深入理解数据库的基本概念,特别是如何在DBMS中使用SQL语言定义数据库、表、主键和外键。同时,通过熟悉不同的数据类型,确保关系表中的属性能够合理地被定义。此外,这个实验也强调了输入...

    文档型数据库与关系型数据库的比较_陈婕.pdf

    根据提供的文件信息,本文将详细探讨文档型数据库与关系型数据库之间的差异,并分析这两种数据库的特点及应用场景。 ### 文档型数据库与关系型数据库的比较 #### 1. 文档型数据库的概念 文档型数据库是一种非关系...

    两个数据库表结构比较(C#)

    表结构比较的目标是找出两个数据库之间的差异,这可能涉及到表的增删改,或者字段属性的变更,如字段类型、长度、是否允许空值等。 描述中提到的“第一个数据库中有而第二个没有”,这可能意味着在一个数据库中存在...

    关系数据库教案.doc

    在数据模型部分,课程讲解了现实世界、信息世界和计算机世界之间的抽象和转换,以及实体-关系(E-R)模型,包括实体、属性、联系等概念,并教授如何绘制E-R图。 在关系数据库章节,课程详细阐述了关系模型的数据...

    数据库管理系统 1.数据库(DB),数据库系统(DBS)和数据库管理系统(DBMS)之间的关系是( )。

    SQL 语言是关系数据库管理系统中最常用的语言,SQL 语言集数据查询、数据操纵、数据定义和数据控制功能于一体。SQL 语言中,CREATE、DROP、ALTER 语句是实现数据定义功能的。 在 Access 中,查询的数据源可以是表、...

    数据库表

    ER图是数据库设计中常用的一种图形表示法,它用图形化的方式展示了各表之间的关系、主键和外键,使得设计者和开发者能直观理解数据库的结构。 在数据库的实际应用中,表的优化也是不可忽视的一环。这包括合理设置...

    关系数据库的结构关系

    实体可以转化为表,实体属性成为表中的列,而实体之间的关系则定义了表间的关联。通过数据建模,可以发现和解决潜在的问题,优化数据库设计,最终创建出高效且易于管理的数据库系统。 例如,对于斯科特的饰品公司,...

    关系数据库、关系演算、关系代数

    1. **关系数据结构**:关系数据库采用单一的数据结构——关系,用来表示现实世界中的实体及其之间的联系。在用户的视角下,数据的逻辑结构表现为一张二维表格。 2. **关系操作集合**:关系数据库支持一系列的操作,...

    我国数据库、实时数据库、关系数据库相互之间的关系和区别.docx

    在20世纪60年代,关系数据库的概念被提出,它利用二维表的形式组织数据,并通过关系代数来定义和操作数据。关系数据库的设计基于数学理论,它能够通过简单的表结构清晰地表达实体之间的复杂关系,并允许对数据进行...

    数据库关系模型介绍

    数据库关系模型是一种数据模型,它使用二维表格结构来表示实体及实体之间的联系。关系模型简单灵活,并有着坚实的理论基础,已成为当前最流行的数据模型。 关系模型的数据结构是基于集合代数理论的,以域和笛卡尔积...

Global site tag (gtag.js) - Google Analytics