前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。
概念性——数据库简介
介绍
数据对于当今许多应用程序和网站的运行至关重要。对热门视频的评论、多人游戏中分数的变化以及我们在最喜欢的在线商店的购物车中留下的物品都是存储在数据库中某处的信息。
这篇概念性文章介绍了许多数据库主题。它简要概述了云计算背景下的数据库,并重点介绍了数据库设计和功能的一些核心概念。它还包含整个相关概念和程序教程的链接。
什么是数据库?
从广义上讲,数据库是任何逻辑建模的信息集合。数据库不一定必须存储在计算机上,诸如医院中的一堆患者档案、名片盒中的一组联系人或装满旧发票的文件柜等都可以作为数据库的示例。
在网站和应用程序中,当人们提到“数据库”时,他们通常指的是允许他们与数据库交互的计算机程序。这些程序更正式地称为数据库管理系统(DBMS),通常安装在虚拟专用服务器上并进行远程访问。
Redis、MariaDB 和 PostgreSQL 是开源 DBMS 的几个示例,但目前有许多不同的可用。不同的 DBMS 通常有自己独特的功能和相关的工具集,但它们通常分为两类之一:关系数据库和非关系数据库。
关系数据库
自 20 世纪 70 年代以来,大多数 DBMS 都是围绕关系模型设计的。关系模型中最基本的元素是关系,用户和现代 关系 DBMS(RDBMS 或关系数据库)将其识别为表。关系是一组元组或表中的行,每个元组共享一组属性或列:
我们可以将每个元组视为表中包含的任何类型的人、对象、事件或关联的唯一实例。这些实例可能是公司的员工、在线企业的销售或医学实验室的测试结果。例如,在保存学校教师员工记录的表中,元组可能具有name
、subjects
、start_date
等属性。
在关系模型中,每个表至少包含一列,可用于唯一标识每一行,称为主键。以存储学校教师员工记录的表为例,数据库管理员可以创建一个名为employee_ID
的主键列,其值自动递增。这将允许 DBMS 跟踪每条记录并临时返回它们。反过来,这意味着记录没有定义的逻辑顺序,并且用户能够以任何顺序或通过他们希望的任何过滤器返回数据。
如果我们有两个表想要相互关联,一种方法是使用外键。外键本质上是一个表(“父”表)主键的副本,插入到另一个表(“子”)的列中。以下示例突出显示了两个表之间的关系,一个用于记录有关公司员工的信息,另一个用于跟踪公司的销售情况。在本例中,表的主键EMPLOYEES
用作表的外键SALES
:
关系模型的结构元素有助于以有组织的方式存储数据,但存储数据只有在可以检索数据时才有用。要从 RDBMS 检索信息,我们可以发出查询或对一组信息的结构化请求。大多数关系数据库使用一种称为结构化查询语言的语言(更广为人知的名称是SQL,非正式发音如“sequel”)来管理和查询数据。SQL 允许我们使用各种子句、谓词和表达式来过滤和操作查询结果,从而使我们可以很好地控制结果集中出现的数据。
目前有许多开源 RDBMS可用,包括:
- MySQL
- MariaDB
- PostgreSQL
- SQLite
非关系数据库
如今,大多数应用程序仍然使用关系模型来存储和组织数据。然而,关系模型并不能满足所有应用程序的需求。例如,水平扩展关系数据库可能很困难,尽管它们非常适合存储结构化数据,但对于存储非结构化数据却不太有用。
关系模型的这些和其他限制导致了替代方案的开发。这些数据库模型通常统称为非关系数据库。由于这些替代模型通常不实现 SQL 来定义或查询数据,因此它们有时也称为NoSQL 数据库。这也意味着许多 NoSQL 数据库实现了独特的语法来插入和检索数据。
将“NoSQL”和“非关系”视为广义的总括术语会有所帮助,因为有许多数据库模型被标记为 NoSQL,它们之间存在显着差异。本节的其余部分重点介绍一些更常用的非关系数据库模型:
键值数据库
键值数据库,也称为键值存储,通过存储和管理关联数组来工作。关联数组,也称为字典或哈希表,由键值对的集合组成,其中键用作检索关联值的唯一标识符。值可以是任何内容,从简单的对象(如整数或字符串)到更复杂的对象(如 JSON 结构)。
Redis
是流行的开源键值存储的一个示例。
面向文档的数据库
面向文档的数据库或文档存储是以文档形式存储数据的 NoSQL 数据库。文档存储是一种键值存储:每个文档都有一个唯一的标识符——它的键——文档本身充当值。这两种模型之间的区别在于,在键值数据库中,数据被视为不透明,数据库不知道也不关心其中保存的数据;由应用程序来了解存储了哪些数据。然而,在文档存储中,每个文档都包含某种元数据,为数据提供一定程度的结构。文档存储通常附带 API 或查询语言,允许用户根据文档包含的元数据检索文档。它们还允许复杂的数据结构,因为我们可以将文档嵌套在其他文档中。
MongoDB
是一种广泛使用的文档数据库。我们存储在 MongoDB 数据库中的文档是用 BSON 编写的,它是 JSON 的二进制形式。
列式数据库
列式数据库有时也称为面向列的数据库,是按列存储数据的数据库系统。这看起来与传统的关系数据库类似,但不是将列分组到表中,而是将每个列存储在系统存储中的单独文件或区域中。列式数据库中存储的数据按记录顺序显示,这意味着一列中的第一个条目与其他列中的第一个条目相关。这种设计允许查询仅读取所需的列,而不必读取表中的每一行并在将不需要的数据存储在内存中后丢弃这些数据。
Apache Cassandra
是一种广泛使用的开源列存储。
数据库和应用
数据库管理系统本身并不是很有用。我们可以使用 DBMS 直接查询数据库并与数据库交互,但在大多数现实环境中,我们可能希望将其与其他工具结合使用,因为 DBMS 无法自行提供或显示内容。这样做后,数据库就成为大型应用程序的重要组成部分。
有许多流行的开源技术堆栈都包含 DBMS。这里有一些例子:
- LAMP 堆栈:“LAMP”是由通常构成该堆栈的技术组成的缩写: L inux 操作系统、 A pache Web 服务器、 MySQL数据库和用于动态内容处理的 PHP**。**LAMP 堆栈的各个部分换入换出的情况越来越常见(例如,用 PostgreSQL 或 SQLite 代替 MySQL,用 Flask 或 Django 代替 PHP,用 Nginx 代替 Apache)。其他 L*MP 选项也很常见,例如 LEMP,其中 E 代表 Nginx(发音为 engine-x)
- Elastic stack:Elastic stack 以前称为 ELK Stack,是围绕 Elastic search 构建的,Elastic search 是一种搜索引擎,也被称为面向文档的数据库。这通常用于大规模存储软件输出日志。
这些技术堆栈通常部署在同一台服务器上——这种架构模式称为整体架构。在这种情况下,将其他堆栈组件连接到 DBMS 是相当简单的。或者,我们可以通过在远程服务器上安装 DBMS 来设置*远程数据库。*大多数 DBMS 都在专用端口上运行,我们可以使用该端口将应用程序服务器连接到远程数据库。例如,MySQL 的默认端口是3306
,Redis 的默认端口是6379
。与单体应用程序相比,使用这样的远程数据库服务器可以是一种高度可扩展的解决方案,因为它允许我们独立于应用程序来扩展数据库。
然而,像这样设置远程数据库会增加应用程序的攻击面,因为它为未经授权的用户增加了更多潜在的入口点。它还要求我们的数据通过网络连接从数据库服务器发送到应用程序服务器,这意味着数据包可能会被恶意行为者拦截。为了保护我们的数据免受此类嗅探攻击,许多 DBMS 允许我们加密数据。加密是将一段信息从明文(信息的原始形式)转换为密文(一种不可读的形式,只能由拥有正确密码的人或计算机进行解密)的过程。如果恶意行为者要拦截一段加密数据,他们在解密之前将无法读取该数据。
许多 DBMS 允许我们通过将数据库服务器配置为需要使用传输层安全性(也称为TLS)的连接来加密数据库服务器与需要访问它的任何客户端或应用程序之间的通信。与其前身安全套接字层(SSL) 一样,TLS 是一种加密协议,它使用基于证书的身份验证来加密通过网络传输的数据。请注意,TLS 仅在数据通过网络传输时对其进行加密,也称为传输中的数据。即使我们已将 Mongo 配置为要求使用 TLS 建立连接,存储在数据库服务器上的静态数据(称为静态*数据)*仍然是未加密的,除非我们的 DBMS 提供某种形式的静态数据加密。
使用数据库
大多数数据库管理系统都安装了命令行工具,允许我们与数据库安装进行交互。
然而,通过命令行界面管理数据对于每个用户来说可能并不直观,这就是为什么许多开源 DBMS 都可以使用图形数据库管理工具。有些(如phpMyAdmin
或pgAdmin
是基于浏览器的,而另一些(如MySQL Workbench
或MongoDB Compass
)则旨在从本地计算机连接到远程数据库。
随着应用程序不断运行和增长,数据库中保存的数据将需要越来越多的存储空间,甚至可能会减慢整个应用程序的速度。处理此类问题有几种常见的策略,其中最常见的两种是复制和分片。
复制是跨多个独立数据库同步数据的实践。使用数据库时,拥有多个数据副本通常很有用。这可以在其中一台数据库服务器发生故障时提供冗余,并且可以提高数据库的可用性和可扩展性,并减少读取延迟。许多 DBMS 都将复制作为内置功能,包括MongoDB
和MySQL
。有些(例如 MySQL)甚至提供多种复制方法以实现更大的灵活性。
数据库分片
是拆分通常保存在同一个表或集合中的数据记录并将其分布在多台机器上的过程,称为分片。分片在我们处理大量数据的情况下特别有用,因为它允许我们通过添加更多可以充当新分片的机器来水平扩展我们的基础。
结论
通过阅读本文,我们应该更好地了解什么是数据库以及如何使用它们。