• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

什么是关系数据库(傻瓜关系数据库)

Web 应用程序可以分为两个主要部分:

  1. 前端:显示和收集信息

  2. 后端:存储和提供数据供前端使用

由于 Web 应用程序后端涉及存储和检索数据,通常为数千甚至数百万用户,因此数据库自然是主要的后端组件之一。

在本文中,我将解释什么是关系数据库以及如何正确设计数据库来存储应用程序的信息。我还将通过实际示例解释数据库规范化的含义。

数据库以有组织的方式存储数据,以便以后可以搜索和检索。数据库由一个或多个表组成。表格很像电子表格,因为它由行和列组成。所有行都有相同的列,每列都包含数据本身。如果有帮助,请将表格视为 Excel 或 Google 表格中的电子表格。

什么是关系数据库(傻瓜关系数据库)  第1张

数据库的图形表示

可以从表中插入、检索、更新和删除数据。created这个词一般用来代替insert,所以,这四个函数统称为CRUD。

什么是关系数据库?

关系数据库是一种将数据组织成表并根据定义的关系在这些表之间创建链接的数据库。这些关系使您能够通过单个查询从一个或多个表中检索和组合数据。

但是要真正了解关系数据库,您需要自己制作一个!让我们从获取一些我们可以使用的真实数据开始。

1.获取一些数据

让我们从一些 Twitter 数据开始。我在 Twitter 上搜索了#databases  ,并选取了以下十条推文样本:

表格1

全名用户名文本created_at关注用户名
“鲍里斯·哈朱尔”“_DreamLead”“您如何看待#USA 的#emailing #campaigns #traffic?现在这是一个好的市场吗?您有#databases 吗?”“2013 年 2 月 12 日星期二 08:43:09 +0000”“Scootmedia”、“MetiersInternet”
“贡纳尔·斯瓦兰德”“贡纳尔斯瓦兰德”“比尔盖茨谈论数据库,Reddit 上的免费软件 https://t.co/ShX4hZlA #billgates #databases”“2013 年 2 月 12 日星期二 07:31:06 +0000”“klout”,“zillow”
“通用电气软件”“GE软件”“RT @KirkDBorne:#Databases 中的读数:优秀的阅读清单,许多类别:https://t.co/S6RBUNxq,来自 @rxin Fascinating。”“2013 年 2 月 12 日星期二 07:30:24 +0000”“DayJobDoc”、“byosko”
“阿德里安·伯奇”“阿德里安伯奇”“RT @tisakovich:@NimbusData 今天在旧金山举行的@Barclays 大数据会议上谈论#virtualization、#databases 和#flash memory。”“2013 年 2 月 12 日星期二 06:58:22 +0000”“辛迪克劳馥”、“阿让蒂姆”
“安迪·莱德”“安迪莱德5”“http://t.co/D3KOJIvF 关于 Madden 2013 使用 AI 制作超级碗 #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:29:41 +0000”“迈克尔戴尔”、“雅虎”
“安迪·莱德”“安迪莱德5”“http://t.co/rBhBXjma 一篇关于隐私设置和 facebook #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:24:17 +0000”“迈克尔戴尔”、“雅虎”
“布雷特·恩格尔伯特”“布雷特_恩格尔伯特”“#BUS311 明尼苏达大学的 NCFPD 正在创建 #databases 以防止“食品欺诈”。http://t.co/0LsAbKqJ”“2013 年 2 月 12 日星期二 01:49:19 +0000”“RealSkipBayless”、“史蒂芬史密斯”
布雷特·恩格尔伯特“布雷特_恩格尔伯特”“#BUS311 公司可能正在保护他们的生产#databases,但他们的备份文件呢?http://t.co/okJjV3Bm”“2013 年 2 月 12 日星期二 01:31:52 +0000”“RealSkipBayless”、“史蒂芬史密斯”
“雨云数据系统”“雨云数据”“@NimbusData CEO @tisakovich @BarclaysOnline 今天在旧金山举行大数据会议,谈论#virtualization、#databases 和#flash memory”“2013 年 2 月 11 日星期一 23:15:05 +0000”“dlock6”、“rohitkilam”
“SSWUG.ORG”“SSWUGorg”“别忘了在本周五报名参加我们的免费展会:#Databases、#BI 和 #Sharepoint:你需要知道的!http://t.co/Ijrqrz29”“2013 年 2 月 11 日星期一 22:15:37 +0000”“drsql”、“steam_games”

以下是每个列名的含义:

  • full_name: 用户的全名

  • username: 用户的 Twitter 句柄

  • text:推文本身

  • created_at:推文的时间戳

  • following_username:此用户关注的人员列表,以逗号分隔。为简洁起见,我将列表长度限制为两个。

这都是真实数据;您可以搜索 Twitter 并实际找到这些推文。

这很好。数据都在一个地方,所以很容易找到,对吧?不完全是。这张桌子有几个问题。

  • 首先,跨列存在重复数据。username和列是重复的following_username,因为它们都包含相同类型的数据:Twitter 句柄。

  • 其次,列内还有另一种形式的重复following_username。字段应该只包含一个值,但每个following_username字段包含两个。

  • 第三,跨行存在重复数据。@AndyRyder5和@Brett_Englebert各自发了两次推文,因此他们的其余信息已被复制。

重复是有问题的,因为它们使 CRUD 操作更具挑战性。例如,检索数据需要更长的时间,因为时间会浪费在重复的行上。此外,更新数据将是一个问题;如果用户更改了他们的 Twitter 句柄,我们需要找到每个重复项并更新它。

重复数据是个问题。我们可以通过将表 1拆分为单独的表来解决此问题。让我们首先解决跨列重复的问题。

2.删除跨列的重复数据

如上所述,表 1username中的和following_username列是重复的。出现这种重复是因为我试图表达用户之间的关注关系。让我们改进Table 1的设计,将其拆分为两个表:一个仅用于以下关系,另一个用于其余信息。

什么是关系数据库(傻瓜关系数据库)  第2张

跨列拆分重复数据

因为@Brett_Englebert 遵循@RealSkipBayless,所以该following表将通过将@Brett_Englebert 存储为from_user并将@RealSkipBayless存储为 来表达这种关系to_user。让我们继续将表 1 拆分为这两个表:

表 2:following表

from_userto_user
_DreamLead滑板车媒体
_DreamLeadMetiers互联网
贡纳尔·斯瓦兰德影响力
贡纳尔·斯瓦兰德齐洛
GE软件DayJobDoc
GE软件比奥斯科
阿德里安伯奇辛迪克劳馥
阿德里安伯奇阿根廷
安迪莱德迈克尔戴尔
安迪莱德雅虎
Brett_EnglebertRealSkipBayless
Brett_Englebert史蒂芬史密斯
雨云数据戴尔洛克6
雨云数据罗希特基拉姆
SSWUGorgdrsql
SSWUGorgsteam_games

表 3:users表格

全名用户名文本created_at
“鲍里斯·哈朱尔”“_DreamLead”“您如何看待#USA 的#emailing #campaigns #traffic?现在这是一个好的市场吗?您有#databases 吗?”“2013 年 2 月 12 日星期二 08:43:09 +0000”
“贡纳尔·斯瓦兰德”“贡纳尔斯瓦兰德”“比尔盖茨谈论数据库,Reddit 上的免费软件 http://t.co/ShX4hZlA #billgates #databases”“2013 年 2 月 12 日星期二 07:31:06 +0000”
“通用电气软件”“GE软件”“RT @KirkDBorne:#Databases 中的读物:优秀的阅读列表,许多类别:http://t.co/S6RBUNxq,来自@rxin Fascinating。”“2013 年 2 月 12 日星期二 07:30:24 +0000”
“阿德里安·伯奇”“阿德里安伯奇”“RT @tisakovich:@NimbusData 今天在旧金山举行的@Barclays 大数据会议上谈论#virtualization、#databases 和#flash memory。”“2013 年 2 月 12 日星期二 06:58:22 +0000”
“安迪·莱德”“安迪莱德5”“http://t.co/D3KOJIvF 关于 Madden 2013 使用 AI 制作超级碗 #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:29:41 +0000”
“安迪·莱德”“安迪莱德5”“http://t.co/rBhBXjma 一篇关于隐私设置和 facebook #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:24:17 +0000”
“布雷特·恩格尔伯特”“布雷特_恩格尔伯特”“#BUS311 明尼苏达大学的 NCFPD 正在创建 #databases 以防止“食品欺诈”。http://t.co/0LsAbKqJ”“2013 年 2 月 12 日星期二 01:49:19 +0000”
布雷特·恩格尔伯特“布雷特_恩格尔伯特”“#BUS311 公司可能正在保护他们的生产#databases,但他们的备份文件呢?http://t.co/okJjV3Bm”“2013 年 2 月 12 日星期二 01:31:52 +0000”
“雨云数据系统”“雨云数据”“@NimbusData CEO @tisakovich @BarclaysOnline 今天在旧金山举行大数据会议,谈论#virtualization、#databases 和#flash memory”“2013 年 2 月 11 日星期一 23:15:05 +0000”
“SSWUG.ORG”“SSWUGorg”“别忘了在本周五报名参加我们的免费展会:#Databases、#BI 和 #Sharepoint:你需要知道的!http://t.co/Ijrqrz29”“2013 年 2 月 11 日星期一 22:15:37 +0000”

这看起来更好。现在,在users表格中,只有一列带有 Twitter 句柄。在following表中,列中的每个字段只有一个 Twitter 句柄to_user 。

奠定关系数据库理论基础的计算机科学家 Edgar F. Codd 将跨列删除重复数据的这一步骤称为数据库规范化中的第一范式 (1NF)。 

什么是数据库规范化?

数据库规范化是一种数据库设计方法,可以避免数据重复并消除插入、更新和删除异常等不良方面。使用关系,数据库规范化规则将较大的表分解为较小的表。规范化具有删除不必要(重复)数据和确保逻辑数据存储的双重目的。

在跨列删除重复数据的第一步中,我们采用了第一范式 (1NF)。

当关系中的每个属性都是单值属性并且每个属性或列都有唯一的名称时,那么我们可以说关系处于其第一范式。 

3.删除行间的重复数据

现在我们已经修复了跨列的重复,我们需要修复跨行的重复。由于用户@AndyRyder5 和@Brett_Englebert 各自发了两次推文,因此他们的信息在users表中重复。这表明我们需要提取推文并将它们放在自己的表格中。

什么是关系数据库(傻瓜关系数据库)  第3张

跨行拆分重复数据

和以前一样,“文本”存储推文本身。由于“created_at”列存储了推文的时间戳,因此将其拉入此表也是有意义的。我还包括对“用户名”列的引用,以便我们知道是谁发布了推文。这是将推文放在自己的表中的结果:

表 4:推文表

文本created_at用户名
“您如何看待#USA 的#emailing #campaigns #traffic?现在这是一个好的市场吗?您有#databases 吗?”“2013 年 2 月 12 日星期二 08:43:09 +0000”“_DreamLead”
“比尔盖茨谈论数据库,Reddit 上的免费软件 http://t.co/ShX4hZlA #billgates #databases”“2013 年 2 月 12 日星期二 07:31:06 +0000”“贡纳尔斯瓦兰德”
“RT @KirkDBorne:#Databases 中的读物:优秀的阅读列表,许多类别:http://t.co/S6RBUNxq,来自@rxin Fascinating。”“2013 年 2 月 12 日星期二 07:30:24 +0000”“GE软件”
“RT @tisakovich:@NimbusData 今天在旧金山举行的@Barclays 大数据会议上谈论#virtualization、#databases 和#flash memory。”“2013 年 2 月 12 日星期二 06:58:22 +0000”“阿德里安伯奇”
“http://t.co/D3KOJIvF 关于 Madden 2013 使用 AI 制作超级碗 #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:29:41 +0000”“安迪莱德5”
“http://t.co/rBhBXjma 一篇关于隐私设置和 facebook #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:24:17 +0000”“安迪莱德5”
“#BUS311 明尼苏达大学的 NCFPD 正在创建 #databases 以防止“食品欺诈”。http://t.co/0LsAbKqJ”“2013 年 2 月 12 日星期二 01:49:19 +0000”“布雷特_恩格尔伯特”
“#BUS311 公司可能正在保护他们的生产#databases,但他们的备份文件呢?http://t.co/okJjV3Bm”“2013 年 2 月 12 日星期二 01:31:52 +0000”“布雷特_恩格尔伯特”
“@NimbusData CEO @tisakovich @BarclaysOnline 今天在旧金山举行大数据会议,谈论#virtualization、#databases 和#flash memory”“2013 年 2 月 11 日星期一 23:15:05 +0000”“雨云数据”
“别忘了在本周五报名参加我们的免费展会:#Databases、#BI 和 #Sharepoint:你需要知道的!http://t.co/Ijrqrz29”“2013 年 2 月 11 日星期一 22:15:37 +0000”“SSWUGorg”

表 5:用户表

全名用户名
“鲍里斯·哈朱尔”“_DreamLead”
“贡纳尔·斯瓦兰德”“贡纳尔斯瓦兰德”
“通用电气软件”“GE软件”
“阿德里安·伯奇”“阿德里安伯奇”
“安迪·莱德”“安迪莱德5”
“布雷特·恩格尔伯特”“布雷特_恩格尔伯特”
“雨云数据系统”“雨云数据”
“SSWUG.ORG”“SSWUGorg”

拆分后,该users表具有用户及其 Twitter 句柄的唯一行。

Edgar F. Codd 将删除行间重复数据的这一步骤称为第二范式(2NF)。

规范化数据库的下一阶段称为第二范式 (2NF)。2NF 推进了第一范式(1NF)。2NF 确保具有多对多链接的每条信息都被排序并存储在单独的表中。

一个表必须是第一范式并且没有部分依赖才能成为第二范式。

当表中的属性仅依赖于复合主键的一部分而不是整个主键时,这称为部分依赖。

我们可以分离表,删除产生部分依赖的属性text(tweets

4.用键链接表

可以从表中插入、检索、更新和删除数据。

到目前为止,表 1 已拆分为三个新表:following、tweets和users。但这有什么用?重复数据已被删除,但现在数据分布在三个独立的表中。为了检索数据,我们需要在表之间绘制有意义的链接。通过这种方式,我们可以表达诸如“用户在推特上发布了什么以及用户在关注谁”之类的查询。

在表之间绘制链接的方法是首先为表中的每一行赋予一个唯一标识符,称为主键,然后在要链接到的另一个表中引用该主键。

我们已经在users 和中完成了这项工作tweets。在users 表中,主键是username列,因为没有两个用户拥有相同的 Twitter 句柄。在tweets中,我们在列中引用了这个键,username这样我们就知道谁发了什么推文。由于它是引用,因此中的username 列tweets称为外键。这样,username键将users和tweets表链接在一起。

但是,对于用户表username的主键来说,该列是最好的主意吗?

一方面,它是一个自然键——使用 Twitter 句柄进行搜索而不是为每个用户分配一个数字 ID 并在其上进行搜索是有意义的。另一方面,如果用户想要更改他们的 Twitter 句柄怎么办?如果主键和所有引用外键没有准确更新,这可能会导致错误,如果使用常量数字 ID,则可以避免错误。最终,选择取决于您的系统。如果您想让您的用户能够更改他们的用户名,最好添加一个数字自动递增id列users并将其用作主键。否则,username应该做得很好。我将继续username用作users.

让我们继续tweets。主键应该唯一标识每一行,那么主键应该是什么?该created_at字段不起作用,因为如果两个用户同时发推文,他们的推文将具有相同的时间戳。有同样的text问题,如果两个用户都发推文“Hello world”,我们无法区分行。该username列是定义与的链接的外键,users 所以我们不要弄乱它。id由于其他列不是很好的候选者,因此在这里添加一个数字自动递增列并将其用作主键是有意义的。

表 6:带有一列的tweets表id

ID文本created_at用户名
1“您如何看待#USA 的#emailing #campaigns #traffic?现在这是一个好的市场吗?您有#databases 吗?”“2013 年 2 月 12 日星期二 08:43:09 +0000”“_DreamLead”
2“比尔盖茨谈论数据库,Reddit 上的免费软件 http://t.co/ShX4hZlA #billgates #databases”“2013 年 2 月 12 日星期二 07:31:06 +0000”“贡纳尔斯瓦兰德”
3“RT @KirkDBorne:#Databases 中的读物:优秀的阅读列表,许多类别:http://t.co/S6RBUNxq,来自@rxin Fascinating。”“2013 年 2 月 12 日星期二 07:30:24 +0000”“GE软件”
4“RT @tisakovich:@NimbusData 今天在旧金山举行的@Barclays 大数据会议上谈论#virtualization、#databases 和#flash memory。”“2013 年 2 月 12 日星期二 06:58:22 +0000”“阿德里安伯奇”
5“http://t.co/D3KOJIvF 关于 Madden 2013 使用 AI 制作超级碗 #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:29:41 +0000”“安迪莱德5”
6“http://t.co/rBhBXjma 一篇关于隐私设置和 facebook #databases #bus311 的文章”“2013 年 2 月 12 日星期二 05:24:17 +0000”“安迪莱德5”
7“#BUS311 明尼苏达大学的 NCFPD 正在创建 #databases 以防止“食品欺诈”。http://t.co/0LsAbKqJ”“2013 年 2 月 12 日星期二 01:49:19 +0000”“布雷特_恩格尔伯特”
8“#BUS311 公司可能正在保护他们的生产#databases,但他们的备份文件呢?http://t.co/okJjV3Bm”“2013 年 2 月 12 日星期二 01:31:52 +0000”“布雷特_恩格尔伯特”
9“@NimbusData CEO @tisakovich @BarclaysOnline 今天在旧金山举行大数据会议,谈论#virtualization、#databases 和#flash memory”“2013 年 2 月 11 日星期一 23:15:05 +0000”“雨云数据”
10“别忘了在本周五报名参加我们的免费展会:#Databases、#BI 和 #Sharepoint:你需要知道的!http://t.co/Ijrqrz29”“2013 年 2 月 11 日星期一 22:15:37 +0000”“SSWUGorg”

最后,让我们为表添加一个主键following。在此表中,from_user列和to_user列都不能唯一地标识每一行。但是,from_user一起to_user做,因为它们代表一个单一的关系。可以在多个列上定义主键,因此我们将使用这两列作为following表的主键。

至于外键,from_user和to_user都是每个外键,因为它们可以用来定义与用户表的链接。如果我们在该列上查询 Twitter 句柄from_user,我们将获得他们关注的所有用户。相应地,如果我们在该列上查询 Twitter 句柄to_user,我们将获得所有关注它们的用户。

到目前为止,我们已经取得了很多成就。我们通过将数据分成三个不同的表来消除列和行之间的重复,然后我们选择有意义的主键将表链接在一起。这个过程称为规范化,其输出由干净且根据关系模型组织的数据组成。这种组织的结果是行只会出现在数据库中一次向前移动,这反过来将使 CRUD 操作更容易。

下图显示了最终的数据库模式。这三个表是链接的,并且主键被突出显示。

什么是关系数据库(傻瓜关系数据库)  第4张

最终确定的数据库架构

关系数据库管理系统

既然我们知道如何设计一个关系数据库,那么我们如何实际实现一个呢?关系数据库管理系统 (RDBMS) 是允许您创建和使用关系数据库的软件。有几个商业和开源供应商可供选择。在商业方面,Oracle 数据库、IBM DB2和Microsoft SQL Server是三个著名的解决方案。在免费和开源方面,mysqlsqlitepostgreSQL是三种广泛使用的解决方案。

几乎所有你听说过的互联网公司都在使用 MySQL。在本文的上下文中,Twitter 使用 MySQL来存储其用户的推文。

SQLite 在嵌入式系统中很常见。iosandroid 允许开发人员使用 SQLite 来管理他们应用程序的私有数据库。Google chrome 使用 SQLite 将您的浏览历史记录、cookie 和您的缩略图存储在“最常访问”页面上。

PostgreSQL 也是一种广泛使用的 RDBMS。它的 PostGIS 扩展为 PostgreSQL 补充了地理空间功能,使其可用于制图应用程序。PostgreSQL 的一个著名用户是OpenStreetMap。

结构化查询语言 (SQL)

在系统上下载并设置 RDBMS 后,下一步是在其中创建数据库和表,以便插入和管理关系数据。执行此操作的方法是使用结构化查询语言 (SQL),它是使用 RDBMS 的标准语言。

每个 RDBMS 供应商之间的 SQL 存在细微差异,称为 SQL 方言。

以下是与上述示例 Twitter 数据相关的常见 SQL 语句的简要概述。 

创建一个名为的数据库development

CREATE DATABASE development;

创建一个名为users

CREATE TABLE users (
  full_name VARCHAR(100),
  username VARCHAR(100)
);

RDBMS 要求为表中的每一列指定一种数据类型。在这里,我为“full_name”和“username”列分配了数据类型VARCHAR,这是一个宽度可以变化的字符串。我已将最大长度任意设置为 100。可以在 Wikipedia 上找到各种数据类型的完整列表。

插入记录

INSERT INTO users (full_name, username)
VALUES ("Boris Hadjur", "_DreamLead");

检索属于用户的所有推文

SELECT text, created_at 
FROM tweets 
WHERE username="_DreamLead";

更新用户名 

UPDATE users
SET full_name="Boris H"
WHERE username="_DreamLead";

删除用户

DELETE FROM users
WHERE username="_DreamLead";

SQL 与普通的英语句子非常相似。每个 RDBMS 供应商之间的 SQL 存在细微差异,称为 SQL 方言,但差异并不那么显着,以至于您无法轻松地将 SQL 知识从一个供应商转移到另一个供应商。

结论

在本文中,我们学习了如何设计关系数据库。我们收集了一组数据并将其组织成相关的表格。我们了解了使用第一范式和第二范式对数据库进行规范化。

我们还简要介绍了 RDBMS 解决方案和 SQL。因此,今天就开始下载 RDBMS 并将您的一些数据规范化到关系数据库中。


文章目录
  • 什么是关系数据库?
  • 1.获取一些数据
  • 2.删除跨列的重复数据
    • 什么是数据库规范化?
  • 3.删除行间的重复数据
  • 4.用键链接表
  • 关系数据库管理系统
  • 结构化查询语言 (SQL)
      • 创建一个名为的数据库development
      • 创建一个名为users
      • RDBMS 要求为表中的每一列指定一种数据类型。在这里,我为“full_name”和“username”列分配了数据类型VARCHAR,这是一个宽度可以变化的字符串。我已将最大长度任意设置为 100。可以在 Wikipedia 上找到各种数据类型的完整列表。
      • 插入记录
      • 检索属于用户的所有推文
      • 更新用户名
      • 删除用户
      • SQL 与普通的英语句子非常相似。每个 RDBMS 供应商之间的 SQL 存在细微差异,称为 SQL 方言,但差异并不那么显着,以至于您无法轻松地将 SQL 知识从一个供应商转移到另一个供应商。
  • 结论
  • 发表评论