数据库基础:关系型数据库
关系型数据库是一种存储数据的方法,我们根据特定的结构对数据进行划分,这些结构之间存在着联系。
想象一下,一个关系型数据库被兽医使用。数据将被划分成表,每个表代表一个实体或“事物”。
兽医护理的所有动物的详细信息将存储在动物表中,兽医使用的不同药物的详细信息将存储在药物表中,等等。
数据库还对实体之间的关系进行建模。在兽医示例中,我们有客户和动物的表。每个客户可能拥有一个(或多个)动物,每个动物属于一个客户,因此这两个表中的记录之间存在联系。
表由列和行组成,可以想象成与我们想象的电子表格相同格式。
练习:选择表 列出存储有关足球联赛的数据库可能需要的表 答案 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) 属性,它提供了一种在整个表中的所有记录中识别特定记录的方法。
必须仔细选择键属性,以确保它真正唯一。例如,我们不能选择属性“名称”作为我们动物表的主键,因为极有可能两只带到兽医处的动物会有相同的名称。
确保唯一主键字段的一种常见方法是允许数据库软件在添加新记录时自动生成下一个整数序列。主键属性通常命名为<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 |
房间号本身不足以用作唯一标识符,因为有很多预订是针对同一个房间的。开始日期本身也不足以用作唯一标识符,因为有很多预订是在同一天开始的。
示例:选择组合键 看一下这个有关房子的示例
我们可以创建一个主键,但如果你仔细观察,我们可以使用多个属性的组合。房屋编号和道路名称组合在一起似乎是唯一的。你不可能有两栋 45 号贝尔蒙特街,对吧?
听起来可以吗?如果我们存储关于全国所有城镇的数据,并且曼彻斯特有一个 5 号伦敦路,温彻斯特也有一个 5 号伦敦路。这意味着组合不是唯一的。我们可以尝试使用房屋编号和邮政编码,这种组合总是唯一的,这就是我们的组合键
|
练习:键 在以下表属性中找出主键,并写出表设计
答案 Car(Registration number, Colour, Number of doors, Convertible) 在以下表属性中找出主键
答案 Student(Unique Learner Number, Name, Date of Birth, Mobile number 不是手机号码,因为他们可能与其他人共用一部手机。 在适用的情况下,使用组合键、主键重新编写表描述,或为以下表添加主键 答案 收据(客户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]
外键用于将表链接在一起并在表之间交叉引用。 例如,这是我们兽医示例中的Animal表,添加了Owner_ID的外键
Animal_ID | 名称 | 重量 | 动物类型 | Owner_ID | ... |
---|---|---|---|---|---|
1 | 丘巴卡 | 8 | 狗 | 2 | |
2 | 塔比莎 | 3 | 猫 | 2 | |
3 | 珀西 | 0.25 | 鱼 | 6 |
Owner_ID是Animal表中的外键,因为它也是Owner表中的主键。
外键可用于查找所有者的任何其他属性,因为它对应于Owner表中的Owner_ID,它是主键,因此保证引用其中的一条记录。