2.2 Berkeley DB和S0Lite与普通数据库的差别
Berkeley DB引入了一些新的基本概念,使得数据库应用程序访问和管理数据库变得相对简单起来。
(1) 关键字和数据
关键字(key)和数据(data)是。Berkeley.DB用来进行数据库管理的基础,由这两者构成的key/data对,组成了数据库中的一个基本结构单元。整个数据库实际上就是由许多这样的结构单元构成的。通过使用这种方式,在通过API函数访问数据库时,只需提供关键字就能够访问到相应的数据。
关键字和数据在Berkeley DB中都是用一个名为DBT的简单结构来表示的。实际上两者都可以是任意长度的二进制数据。DBT的作用主要是保存相应的内存地址及其长度,其结构如下所示:
typedef struct
{
void*data;
u_int32_t size;
u_int32_t ulen;
u_int32_f dlen;
u_int32_f doff;
u_int32_f flags;
} DBT;
在使用Berkeley DB进行数据管理时,缺省情况下是一个关键字对应于一个数据;但也可以将数据库配置成一个关键字对应于多个数据,而键值和数据必须是类com.sleepycat.db.Dbt的对象或其子类的对象。
(2) 对象句柄
在Berkeley DB函数库定义的大多数函数都遵循同样的调用原则:首先创建某个结构,然后再调用该结构中的某些方法。从程序设计的角度来讲,这一点同面向对象的设计原则是非常类似的,即先创建某个对象的一个实例,然后再调用该实例的某些方法。正因为如此,.Berkeley DB引入了对象句柄的概念来表示实例化后的结构,并且将结构中的成员函数称为该句柄的方法。对象句柄的引入使得程序员能够凭借面向对象的思想,来完成对Berkeley DB数据库的访问和操作。
(3) 错误处理
对于任何一个函数库来说,如何对错误进行统一的处理都是需要考虑的问题。Berkeley DB提供的所有函数都遵循同样的错误处理原则,即函数成功执行后返回零,否则返回非零值。
对于系统错误(如磁盘空间不足),返回的是一个标准的值;而对于非系统错误,返回的则是一个特定的错误编码。例如,如果在数据库中没有与某个特定关键字所对应的数据,那么在通过该关键字检索数据时就会出现错误。此时函数的返回值将是DB—NOTF0uND,表示在数据库中并没有所请求的关键字。所有标准的e rrn0值都大于零,而由Berkeley DB定义的特殊错误编码则都小于零。
Berkeley DB提供了相应的函数来获得错误代号所对应的错误描述。一旦有错误发生,只需首先调用db_strerror( )函数来获得错误描述信息,然后再调用DB一>err()或DB->errx()就可以很轻松地输出格式化后的错误信息。
而SQLite最大的特点在于其数据类型为无数据类型(typelessness)。这意味着可以保存任何类型的数据到所想要保存的任何表的任何列中,无论这列声明的数据类型是什么。虽然在生成表结构的时候,要声明每个域的数据类型,但sQLite并不做任何检查。开发人员要靠自己的程序控制输入与读出数据的类型。这里有一个例外,就是当主键为整型值时,如果要插入一个非整型值时会产生异常。
诚然,SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如VARCHAR、NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。
另外,虽然在插入或读出数据的时候是不区分类型的,但在比较的时候,不同数据类型是有区别的。比如:
CREATE TABLE MyTable (a INTEGER,b TEXT);
INSERT INT0 MyTable VALIUES(0,0);
当执行查询SELECT count(*)FROM MyTable WHERE a==’00’;时,会返回一条记录。因为字段a的类型是整型,而数字00与0是相等的。而执行查询SELECT count(*)FROM MyTable WHERE b==‘00’:时,则不会返回记录。因为字段b是字符类型,字符“00”与“0”是不相等的。
|