SQLite:一个轻量级数据库

简介

SQLite是一个关系数据库管理系统,包含在一个C编程库中。与许多其他数据库管理系统相比,SQLite不是客户机-服务器数据库引擎。相反,它被嵌入到最终程序中。

SQLite是acid兼容的,并且实现了大多数SQL标准,通常遵循PostgreSQL语法。然而,SQLite使用动态的弱类型SQL语法,这并不保证域的完整性。例如,这意味着可以将字符串插入定义为整数的列中。SQLite将尝试在适当的格式之间转换数据,在本例中,将字符串“123”转换为整数,但不保证这种转换,如果不能进行这种转换,则按原样存储数据。

SQLite是应用软件(如web浏览器)中用于本地/客户机存储的嵌入式数据库软件的流行选择。可以说,它是部署最广泛的数据库引擎,因为目前有许多广泛使用的浏览器、操作系统和嵌入式系统(如移动电话)都在使用它。SQLite绑定到许多编程语言。

设计

与客户机-服务器数据库管理系统不同,SQLite引擎没有应用程序与之通信的独立进程。相反,SQLite库被链接进来,从而成为应用程序不可分割的一部分。链接可以是静态的,也可以是动态的。应用程序通过简单的函数调用使用SQLite的功能,这减少了数据库访问中的延迟:单个进程中的函数调用比进程间通信更有效。

SQLite将整个数据库(定义、表、索引和数据本身)存储为主机上的一个跨平台文件。它通过在编写过程中锁定整个数据库文件来实现这种简单的设计。SQLite读操作可以是多任务的,但是写操作只能按顺序执行。

由于没有服务器的设计,SQLite应用程序比客户机-服务器数据库需要更少的配置。SQLite被称为zero-conf,因为它不需要服务管理(例如启动脚本)或基于GRANT和密码的访问控制。访问控制是通过授予数据库文件本身的文件系统权限来处理的。客户机-服务器系统中的数据库使用文件系统权限,该权限只允许守护进程访问数据库文件。

无服务器设计的另一个含义是,多个进程可能无法写入数据库文件。在基于服务器的数据库中,几个写入器都将连接到同一个守护进程,该守护进程能够在内部处理锁。另一方面,SQLite必须依赖于文件系统锁。它对同时访问数据库的其他进程的了解较少。因此,SQLite不是写密集型部署的首选。然而,对于并发性很少的简单查询,SQLite的性能得益于避免了将数据传递给另一个进程的开销。

SQLite使用PostgreSQL作为参考平台。“PostgreSQL会做什么”用来理解SQL标准。一个主要的偏差是,除了主键之外,SQLite不强制执行类型检查;值的类型是动态的,不受模式的严格限制(尽管模式在存储时将触发转换,如果这种转换可能是可逆的)。SQLite努力遵循Postel的规则。

特性

SQLite实现了SQL的大部分SQL-92标准,但是它缺少一些特性。例如,它部分地提供了触发器,并且不能写入视图(但是它提供的是提供该功能的触发器而不是触发器)。虽然它提供了复杂的查询,但它仍然具有有限的ALTER TABLE函数,因为它不能修改或删除列。

SQLite为sql兼容的DBMS使用了一种不同寻常的类型系统;与大多数SQL数据库系统中为列分配类型不同,类型被分配给各个值;在语言术语中,它是动态类型的。此外,它的弱类型与Perl相同:可以将字符串插入到整数列中(尽管SQLite将首先尝试将字符串转换为整数,如果列的首选类型是integer)。这增加了列的灵活性,特别是绑定到动态类型脚本语言时。但是,该技术不能移植到其他SQL产品。一个常见的批评是SQLite的类型系统缺乏其他产品中静态类型列提供的数据完整性机制。SQLite web站点描述了一种“严格关联”模式,但是还没有添加此功能。然而,它可以通过像CHECK(typeof(x)=‘integer’)这样的约束来实现。[13]表通常包含一个隐藏的rowid索引列,它提供更快的访问速度。如果数据库包含一个整数主键列,SQLite通常会将其作为rowid的别名进行优化,使内容存储为严格类型的64位带符号整数,并将其行为更改为类似于自动递增列。SQLite的未来版本可能包含一个命令,用于反省列是否具有与rowid类似的行为,以便将这些列与弱类型的、非自动递增的整数主键区分开来。

带有完整Unicode函数的SQLite是可选的。

多个计算机进程或线程可以同时访问同一个数据库。可以并行地满足多个读访问。只有在当前没有服务其他访问的情况下,才能满足写访问。否则,写访问将由于错误代码而失败(或者可以自动重试,直到可配置超时过期为止)。在处理临时表时,这种并发访问情况会发生变化。当在3.7版本中启用写前日志(WAL)以支持并发读写时,这个限制得到了放松

SQLite版本3.7.4首先添加了FTS4(全文搜索)模块,它在较老的FTS3模块的基础上进行了增强。 FTS4允许用户对类似于搜索引擎搜索网页的文档执行全文搜索。版本3.8.2增加了对创建没有rowid的表的支持,可以提供空间和性能改进。公共表表达式支持在3.8.3.版本中添加到SQLite

2015年,随着json1扩展和新的子类型接口,SQLite version 3.9引入了JSON内容管理。

总结

总的来说适用于桌面级本地存储,不适用于网络数据库。缺少了并发性,功能也有所阉割。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值