对一些简单sqlite4设计变化分析

1内容提要

SQLite4 is a compact, self contained, zero maintenance ACID database engine in the library, like SQLite3, but has improved interfaces and file formats.

运行时环境封装到对象中。

存储引擎使用一个好的键值:

一个单独的密钥空间大不单密钥空间和sqlite3每个表索引。
按字典顺序对键排序。
多个存储引擎,它可以在运行时转换。
磁盘上的默认存储是使用日志结构的统一数据库。


表的主键实际上用作存储引擎的键。

小数点可以使用。

默认情况下启用外部键约束和递归触发器。

覆盖指数可以显示声明。



2概述

sqlite4为sqlite3,是一种选择,而不是一种选择。sqlite3并未过时。SQLite3和qlite4将并行支持。福利不会被抛弃。sqlite3程序也将继续保持和改进。但如果有必要,新系统的设计者可以选择不sqlite4 sqlite3。现在

sqlite4试图维持sqlite3的最佳特性,解决了无法修复在sqlite3不破坏兼容性问题。SQLite3和sqlite4将继续保持相同的特点。

sqlite4是一个完整的、关系、交易、酸、SQL数据库引擎放置在图书馆与大型应用。没有服务器,I/O直接面向硬盘。
sqlite4的源代码可以被任何人以任何目的。没有版权、发布或开源代码或编译二进制文件限制。不要担心烦人的驾照。
使用动态类型,而不是大多数SQL数据库引擎使用的硬静态类型。
(默认)镜像磁盘上是一个单独的磁盘文件,以良好稳定的文件格式,使sqlite4图书馆适合作为应用文件格式。
sqlite4快速可靠,无需担心管理员会工作的很好。
sqlite4的实施只是最简单的依赖关系,所以它可以很容易地集成到嵌入式系统或其他非常规的运行环境。


常用的汇编语言,C,仍然是用于执行。相比sqlite4 sqlite3,使用C99特性,但它仍有可能使用普通的编译器compiling.sqlite4使用size_t,int64_t,uint64_t,和其他标准数据类型。

对sqlite4编程接口,sqlite3非常相似,但所有指定的前缀是由sqlite3_到sqlite4_,sqlite3老废的接口已经从sqlite4删除。添加到参数的一些功能,有时一个小小的修改参数或调整其参数的顺序。一些接口名字已被修改,以使更多的功能。一般来说,对sqlite4编程接口是sqlite3非常相似。所以对sqlite3程序sqlite4移植只需要一个小时或两小时完成搜索代替。

SQLite3和sqlite4不共享任何符号,所以它是嵌入和sqlite4 sqlite3在同一过程中同时使用它们的可行性。

3 sqlite4主要变化

3.1运行时对象

在sqlite4部分接口的第一个参数接收(新增)一sqlite4_env对象指针,它定义了运行环境,需要sqlite4_env指针的示例程序,包括:

sqlite4_open()
sqlite4_malloc()(),(),和sqlite4_realloc sqlite4_free()
sqlite4_mprintf()
sqlite4_random()
sqlite4_config()


一个sqlite4_env对象实例定义了sqlite4和其他系统之间的相互作用是互动的,sqlite4_env对象包含一个方法,可以:

互斥体的分发、进入、离开和退出
堆内存的分配、调整和释放,
访问和控制底层密钥值存储引擎,
即是高质量的随机种子初始化。
获取当前时间和日期以及本地时区,
记录错误日志消息。




标准的sqlite4建设平台(Windows和Unix)包含一个全球sqlite4_env对象,这通常是安装在平台上。如果有一个指针sqlite4_env对象在一个接口程序的参数,和指针传递给该参数为空指针,接口程序将使用默认的全局sqlite4_env对象。此外,一些应用程序可能需要两个或两个以上的在相同的地址空间sqlite4实例,每个实例使用不同的互斥原语,不同的内存堆,和不同的时间日期functions.sqlite4满足这一要求,每个数据库对象创建不同的对象instance.sqlite4_env sqlite4_env也取消全局变量和静态变量,那么T帽子sqlite4可以很方便地移植到嵌入式静态或全局数据提供有限的支持系统。

3.2简化密钥值存储引擎

关键/价值使用的sqlite4存储引擎已经大大简化了接口相对于SQLite3。这是一个可插拔的存储引擎;通过qlite4_env对象当你打开一个新的数据库连接之前要做相应的改变,它可以在运行时更改。

sqlite4需要实现有序的键/值对的存储引擎,它的键和值是任意长度的二进制数据。钥匙必须由词典独特的排序。也就是说,钥匙应根据一个比较函数进行排序,例如:

复制代码代码如下所示:

国际key_compare(const void * KEY1,int const void * N1、N2 KEY2,int){

int c = memcmp(KEY1、KEY2,N1 < N2 N1:N2);

如果(c=0)=;

返回C;

}

给定一个探头的关键,sqlite4要能够找到它最近的关键然后遍历关键字字典中的升序或降序。旧的数据是通过将数据插入到一个现有的密钥覆盖。交易,包括原子提交和回滚,负责存储引擎。

sqlite4存储所有的数据在一个单一的密钥空间通过表和索引。相反,每个表和索引在sqlite3需要一个单独的密钥空间,sqlite4存储也不同于程序,因为它需要存储引擎的字典顺序排序的键,而使用一个非常复杂的比较函数sqlite3决定记录的存储顺序。

的sqlite4和存储引擎之间的通信是通过一个明确的和简单的界面进行。新的存储引擎可以取代手术:只要指定的数据库连接所取代,在sqlite4_env对象一些函数指针可以更换。

如果更换的存储引擎不支持回滚,这意味着sqlite4不能运行回滚。如果更换的存储引擎不支持事务嵌套,这意味着sqlite4不能嵌套的事务。因此,嵌入式在sqlite4存储引擎少,系统的整体功能就越差。

内置的存储引擎是合并后的数据库的日志结构的默认。这是许多倍的速度比LevelDB,支持嵌套事务的全部内容,存储在一个单一的磁盘文件,sqlite4未来版本还包括一个使用B树结构的内置存储引擎。

3.3主键现在是真正的主键。

sqlite3允许任何单或多柱在声明表是主要的关键。但在内部,sqlite3只有主键仅仅作为一种独特的约束。在现实中,用于存储的密钥对每个行rowid。

sqlite4,相反,却将存储引擎使用声明的主键(更具体的编码值的主键)作为重点,sqlite4表通常没有rowid(除非没有主键的表,然后一个rowid是需要一个隐含的关键。)这意味着内容存储在磁盘的主要关键订单。这也意味着一个记录可以通过查询主键,主键的sqlite3,搜索工具寻找自动创建的索引rowid第一,然后做一个搜索在主基于ROWID的表。

所有的sqlite4需要主键元素不能是空的。这是SQL标准的早期版本。由于疏忽,没有在sqlite3的主键列和不强制空约束,该漏洞被发现时,程序已经得到了广泛的应用,对非空约束的激活可能导致程序太大影响。

3.4位十进制数

sqlite4使用十进制算术做所有的号码。sqlite4从不采用C型双或浮(除双和内部语言接口例程使用十进制转换之间)。相反,所有的数字值都是基于索引的3位十进制数18和10的内部表示。特征表示法:

即使在一个IEEE 754 binary64浮点数字支撑平台的情况下,操作可靠,兼容。
货币计算通常是准确的,不需要四和五的条目。
任何有符号和无符号的64位整数都可以精确地表示。
浮点数的范围和精度超过IEEE 754浮点数binary64。
正无穷和负无穷大和楠(非数字)有很好的表现。


sqlite4使整数和浮点数字没有区别。但是精确数字和近似数字之间的差异没有过期。在C和C++中,塑料的数量是准确的浮点数近似。但sqlite4未必如此。浮点数可以在sqlite4精确。你可以在sqlite4总是准确的使用64位的整数表示,而大整数数可以近似。

sqlite4数字格式是供内部使用。数字可以在整数和double之间转换,用于输入和输出。在磁盘上需要从1到12位的数字值sqlite4存储空间,根据其大小和重要的数字。

3.5个外键约束和递归触发器是默认值。

外键约束不在sqlite3的早期版本,他们默认为向后兼容。但外键约束都有效,默认打开在sqlite4。所有外键约束违约,虽然他们可以被定义为创造的。然而,没有触发外键约束的有效机制,是否这是延迟或立即创造创造。

SQLite3提供递归触发器,但这仅仅是一个在运行时是有效的功能,sqlite4,所有在所有时间段的触发是递归的。

3.6明确索引覆盖率

sqlite4就像在创建表的语句可选子句,它定义了额外的列信息重复的索引。这允许应用程序开发人员能够创建一个覆盖明确无sqlite4花招指数,例如:






创建表索引(a,b)覆盖cover1(C,D);



该指数高于cover1组成如选择C的存储引擎与一个单一的从表1在搜索业务,A = 1,B = 2 的索引查询。如果没有覆盖条款补充说,sqlite4可以存储引擎做了两次手术;基于A和B的主键值发现手术,第二操作是基于发现C和D值主键。覆盖子句使C和d值可以在索引中使用,这意味着它们不需要查找第二次可以从索引中提取。



覆盖声明有变化:






创建表的索引覆盖(x,y)覆盖所有;



覆盖所有语句意味着索引表中的所有列都由一个重复,这将确保原始数据表永远不会被访问,以完成此索引查询的使用。这种方法的缺点是当然的,而且还因为这些信息是重复的,让更多的数据库文件,但通过覆盖在索引指定关闭指标,sqlite4允许应用程序开发人员称从应用的空间和时间,使其更适用。