开发业务系统时,是绕不开RDBMS
(关系型数据库)的。虽然现在诞生了各种NoSQL
的数据库,RDBMS
在业务系统中的严谨和优势依然无法取代。
近几年大大小小的项目中,常用的三种RDBMS
(SQLite
,MySQL
,Postgres
)都有多次接触过,一些使用心得记录如下,供大家参考。
1. SQLite
SQLite
是一个独立的、基于文件的、完全开源的RDBMS
。它以可移植性、可靠性和强大的性能而闻名,即使在低内存环境中也能很好的发挥作用。
SQLite
被描述为“无服务器”数据库。大多数关系数据库引擎是作为服务器进程实现的,应用程序通过进程间通信的方式与数据库服务器进行通信。
而SQLite
允许任何访问数据库的进程直接读写数据库磁盘文件。这大大简化了SQLite
的使用,你可以像访问文件一样使用SQLite
,几乎不需要任何配置。
1.1. 优势
它的优势总结起来有3点:占用空间小;用户友好;便携式。
占用空间小:顾名思义,SQLite
库非常轻量级。它占用的空间不到600KiB
。此外,它是完全自包含的,这意味着你不必在系统上安装任何外部依赖项就可以使用SQLite
。
用户友好:SQLite
开箱即用,被描述为“零配置”数据库。而且SQLite
不作为服务器进程运行,这意味着它永远不需要停止、启动或重新启动,也不需要管理任何配置文件。这些特性有助于简化SQLite
与应用程序集成的过程。
便携式:与其他数据库管理系统(通常将数据存储为大量单独的文件)不同,整个SQLite
数据库存储在单个文件中。此文件可以位于目录层次结构中的任何位置,并且可以通过可移动媒体或文件传输协议共享。
1.2. 劣势
虽然轻巧好用,但是与传统数据库相比,SQLite
的劣势也很明显。
有限并发:虽然多个进程可以同时访问和查询SQLite
数据库,但在任何给定时间只有一个进程可以对数据库进行更改。
无用户管理:数据库系统通常支持用户,或具有预定义的数据库和表访问权限的托管连接。由于SQLite
直接读写普通磁盘文件,因此唯一适用的访问权限是底层操作系统的典型访问权限。
安全:使用服务器的数据库引擎比SQLite
这类无服务器数据库有更好的应用程序漏洞保护。此外,由于服务器是单个持久进程,因此客户端-服务器的数据库可以比无服务器数据库更精确地控制数据访问,允许更细粒度的锁定和更好的并发性。
1.3. 适用的场景
SQLite
适用于以下的场景:嵌入式应用程序:SQLite
对于需要可移植性且不需要未来扩展的应用程序来说是绝佳选择。比如单用户本地应用、移动的应用或游戏。
替代直接用文件保存的数据:如果你的应用程序用文件来保存数据,可以尝试用SQLite来替换,可以获得使用SQL
所带来的额外功能和简单性。
测试:对于许多应用程序来说,可将SQLite
用于快速运行测试的数据库,这样就不需要实际数据库操作的开销,使其成为测试的理想选择。
1.4. 不适用的场景
对于以下场景,请谨慎使用SQLite
:处理大量数据:SQLite
虽然在技术上可以支持高达140 TB
的数据库,只要磁盘驱动器和文件系统也支持数据库的大小要求。然而,SQLite
建议任何接近1 TB
的数据库都放在客户端-服务器的数据库上。
高写入量:SQLite
在任何给定时间只允许发生一次写入操作,这大大限制了其吞吐量。如果您的应用程序需要大量的写操作或多个并发编写器,SQLite
可能无法满足您的需求。
需要网络访问:因为SQLite
是一个无服务器数据库,它不提供对其数据的直接网络访问。如果SQLite中的数据位于与应用程序不同的机器上,建议使用客户端-服务器的DBMS
。
2. MySQL
MySQL
是为了速度和可靠性而设计的,完全遵守标准SQL。
与使用SQLite
的应用程序不同,使用MySQL
数据库的应用程序通过单独的守护进程访问它。由于服务器进程位于数据库和其他应用程序之间,因此可以更好地控制谁可以访问数据库。
2.1. 优势
MySQL
的优势主要有:普及性和易用性:作为世界上最流行的数据库系统之一,很容易找到有MySQL
工作经验的数据库管理员。同样,有大量关于如何安装和管理MySQL
数据库的在线文档。还有许多第三方管理工具-比如phpMyAdmin
。
安全:MySQL
安装时附带了一个脚本,可以帮助您通过设置安装的密码安全级别、定义root用户的密码、删除匿名帐户以及删除默认情况下所有用户都可以访问的测试数据库来提高数据库的安全性。另外,与SQLite
不同,MySQL
支持用户管理,并允许逐个用户授予不同的访问权限。
速度:MySQL开发人员优先考虑速度。虽然最近的基准测试表明,其他RDBMS
(如Postgres
)在速度方面可以匹配或至少接近MySQL
,但MySQL
仍然是一个非常快速的数据库解决方案。
复制:MySQL
支持许多不同类型的复制,这是在两个或多个主机上共享信息的做法,以帮助提高可靠性,可用性和容错性。这有助于设置数据库备份解决方案或水平扩展数据库。
2.2. 劣势
MySQL的劣势主要有:已知限制:由于MySQL
是为了速度和易用性而设计的,而不是完全符合SQL,因此它具有某些功能限制。
许可和专有功能:MySQL
是双重许可的软件,其中一个免费和开源社区版本在GPL v2下许可,还有几个付费商业版本在专有许可下发布。
发展缓慢:自从MySQL项目在2008年被Sun Microsystems收购,后来又在2009年被Oracle公司收购以来,用户一直抱怨DBMS的开发过程显着放缓。
2.3. 适用的场景
MySQL
适用于以下的场景:分布式操作:MySQL
的复制支持使其成为分布式数据库设置的绝佳选择,如主次或主主架构。
各种应用程序:MySQL
为互联网上的许多网站和应用程序提供支持。这在很大程度上要归功于安装和设置MySQL
数据库的简单性,以及从长远来看它的整体速度和可扩展性。
未来增长比较快:MySQL
的复制支持可以帮助促进水平扩展。此外,升级到商业MySQL
产品也比较简单。
2.4. 不适用的场景
以下场景,需谨慎使用MySQL
:SQL兼容性要求高:由于MySQL
不尝试实现完整的SQL标准,因此该工具并不完全符合SQL标准。如果您的用例必须完全甚至接近完全的SQL兼容性,那么您可能希望使用更完全兼容的DBMS。
并发性和大数据量:虽然MySQL
通常在读操作方面表现良好,但并发读写可能会有问题。如果您的应用程序将有许多用户同时向其写入数据,那么像Postgres
这样的其他RDBMS
可能是更好的数据库选择。
3. Postgres
PostgreSQL
,也被称为Postgres
,自称为“最先进的开源关系数据库”,它的创建目标是高度可扩展和符合标准。
Postgres
能够同时有效地处理多个任务,它在没有读锁的情况下实现了这一点。
3.1. 优势
Postgres
的优势主要有:SQL合规性:与SQLite
或MySQL
相比,PostgreSQL
旨在严格遵守SQL标准。
开源和社区驱动:一个完全开源的项目,PostgreSQL的源代码是由一个大型的社区开发的。Postgres
社区维护并贡献了许多描述如何使用DBMS的在线资源,包括官方文档,PostgreSQL wiki
和各种在线论坛。
可扩展性:用户可以通过编程方式扩展PostgreSQL
,并通过其目录驱动操作和动态加载的使用进行动态扩展。
3.2. 劣势
Postgres
的劣势主要有:内存性能:对于每个新的客户端连接,PostgreSQL
都会派生一个新的进程。每个新进程都分配了大约10MB的内存,这对于具有大量连接的数据库来说可以快速增加。因此,对于简单的读重操作,PostgreSQL
通常比其他RDBMS
(如MySQL
)性能差。
流行度:尽管近年来使用越来越广泛,但PostgreSQL
在流行度方面一直落后于MySQL
。所以,帮助管理PostgreSQL数据库的第三方工具仍然很少。类似地,具有管理Postgres
数据库经验的数据库管理员并不多。
3.3. 适用的场景
Postgres
适用于以下的场景:数据完整性要求高:PostgreSQL
自2001年以来一直完全符合ACID,以确保数据保持一致,使其成为数据完整性至关重要的RDBMS
的强有力选择。
与其他工具的集成:PostgreSQL
与各种编程语言和平台兼容。如果您需要将数据库迁移到另一个操作系统或将其与特定工具集成,使用PostgreSQL
数据库可能比使用其他DBMS
更容易。
复杂操作:Postgres
可以利用多个CPU以更快的速度查询。再加上它对多个并发编写器的强大支持,使其成为数据仓库和在线事务处理等复杂操作的绝佳选择。
3.4. 不适用的场景
以下场景,需谨慎使用Postgres
:速度要求高:以速度为代价,PostgreSQL
在设计时考虑了可扩展性和兼容性。如果您的项目需要尽可能快的读取操作,PostgreSQL
可能不是最佳选择。
简单的设置:由于其庞大的功能集和对标准SQL的严格遵守,Postgres
对于简单的数据库设置来说可能是矫枉过正的。对于需要速度的读取繁重操作,MySQL通常是更实用的选择。
复杂的复制:尽管PostgreSQL
确实为复制提供了强大的支持,但它仍然是一个相对较新的特性,某些配置(如主—主架构)只能使用扩展。复制是MySQL
上一个更成熟的功能,许多用户认为MySQL
的复制更容易实现,特别是对于那些缺乏必要的数据库和系统管理经验的用户。