跳转到内容

数据库基础:关系型数据库

来自 Wikibooks,开放世界中的开放书籍


试卷 2 - ⇑ 数据库基础 ⇑

← 概念数据模型和实体关系建模 关系型数据库 数据库设计和规范化技术 →


什么是关系型数据库?

[编辑 | 编辑源代码]

关系型数据库是一种存储数据的方法,我们根据特定的结构对数据进行划分,这些结构之间存在着联系。

想象一下,一个关系型数据库被兽医使用。数据将被划分成,每个表代表一个实体或“事物”。

实体 - 项目的类别,例如动物、客户


兽医护理的所有动物的详细信息将存储在动物表中,兽医使用的不同药物的详细信息将存储在药物表中,等等。

数据库还对实体之间的关系进行建模。在兽医示例中,我们有客户动物的表。每个客户可能拥有一个(或多个)动物,每个动物属于一个客户,因此这两个表中的记录之间存在联系。

- 存储有关给定实体的所有数据的结构,即表是在数据库中表示实体的方式


表由列和行组成,可以想象成与我们想象的电子表格相同格式。


练习:选择表

列出存储有关足球联赛的数据库可能需要的表

答案

Team
Player
Match
Stadium
Referee

列出记录在线商店详细信息可能需要的表

答案

Staff
Products
Receipts
Customers


每列代表一个属性,它是我们想要存储有关此特定表所代表的实体的数据的标记元素。以下是一些实体和这些实体可能具有的属性示例

Animal: Name, Weight, IsNeutered
Customer: First name, Last name, Address, Post code

创建表时,将指定每个属性的数据类型。这允许数据库软件分配足够的内存来存储任何可能输入的数据,以及使其能够对数据执行类型检查。例如,在我们的动物表中,我们可能有以下属性

属性 数据类型
名称 文本
重量 实数
是否绝育 布尔值

表中的每一行代表一个实体的单个实例,称为记录。例如,在动物表中,我们可能有丘巴卡犬、塔比莎猫和珀西鱼的行,它们都是动物的实例。

名称 重量 动物类型 ...
丘巴卡 8
塔比莎 3
珀西 0.25
练习:选择属性

对于社交网站,您会在人员表中包含哪些属性和数据类型

答案

Name: string
Date of Birth: Date
Gender: string (character might also work here)
Public profile: boolean
Personal description: String

对于社交网站,您会在关系表(存储“朋友”、“姐妹”、“父亲”等的表)中包含哪些属性和数据类型

答案

Person1 ID: integer
Person2 ID: integer
Type of relationship: string
Date created: Date


关系型数据库中的每个记录都必须有自己的唯一主键 (PK) 属性,它提供了一种在整个表中的所有记录中识别特定记录的方法。

主键 (PK) - 唯一标识数据库表中记录的属性。


必须仔细选择键属性,以确保它真正唯一。例如,我们不能选择属性“名称”作为我们动物表的主键,因为极有可能两只带到兽医处的动物会有相同的名称。

确保唯一主键字段的一种常见方法是允许数据库软件在添加新记录时自动生成下一个整数序列。主键属性通常命名为<TableName>ID(在本例中为Animal_ID),虽然这不是强制性的。

Animal_ID 名称 重量 动物类型 ...
1 丘巴卡 8
2 塔比莎 3
3 珀西 0.25

在速记中编写表设计时,主键字段通常写在最前面并带下划线

TableName(PrimaryKey, Attribute, Attribute, Attribute, Attribute)
Animal(Animal_ID, Name, Weight, TypeOfAnimal)

或者,在实体关系图中,主键可以由 * 表示

Animal_ID*
Name
Weight
TypeOfAnimal

示例:选择主键

让我们看一个犯罪表中的示例

表:犯罪
属性
国民保险号码:字符串
姓名:字符串
出生日期:日期
伤疤数量:整数
家乡:字符串

这些数据项中的哪一项是唯一的?

属性 唯一 原因
家乡 你可能会有多个住在同一个城镇的罪犯
伤疤数量 你可能会有两个有相同伤疤数量的罪犯
出生日期 你可能会有两个出生在同一天的罪犯,或者 双胞胎都是罪犯
名称 你可能会有两个同名的罪犯。例如 约翰·史密斯约翰·史密斯
国民保险号码 这对每个人来说都是唯一的

然后我们可以将表写成

Criminal(NI Number, Name, Date of Birth, Number of scars, Home town)

组合主键

[编辑 | 编辑源代码]

有时,多个属性组合在一起用作键,而不是单个属性。只有在属性组合在一起时才能保证唯一性。例如,在有关酒店预订的表中,可以通过组合房间号属性和住宿开始日期属性来创建组合键。不可能对同一房间在同一天进行两次不同的预订,因此该组合键唯一标识每个记录。

房间号 开始日期 客人数量
8 2016 年 4 月 24 日 2
2 2016 年 5 月 12 日 1
8 2016 年 7 月 6 日 2

房间号本身不足以用作唯一标识符,因为有很多预订是针对同一个房间的。开始日期本身也不足以用作唯一标识符,因为有很多预订是在同一天开始的。


示例:选择组合键

看一下这个有关房子的示例

表:房屋
编号:整数
道路:字符串
颜色:字符串
邮政编码:字符串
属性 唯一 原因
编号 你可能在伦敦路和曼彻斯特路都有一个 61 号
道路 你可能在同一条路上有多栋房子
颜色 不止一栋房子可能是绿色的
邮政编码 多栋房子可能拥有相同的邮政编码

我们可以创建一个主键,但如果你仔细观察,我们可以使用多个属性的组合。房屋编号和道路名称组合在一起似乎是唯一的。你不可能有两栋 45 号贝尔蒙特街,对吧?

房屋(编号, 道路, 颜色, 邮政编码)

听起来可以吗?如果我们存储关于全国所有城镇的数据,并且曼彻斯特有一个 5 号伦敦路,温彻斯特也有一个 5 号伦敦路。这意味着组合不是唯一的。我们可以尝试使用房屋编号和邮政编码,这种组合总是唯一的,这就是我们的组合键

房屋(编号, 道路, 颜色, 邮政编码)


练习:键

在以下表属性中找出主键,并写出表设计

表:汽车
登记号码:字符串
颜色:字符串
车门数量:整数
敞篷车:布尔值

答案

Car(Registration number, Colour, Number of doors, Convertible)

在以下表属性中找出主键

表:学生记录
姓名:字符串
唯一学习者编号:整数
出生日期:日期
手机号码:整数

答案

Student(Unique Learner Number, Name, Date of Birth, Mobile number

不是手机号码,因为他们可能与其他人共用一部手机。

在适用的情况下,使用组合键、主键重新编写表描述,或为以下表添加主键
收据(客户ID, 日期时间, 总计, 员工ID)

答案

收据(客户ID, 日期时间, 总计, 员工ID)

Match(TeamA, TeamB, Date, TeamAScore, TeamBScore, RefID)

答案

Match(TeamA, TeamB, Date, TeamAScore, TeamBScore, RefID)

Phone(ModelID, Colour, Weight, Internet)

答案

Phone(ModelID, Colour, Weight, Internet)

你可能会争辩说,如果这是针对特定手机实例而不是手机型号,则需要通过序列号等引入唯一值

Cat(Colour, Weight, NumberofLegs, Name)

答案

这里没有足够的字段让我们找到一个唯一的字段或组合。 我们可能有两个叫做Phil的体重为1公斤、有三条腿的姜黄色猫。 因此,我们需要引入一个新的唯一值,CatID Cat(CatID, Colour, Weight, NumberofLegs, Name)

外键

[edit | edit source]
外键 (FK) - 表中的一个字段,对应于另一个表的主键字段


外键用于将表链接在一起并在表之间交叉引用。 例如,这是我们兽医示例中的Animal表,添加了Owner_ID外键

Animal_ID 名称 重量 动物类型 Owner_ID ...
1 丘巴卡 8 2
2 塔比莎 3 2
3 珀西 0.25 6

Owner_IDAnimal表中的外键,因为它也是Owner表中的主键

外键可用于查找所有者的任何其他属性,因为它对应于Owner表中的Owner_ID,它是主键,因此保证引用其中的一条记录。

华夏公益教科书