前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。
关系数据模型以行和列的表形式组织数据,在数据库管理工具中占主导地位。如今,还有其他数据模型,包括NoSQL和NewSQL,但关系数据库管理系统 (RDBMS)仍然在全球存储和管理数据方面占据主导地位。
本文比较和对比了三种最广泛实现的开源 RDBMS:SQLite、MySQL和PostgreSQL。具体来说,它将探讨每个 RDBMS 使用的数据类型、它们的优点和缺点以及它们最佳优化的情况。
注:文中的链接部分百度百科未收录,会跳向维基百科(不会影响内容的阅读)。
数据库是逻辑建模的信息或数据集群。另一方面,数据库管理系统 (DBMS) 是与数据库交互的计算机程序*。*DBMS 允许我们控制对数据库的访问、写入数据、运行查询以及执行与数据库管理相关的任何其他任务。
尽管数据库管理系统通常被称为“数据库”,但这两个术语不能互换。数据库可以是任何数据集合,而不仅仅是存储在计算机上的数据。相比之下,DBMS 特指允许我们与数据库交互的软件。
所有数据库管理系统都有一个底层模型来构建数据的存储和访问方式。关系数据库管理系统是采用关系数据模型的DBMS。在此关系模型中,数据被组织到表中。在 RDBMS 上下文中,表更正式地称为关系。关系是一组元组,即表中的行,每个元组共享一组属性,即表中的列:
大多数关系数据库使用结构化查询语言(SQL)来管理和查询数据。然而,许多 RDBMS 使用自己特定的 SQL 方言,这可能有某些限制或扩展。这些扩展通常包括额外的功能,允许用户执行比使用标准 SQL 更复杂的操作。
**注意:**本指南中多次出现术语“标准 SQL”。SQL 标准由美国国家标准协会 (ANSI)、国际标准化组织 (ISO)和国际电工委员会 (IEC)共同维护。每当本文提到“标准 SQL”或“SQL 标准”时,都是指这些机构发布的 SQL 标准的当前版本。
应该指出的是,完整的 SQL 标准庞大且复杂:完整的核心 SQL:2011 合规性需要 179 个功能。因此,大多数 RDBMS 并不支持整个标准,尽管有些 RDBMS 确实比其他 RDBMS 更接近于完全合规。
每列都分配有一个数据类型,该数据类型指示该列中允许的条目类型。不同的 RDBMS 实现不同的数据类型,这些数据类型并不总是可以直接互换。一些常见的数据类型包括日期、字符串、整数和布尔值。
在数据库中存储整数比将数字放入表中更加细致。数字数据类型可以是有符号的,这意味着它们可以表示正数和负数,也可以是无符号的,这意味着它们只能表示正数。例如,MySQL 的tinyint
数据类型可以保存 8 位数据,相当于 256 个可能的值。该数据类型的有符号范围是从-128到127,而无符号范围是从0到255。
能够控制允许进入数据库的数据非常重要。有时,数据库管理员会对表施加*约束,以限制可以在其中输入的值。*约束通常适用于一个特定列,但某些约束也可以适用于整个表。以下是 SQL 中常用的一些约束:
UNIQUE
:将此约束应用于列可确保该列中没有两个条目是相同的。NOT NULL
:此约束确保列中没有任何NULL
条目。CHECK
:此约束限制可以输入到列中的值的范围。例如,如果我们的应用程序仅适用于阿拉斯加居民,我们可以CHECK
在邮政编码列上添加限制,仅允许输入 99501 到 99950 之间的内容。如果想了解有关数据库管理系统的更多信息,请查看《NoSQL 数据库管理系统和模型的比较》。
我们已经大致介绍了关系数据库管理系统,接下来讨论本文将介绍的三个开源关系数据库中的第一个:SQLite。
SQLite 是一种独立的、基于文件的、完全开源的 RDBMS,以其可移植性、可靠性以及即使在低内存环境中也具有强大的性能而闻名。即使在系统崩溃或断电的情况下,它的事务也是符合 ACID 的。
SQLite项目的网站将其描述为“无服务器”数据库。大多数关系数据库引擎都是作为服务器进程实现的,其中程序通过中继请求的进程间通信与主机服务器进行通信。相比之下,SQLite允许任何访问数据库的进程直接读写数据库磁盘文件。这简化了 SQLite 的设置过程,因为它消除了配置服务器进程的任何需要。同样,使用 SQLite 数据库的程序无需进行任何配置:它们所需的只是访问磁盘。
SQLite 是免费的开源软件,使用它不需要特殊许可证。然而,该项目确实提供了几种扩展——每种扩展都是一次性费用——有助于压缩和加密。此外,该项目还提供各种商业支持包,每个都收取年费。
SQLite 允许多种数据类型,组织成以下存储类:
数据类型 | 解释 |
---|---|
null |
包括任何NULL 值。 |
integer |
有符号整数,根据值的大小存储在 1、2、3、4、6 或 8 个字节中。 |
real |
实数或浮点值,存储为 8 字节浮点数。 |
text |
使用数据库编码存储的文本字符串,可以是 UTF-8、UTF-16BE 或 UTF-16LE。 |
blob |
任何数据块,每个数据块都完全按照输入时的方式存储。 |
在 SQLite 上下文中,术语“存储类”和“数据类型”被认为是可以互换的。如果我们想了解有关 SQLite 数据类型和 SQLite 类型关联的更多信息,请查看 SQLite关于该主题的官方文档。
根据DB-Engines 排名,自 2012 年该网站开始跟踪数据库流行度以来,MySQL 一直是最受欢迎的开源 RDBMS。它是一款功能丰富的产品,为许多世界上最大的网站和应用程序提供支持,包括 Twitter、Facebook 、Netflix 和 Spotify。MySQL 入门相对简单,这在很大程度上要归功于其详尽的文档和庞大的开发人员社区,以及丰富的 MySQL 相关在线资源。
MySQL 的设计注重速度和可靠性,但牺牲了对标准 SQL 的完全遵守。MySQL 开发人员不断努力更加严格地遵守标准 SQL,但它仍然落后于其他 SQL 实现。然而,它确实附带了各种 SQL 模式和扩展,使其更接近合规性。
与使用 SQLite 的应用程序不同,使用 MySQL 数据库的应用程序通过单独的守护进程来访问它。由于服务器进程位于数据库和其他应用程序之间,因此可以更好地控制谁有权访问数据库。
MySQL 启发了大量第三方应用程序、工具和集成库,这些应用程序、工具和集成库扩展了其功能并使其更易于使用。这些第三方工具中使用更广泛的一些是phpMyAdmin、DBeaver和HeidiSQL。
MySQL 的数据类型可以分为三大类:数字类型、日期和时间类型以及字符串类型。
数字类型:
数据类型 | 解释 |
---|---|
tinyint |
一个非常小的整数。此数值数据类型的有符号范围是 -128 到 127,无符号范围是 0 到 255。 |
smallint |
一个小整数。此数字类型的有符号范围是 -32768 到 32767,无符号范围是 0 到 65535。 |
mediumint |
一个中等大小的整数。此数值数据类型的有符号范围是 -8388608 到 8388607,无符号范围是 0 到 16777215。 |
int 或者integer |
一个正常大小的整数。此数值数据类型的有符号范围是 -2147483648 到 2147483647,无符号范围是 0 到 4294967295。 |
bigint |
一个大整数。此数值数据类型的有符号范围为 -9223372036854775808 到 9223372036854775807,无符号范围为 0 到 18446744073709551615。 |
float |
一个小(单精度)浮点数。 |
double ,double precision , 或者real |
正常大小(双精度)浮点数。 |
dec ,decimal ,fixed , 或者numeric |
压缩定点数。此数据类型的条目的显示长度是在创建列时定义的,并且每个条目都遵循该长度。 |
bool 或者boolean |
布尔值是一种只有两个可能值的数据类型,通常是true 或false 。 |
bit |
一种位值类型,我们可以指定每个值的位数(从 1 到 64)。 |
日期和时间类型:
数据类型 | 解释 |
---|---|
date |
日期,表示为YYYY-MM-DD 。 |
datetime |
显示日期和时间的时间戳,显示为YYYY-MM-DD HH:MM:SS 。 |
timestamp |
自1970 年 1 月 1 日 00:00:00以来的时间量的时间戳。 |
time |
一天中的某个时间,显示为HH:MM:SS 。 |
year |
以 2 或 4 位数字格式表示的年份,默认为 4 位数字。 |
字符串类型:
数据类型 | 解释 |
---|---|
char |
固定长度的字符串;该类型的条目在存储时会在右侧填充空格以满足指定的长度。 |
varchar |
可变长度的字符串。 |
binary |
与类型类似char ,但指定长度的二进制字节串而不是非二进制字符串。 |
varbinary |
与类型类似varchar ,但是是可变长度的二进制字节串而不是非二进制字符串。 |
blob |
最大长度为 65535 (2^16 - 1) 字节数据的二进制字符串。 |
tinyblob |
blob 最大长度为 255 (2^8 - 1) 字节数据的列。 |
mediumblob |
blob 最大长度为 16777215 (2^24 - 1) 字节数据的列。 |
longblob |
blob 最大长度为 4294967295 (2^32 - 1) 字节数据的列。 |
text |
最大长度为 65535 (2^16 - 1) 个字符的字符串。 |
tinytext |
text 最大长度为 255 (2^8 - 1) 个字符的列。 |
mediumtext |
text 最大长度为 16777215 (2^24 - 1)个字符的列。 |
longtext |
text 最大长度为 4294967295 (2^32 - 1)个字符的列。 |
enum |
枚举,它是一个字符串对象,它从创建表时声明的值列表中获取单个值。 |
set |
与枚举类似,可以具有零个或多个值的字符串对象,每个值都必须从创建表时指定的允许值列表中选择。 |
FULL JOIN
。PostgreSQL,也称为 Postgres,自称为“世界上最先进的开源关系数据库”。它的创建目标是高度可扩展且符合标准。PostgreSQL 是一个对象关系数据库,这意味着虽然它主要是一个关系数据库,但它还包含通常与对象数据库相关的功能(例如表继承和函数重载) 。
Postgres 能够同时高效地处理多个任务,这一特性称为并发性。它无需读锁即可实现这一目标,这要归功于其多版本并发控制 (MVCC)的实现,它确保了事务的原子性、一致性、隔离性和持久性,也称为 ACID 合规性。
PostgreSQL 的使用不如 MySQL 广泛,但仍然有许多第三方工具和库旨在简化 PostgreSQL 的使用,包括pgAdmin和Postbird。
PostgreSQL 与 MySQL 一样支持数字、字符串以及日期和时间数据类型。此外,它还支持几何形状、网络地址、位字符串、文本搜索和 JSON 条目的数据类型,以及几种特殊的数据类型。
数字类型:
数据类型 | 解释 |
---|---|
bigint |
有符号 8 字节整数。 |
bigserial |
自动递增的 8 字节整数。 |
double precision |
8 字节双精度浮点数。 |
integer |
有符号 4 字节整数。 |
numeric 或者decimal |
多种可选精度,建议在精确性至关重要的情况下使用,例如货币金额。 |
real |
4 字节单精度浮点数。 |
smallint |
有符号 2 字节整数。 |
smallserial |
自动递增的 2 字节整数。 |
serial |
自动递增的 4 字节整数。 |
字符类型:
数据类型 | 解释 |
---|---|
character |
具有指定固定长度的字符串。 |
character varying 或者varchar |
长度可变但有限的字符串。 |
text |
可变的字符串,长度不限。 |
日期和时间类型:
数据类型 | 解释 |
---|---|
date |
由日、月、年组成的日历日期。 |
interval |
一个时间跨度。 |
time 或者time without time zone |
一天中的某个时间,不包括时区。 |
time with time zone |
一天中的某个时间,包括时区。 |
timestamp 或者timestamp without time zone |
日期和时间,不包括时区。 |
timestamp with time zone |
日期和时间,包括时区。 |
几何类型:
数据类型 | 解释 |
---|---|
box |
平面上的长方形盒子。 |
circle |
平面上的一个圆圈。 |
line |
平面上的无限直线。 |
lseg |
平面上的线段。 |
path |
平面上的几何路径。 |
point |
平面上的几何点。 |
polygon |
平面上的闭合几何路径。 |
网络地址类型:
数据类型 | 解释 |
---|---|
cidr |
IPv4 或 IPv6 网络地址。 |
inet |
IPv4 或 IPv6 主机地址。 |
macaddr |
媒体访问控制 (MAC) 地址。 |
位串类型:
数据类型 | 解释 |
---|---|
bit |
固定长度的位串。 |
bit varying |
可变长度位串。 |
文本搜索类型:
数据类型 | 解释 |
---|---|
tsquery |
文本搜索查询。 |
tsvector |
文本搜索文档。 |
JSON 类型:
数据类型 | 解释 |
---|---|
json |
文本 JSON 数据。 |
jsonb |
分解的二进制 JSON 数据。 |
其他数据类型:
数据类型 | 解释 |
---|---|
boolean |
逻辑布尔值,表示true 或false 。 |
bytea |
“字节数组”的缩写,该类型用于二进制数据。 |
money |
一定数量的货币。 |
pg_lsn |
PostgreSQL 日志序列号。 |
txid_snapshot |
用户级事务 ID 快照。 |
uuid |
通用唯一标识符。 |
xml |
XML 数据。 |
如今,SQLite、MySQL 和 PostgreSQL 是世界上最流行的三个开源关系数据库管理系统。每个都有其独特的功能和局限性,并且在特定场景中表现出色。在决定使用 RDBMS 时,需要考虑很多变量,而且选择很少像选择最快的 RDBMS 或功能最多的 RDBMS 那样简单。下次我们需要关系数据库解决方案时,请务必深入研究这些工具和其他工具,以找到最适合我们需求的工具。