返回介绍

6.7 数据库简介

发布于 2024-01-27 21:43:11 字数 8207 浏览 0 评论 0 收藏 0

数据库——初学生爱,爱极生恨。作为开发人员,你可能会在学习和工作中用到各种类型的数据库。本节不会对数据库做全面介绍,但我们希望对数据库基本概念做一个简要介绍。如果你已经熟练掌握数据库的使用,可以大致浏览一下本节,继续阅读关于其他存储方案以及何时使用数据库的内容。

你用 Siri 查过手机里的电话号码么?你用过谷歌搜索么?你有没有点击过 Twitter 或 Instagram 里的标签?这些操作都涉及对数据库(或一系列数据库,或数据库缓存)的简单查询和响应。你有一个问题[在 YouTube 上新出了哪些关于猫(Maru)的有趣视频?],你向一个特定的数据库(YouTube 搜索)提问,得到有趣的响应——可以观赏的搜索结果列表。

在接下来的几节里,我们将简要讲述两种主要的数据库类型,强调了各自的利弊,并对比了二者的优点和缺点。对于数据处理来说,你绝对需要使用数据库,然而,随着数据处理和分析变得更加复杂,数据库知识及其使用将变得更加重要,可以提高你存储和分析数据的能力。

如果你对数据库感兴趣,我们会讲到用 Python 处理数据库的几个技巧,但显然我们没有足够的时间全面讲述这个话题。我们强烈推荐你根据自己的兴趣去搜索更多的资料、视频和教程。

6.7.1 关系型数据库:MySQL和PostgreSQL

对于来源很多、同时还有各种层次关联性的数据,关系型数据库是很好用的。关系型数据库正如其名:如果你的数据连接类似于家谱,那么关系型数据库可能会适合你,比如 MySQL。

关系型数据库通常使用一系列唯一标识符来匹配数据集。在 SQL 里我们一般把这些标识符叫作 ID。这些 ID 可以被其他数据集所用,用来查询和匹配数据连接。在这些连接好的数据库中,我们可以进行 join 操作,在许多不同的数据库中同时访问连接的数据。我们来看一个例子。

我有一个特别厉害的朋友,叫 Meghan。她有一头黑发,在《纽约时报》工作。在工作之余,她喜欢跳舞、烹饪和教人如何编程。如果我有一个关于朋友的数据库,使用 SQL 代表他们的属性,我可能会这样分表:

**friend_table: ➊
friend_id ➋
friend_name
friend_date_of_birth
friend_current_location
friend_birthplace
friend_occupation_id

**friend_occupation_table:
friend_occupation_id
friend_occupation_name
friend_occupation_location

**friends_and_hobbies_table:
friend_id
hobby_id
**hobby_details_table:
hobby_id
hobby_name
hobby_level_of_awesome

❶ 在我的朋友数据库中,每一部分(以 ** 表示)都是一个。在关系型数据库中,表通常用来保存特定主题或特定对象的信息。

❷ 表中包含的每一条信息叫作字段。在这个例子中,friend_id 字段包含 friend_table 中每一位朋友的唯一 ID。

我可以向数据库提问:Meghan 的爱好是什么?想要获取这个信息,我需要对数据库说:“嘿,我要查询我的朋友 Meghan。她住在纽约,这是她的生日,你能告诉我她的 ID 吗?”对于这条查询,SQL 数据库返回的是她的 friend_id。然后我可以向 friend_and_hobbies_table 提问(这个表正确匹配了朋友 ID 和爱好 ID),与这个朋友 ID 匹配的爱好是什么,它会返回由三个新的爱好 ID 组成的列表。

由于这些 ID 都是数字,我想进一步了解它们的含义。我向 hobby_details_table 提问:“你能告诉我关于这些爱好 ID 的更多内容吗?”它回答:“当然可以!一个是跳舞,一个是烹饪,一个是教人如何编程。”啊哈!只利用最开始的朋友描述,我就解开了这个谜题。

创建数据库并向其中导入数据可能涉及许多步骤,但如果你的数据库很复杂,有许多不同的关系,那么搞清楚如何连接这些数据并找到你想要的信息,步骤不应该很复杂。在构建关系型数据库时,花点时间研究关系和属性之间的映射,类似我们在朋友数据库所做的那样。都有哪些不同的数据类型,它们之间是如何映射的?

在关系型数据库架构中,通过思考数据的使用频率,我们知道要如何匹配数据。你希望向数据库请求的查询易于回答。由于我们可能会用职业来寻找对应的朋友,所以我们将 occupation_id 放在 friend_table 表中。

还需要注意的是,关系有许多不同的类型。例如,我有许多朋友的爱好都是烹饪。我们把这种情况称为多对多关系。如果我们再添加一个叫作 pets 的表,就会新增加一种关系类型——多对一关系。这是因为有些朋友养了不止一只宠物,但每只宠物只能有一个主人。我可以使用 friend_id 查询每一位朋友的所有宠物。

如果你有兴趣深入学习 SQL 和关系型数据库的内容,我们建议在 SQL 上多花点时间。入门 SQL 可以在“Learn SQL The Hard Way”(http://sql.learncodethehardway.org/)和“SQLZOO”(http://sqlzoo.net/)这两个网站上学习。PostgreSQL 和 MySQL 在语法上有一些细微的差别,但它们的基础知识相同,你可以自己选择学习哪一个。

01. MySQL和Python

如果你熟悉 MySQL(或正在学习 MySQL),想要使用 MySQL 数据库,那么用 Python 连接 MySQL 是很容易的。你需要做的只有两步。第一步,你必须安装 MySQL 驱动程序。第二步,你应该用 Python 发送验证信息(用户名、密码、主机名、数据库名称)。这两步在 Stack Overflow 上都可以找到很多优质的回答(http://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python)。

02. PostgreSQL和Python

如果你熟悉 PostgreSQL(或正在学习 PostgreSQL),想要使用 PostgreSQL 数据库,那么用 Python 连接 PostgreSQL 也是很容易的。你也只需要做两步:安装驱动程序,用 Python 连接。

Python 的 PostgreSQL 驱动程序有很多(https://wiki.postgresql.org/wiki/Python),但最流行的是 Psycopg(http://initd.org/psycopg/)。在 Psycopg 的安装页面(http://initd.org/psycopg/docs/install.html)中详细介绍了如何在电脑上运行 Psycopg,在 PostgreSQL 网站上也有关于 Python 如何使用 Psycopg 的详细介绍(https://wiki.postgresql.org/wiki/Psycopg2_Tutorial)。

6.7.2 非关系型数据库:NoSQL

比方说,你喜欢使用数据库这个主意,但映射出所有关系会让你抓狂。可能只是因为你目前没有真正理解数据的连接方式,也可能是因为你用的是平面数据(flat data,也就是说,不必良好映射的无关系数据),或者也可能是因为你对学习 SQL 没有更强烈的兴趣。幸运的是,还有一种适合你的数据库。

NoSQL 以及其他非关系型数据库将数据保存成平面格式(flat format),通常是 JSON 格式。我们在第 3 章中说过,JSON 查找信息的方法很简单。回到上一节关于我朋友的数据,如果我只有保存在节点中的数据,通过这些节点可以查询该朋友的更多信息,那我应该怎么做?数据看起来可能是这样的:

{
  'name': 'Meghan',
  'occupation': { 'employer': 'NYT',
          'role': 'design editor',
          },
  'birthplace': 'Ohio',
  'hobbies': ['cooking', 'dancing', 'teaching'],
}

可以看出,我用一个简单列表就可以给出我朋友的所有属性,无需创建表。

你可能想知道,关系型数据的优点是什么?你问不同的人,得到的回答可能会完全不同——在计算机科学领域,在众多开发人员之中,这是一个激烈争论的话题。我们的观点是,当数据结构包含大量的关系网络时,SQL 对快速查询做出了许多改进。非关系型数据库在速度、可用性和复用方面做出了许多改进。

最后,如果你对学习某一种数据库有更强烈的兴趣,可以让兴趣帮你做决定,但不要现在就确定数据库的格式。如果你需要在关系型数据库和非关系型数据库之间迁移,有许多工具可以帮你完成这一任务 1

1对于在 SQL 和 NoSQL 数据库之间的迁移,更多内容可查阅 Matt Asay 关于将 Foursquare 从关系型数据库迁移到 NoSQL 数据库的文章(http://www.techrepublic.com/blog/the-enterprise-cloud/migrating-from-a-relational-to-a-nosql-cloud-database/)。另外,Quora 上还有许多关于反向迁移的文章(https://www.quora.com/How-do-I-migrate-data-from-a-MongoDB-to-MySQL-database-Can-it-be-done-in-a-real-time-scenario-What-are-the-pros-and-cons-for-each-migration-Which-one-do-you-advice-What-is-your-experience-Any-reference-DB-expert-who-can-do-it)。

MongoDB和Python

如果你的数据具有非关系型数据库结构,或者你希望在实践中学习,那么用 Python 连接 NoSQL 数据库是非常简单的。虽然有很多选择,但最流行的 NoSQL 数据库框架之一是 MongoDB(http://mongodb.org/)。要使用 MongoDB,你需要首先安装驱动程序(http://docs.mongodb.org/ecosystem/drivers/python/),然后用 Python 来连接。在 PyCon 2012 上有一个很棒的演讲:“Getting Started with MongoDB”(https://github.com/behackett/presentations/tree/master/pycon_2012),你可以从这里开始学习 MongoDB 以及如何用 Python 连接。

6.7.3 用Python创建本地数据库

开始学习数据库和 Python 最简单的方法就是,使用一个简单的库帮你快速上手。对于本书来说,我们推荐学习 Dataset 库(http://dataset.readthedocs.io/)。Dataset 是一个包装库(wrapper library),可以将可读的 Python 代码翻译成要处理的数据库代码,以加快开发速度。

如果你已有一个 SQLite、PostgreSQL 或 MySQL 数据库,可以参考快速入门指南(https://dataset.readthedocs.io/en/latest/quickstart.html)直接连接。如果你还没有上述数据库之一,在使用这个工具时它会为你创建一个。我们来看一下如何让它在你的电脑上运行。

你要做的第一件事是安装 Dataset(http://dataset.readthedocs.io/en/latest/install.html)。如果你已经安装了 pip,那么只需要输入 pip install dataset。

然后你需要确定用到的后端。如果你已经在用 PostgreSQL 或 MySQL,只需要用对应的语法创建一个新的数据库。如果你对数据库不太熟悉,那我们就用 SQLite。首先,下载操作系统对应的 SQLite 二进制文件(http://www.sqlite.org/download.html)。打开下载的文件,按照安装说明一步步安装。

打开终端,切换(cd)到保存 Python 数据处理脚本的项目文件夹。输入以下代码来创建新的 SQLite 数据库:

sqlite3 data_wrangling.db

你应该会看到以 sqlite> 开头的提示符,提示你输入 SQL 语句。你已经确认电脑上可以运行 sqlite3,可以在终端输入 .q 退出 SQLite。退出后,列出当前文件夹的所有文件。现在你应该会看到一个名为 data_wrangling.db 的文件——那就是你的数据库!

安装好了 SQLite,运行了第一个数据库之后,现在要开始使用 Dataset 了。在 Python 中运行以下代码:

import dataset

db = dataset.connect('sqlite:///data_wrangling.db')

my_data_source = {
  'url':
  'http://www.tsmplug.com/football/premier-league-player-salaries-club-by-club/',
  'description': 'Premier League Club Salaries',
  'topic': 'football',
  'verified': False,
} ➊

table = db['data_sources'] ➋
table.insert(my_data_source) ➌

another_data_source = {
  'url':
  'http://www.premierleague.com/content/premierleague/en-gb/players/index.html',
  'description': 'Premier League Stats',
  'topic': 'football',
  'verified': True,
}

table.insert(another_data_source)

sources = db['data_sources'].all()  ➍

print sources

❶ 创建一个 Python 字典,里面是我们要保存的数据。我们要保存的是足球研究的数据源。我们添加的信息有主题、描述、URL 以及我们是否对数据做过核实。

❷ 创建名为 data_sources 的新表。

❸ 将第一个数据源插入新表。

❹ 显示我们保存在 data_sources 表中的所有数据源。

你已经利用 SQLite 创建了第一个关系型表,并完成了 Python 与数据库之间的第一次交互。随着本书内容的深入,你将会向数据库中添加更多的数据和表。将所有数据保存到一处,可以让你数据结构清晰,让你的研究更加专注。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文