赞
踩
关系数据模型以行和列的表格形式组织数据,在数据库管理工具中占主导地位。今天还有其他数据模型,包括NoSQL和NewSQL,但是关系数据库管理系统(RDBMS)仍然占主导地位用于存储和管理全球数据。
本文比较了三种实现最广泛的开源RDBMS:SQLite、MySQL和PostgreSQL。具体来说,本章将探讨每种RDBMS使用的数据类型、它们的优缺点,以及它们最适合优化的情况。
数据库是对信息或数据进行逻辑建模的集群。另一方面,数据库管理系统 (DBMS)是与数据库交互的计算机程序。DBMS允许你控制对数据库的访问、写入数据、执行查询以及执行与数据库管理相关的任何其他任务。
虽然数据库管理系统通常被称为“数据库”,但这两个术语是不可互换的。数据库可以是任何数据集合,而不仅仅是存储在计算机上的数据。相比之下,DBMS特指允许您与数据库交互的软件。
所有数据库管理系统都有一个底层模型,该模型对数据的存储和访问方式进行结构化。关系数据库管理系统是一种采用关系数据模型的DBMS。在这种关系模型中,数据被组织成表。表,在RDBMS的上下文中,更正式的叫法是关系(relations)。关系是一组元组(tuples) 的集合,它们是表中的行,每个元组共享一组属性(attributes),这些属性是表中的列:
大多数关系型数据库使用结构化查询语言 (SQL)来管理和查询数据。然而,许多关系数据库使用自己的SQL方言,这可能有一定的限制或扩展。这些扩展通常包含额外的特性,允许用户执行比标准SQL更复杂的操作。
注意: 术语“标准SQL”在本指南中出现多次。SQL标准由美国国家标准协会(ANSI)、国际标准化组织(ISO)和国际电工委员会(IEC)共同维护。当本文提到“标准SQL”或“SQL标准”时,它指的是这些机构发布的SQL标准的当前版本。
需要注意的是,完整的SQL标准既庞大又复杂:完整的核心SQL:2011要求179个功能。正因为如此,大多数RDBMS并不支持整个标准,尽管有些RDBMS确实比其他RDBMS更接近于完全遵从标准。
每一列都有一个数据类型,它规定了该列中允许哪些类型的项。不同的RDBMS实现不同的数据类型,这些类型并不总是可以直接互换。一些常见的数据类型包括日期、字符串、整数和布尔值。
在数据库中存储整数比在表中存储数字要微妙得多。数值数据类型可以是有符号(signed),这意味着它们可以表示正数和负数,也可以是无符号(unsigned),这意味着它们只能表示正数。例如,MySQL的tinyint
数据类型可以保存8位数据,相当于256个可能的值。这个数据类型的有符号范围是-128 ~ 127,无符号范围是0 ~ 255。
能够控制哪些数据可以进入数据库是很重要的。有时,数据库管理员会对表施加约束(constraint),以限制可以输入的值。一个约束通常应用于一个特定的列,但一些约束也可以应用于整个表。下面是一些SQL中常用的约束:
UNIQUE
:将此约束应用于列,确保该列中没有两个元素是相同的。NOT NULL
:这个约束确保列不包含任何NULL
元素。PRIMARY KEY
: UNIQUE
和NOT NULL
的组合,PRIMARY KEY
约束确保列中没有NULL
条目,并且每个条目都是不同的。FOREIGN KEY
:FOREIGN KEY
是一张表中的一列,指向另一张表的PRIMARY KEY
。此约束用于将两个表链接在一起。FOREIGN KEY
列的条目必须已经存在于父PRIMARY KEY
列中,这样写进程才能成功。CHECK
:这个约束限制了列可以输入的值的范围。例如,如果这一列是手机号码,则可以在邮政编码列上添加一个CHECK
约束,使条目只允许在13位数。现在我们已经大体上介绍了关系数据库管理系统,让我们转到本文将介绍的三个开源关系数据库中的第一个: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-16 BE或UTF-16 LE。 |
blob | 任何数据blob,每个blob完全按照输入的方式存储。 |
在SQLite的上下文中,术语“存储类”和“数据类型”是可以互换的。如果您想了解有关SQLite的数据类型和SQLite类型关联的更多信息,请查看SQLite的官方文档。 |
根据DB-Engines排名,从2012年开始跟踪数据库流行程度以来,MySQL一直是最受欢迎的开源RDBMS。它是一个功能丰富的产品,为世界上许多最大的网站和应用程序提供支持,包括阿里巴巴、腾讯、Facebook、Netflix和Spotify。开始使用MySQL是相对简单的,这在很大程度上要感谢它的详尽的文档和大型的开发者社区,以及丰富的MySQL相关在线资源。
MySQL的设计追求的是速度和可靠性,但代价是完全遵循标准SQL。MySQL开发人员不断地朝着遵循标准SQL的方向努力,但它仍然落后于其他SQL实现。然而,它确实提供了各种SQL模式和扩展,使其更接近合规性。
与使用SQLite的应用程序不同,使用MySQL数据库的应用程序通过一个单独的守护进程访问它。因为服务器进程位于数据库和其他应用程序之间,所以它可以更好地控制谁有权访问数据库。
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 | 时间戳,表示自Unix纪元(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 | 最大数据长度为255(2^8 - 1)字节的 blob 列。 |
mediumblob | 最大数据长度为16777215(2^24 - 1)字节的 blob 列。 |
longblob | 最大数据长度为4294967295(2^32 - 1)字节的 blob 列。 |
text | 最大长度为65535(2^16 - 1)个字符的字符串。 |
tinytext | 最大长度为255(2^8 - 1)个字符的 text 列。 |
mediumtext | 最大长度为16777215(2^24 - 1)个字符的 text 列。 |
longtext | 最大长度为4294967295(2^32 - 1)个字符的 text 列。 |
enum | 枚举,它是一个字符串对象,从创建表时声明的值列表中获取单个值。 |
set | 与枚举类似,一个字符串对象,可以有零个或多个值,每个值必须从创建表时指定的允许值列表中选择。 |
FULL JOIN
子句的支持。PostgreSQL,也被称为Postgres,自称是“世界上最先进的开源关系型数据库”。它的创建目标是高度可扩展和符合标准。PostgreSQL是一个对象关系型数据库,这意味着尽管它主要是一个关系型数据库,但它也包括一些特性,如表继承和函数重载,这些特性通常与对象数据库相关。
Postgres能够同时高效地处理多个任务,这种特性被称为并发。由于它实现了多版本并发控制(MVCC,它无需读锁就能实现这一点,该实现确保了事务的原子性、一致性、隔离性和持久性,也称为ACID一致性。
PostgreSQL不像MySQL那样被广泛使用,但是仍然有一些第三方工具和库旨在简化PostgreSQL的使用,包括pgAdmin和Postbird。
PostgreSQL支持数字、字符串、日期和时间数据类型,如MySQL。此外,它还支持几何形状、网络地址、Bit串、文本搜索和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 | 日期和时间,包括时区。 |
Geometric types:
数据类型 | 说明 |
---|---|
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 | 是“byte array”的缩写,这种类型用于二进制数据。 |
money | 货币数量 |
pg_lsn | PostgreSQL日志序列号。 |
txid_snapshot | 用户级事务ID快照。 |
uuid | 通用唯一标识符。 |
xml | XML数据。 |
如今,SQLite、MySQL和PostgreSQL是世界上最流行的三个开源关系型数据库管理系统。每个都有自己独特的功能和限制,并在特定场景中表现出色。在决定使用哪种RDBMS时,有很多变量在起作用,选择最快的或功能最多的RDBMS很少像选择那么简单。下次需要关系型数据库解决方案时,请务必深入研究这些工具和其他工具,以找到最适合您需求的工具。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。