开源中文网

您的位置: 首页 > 数据库应用 > Berkeley DB > 正文

SQL 开发人员 Oracle Berkeley DB 指南

来源:  作者:

常常有人问 Oracle Berkeley DB “我如何在 Berkeley DB 中进行 ?"因此,我们此处将介绍如何在 Oracle Berkeley DB 中实施众多您喜爱的 SQL 功能。不是所有的 SQL 应用程序都应该在 Oracle Berkeley DB 实施( Oracle Berkeley DB 是一个开放源的嵌入式数据库引擎,提供了快速、可靠、本地的持久性,无需管理),但如果您有一系列相对固定的查询且很关心性能,Berkeley DB 将是很好的选择。

  让我们从头开始 (很好的起步点)。我们从 ABC 开始学阅读,在 Berkeley DB 中我们从术语开始。
  这里为坚定的 SQL 程序员提供了一个小型“翻译指南”:
SQL 术语
Oracle Berkeley DB 对应词汇
数据库
环境
数据库
字节组/
/数据对
主索引
次索引
次数据库
  选择一个应用程序域 — 传统员工数据库,经过一定的简化。我们进一步假定您需要所有 Berkeley DB 的全部额外特性:并发、事务、可恢复性等。
  创建数据库
  在 SQL 中,您可以执行以下命令
  CREATE DATABASE personnel
  在 Berkeley DB 中, 您想要创建一个放置所有应用程序数据的环境。在代码中,您将通过一个环境句柄来引用环境,该句柄类型为 DB_ENV。您将使用这一句柄来操作此环境。现在,将一些精妙的错误处理过程放在一边,来集中讨论 API。 
DB_ENV *dbenv; 
  int ret; 
  /* Create the handle. */ 
  DB_ASSERT(db_env_create(&dbenv, 0) == 0); 
  /* 
  * If you wanted to configure the environment, you would do that here. 
  * Configuraition might include things like setting a cache size, 
  * specifying error handling functions, specifying (different) 
  * directories in which to place your log and/or data files, setting 
  * parameters to describe how many locks you'd need, etc. 
  */ 
  /* Now, open the handle. */ 
  DB_ASSERT(dbenv->open(dbenv, "my_databases/personnel", 
  DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_THREAD, 0644);
您现在创建和打开了一个环境。需要注意几项事情:
·                            开始前必须有 my_databases/personnel 目录。
·                            open 调用的最后一个参数就是作为此环境的一部分为您创建的文件的模式。
·                            此处指定的标记将允许您创建环境
(DB_CREATE),使用锁定 (DB_INIT_LOCK);有一个共享的内存缓存池 (DB_INIT_MPOOL);使用事务 (DB_INIT_TXN);并同时在不同的控制线程中使用得到的环境句柄 (DB_THREAD)
  在 SQL 中,查询通常由单独的服务器处理,该服务器由数据库管理员配置以在您的系统上正常(或不正常)工作。因为 Berkeley DB 嵌入到了您的应用程序中,因此该应用程序可以执行许多配置工作。但这确实与数据库调优有关,我们将另文详述。

现在创建了数据库,接下来创建一些表。在 Berkeley DB 中, 表由类型为 DB * 的句柄引用 。对于应用程序中的每个表,通常会打开一个句柄,然后在一或多个线程中使用该句柄。
  因此,在 SQL 中可能是  
CREATE TABLE employee 
  (primary key empid int(8), last_name varchar(20), first_name varchar(15), 
  salary numeric(10, 2) salary, street varchar (20), city varchar (15), 
  state char(2), zip int(5))
  在我们讨论实施这一过程的 Berkeley DB 代码前,要记住在 SQL 中,数据库负责实施和解释数据模式,这很重要。在 Berkeley DB 中,这一解释由应用程序完成。在分析数据操作语言 (DML) 时这将变得更加有趣,但现在其很明显,因为在创建员工表时,Berkeley DB 只知道主键,不知道数据库中的不同域。
  首先,您需要创建一个数据库句柄来代表创建的的表。(我们再次略过错误处理。) 
DB *dbp; 
  DB_ENV *dbenv; 
  /* Let's assume we've used the code from above to set dbenv. */ 
  ASSERT(db_create(&dbp, dbenv, 0) == 0); 
  /* 
  * Like with the environment, tables can also be configured. You 
  * can specify things like comparison functions, page-size, etc. 
  * That would all go here. 
  */ 
  /* Now, we'll actually open/create the primary table. */ 
  ASSERT(dbp->open(dbp, NULL, "employee.db", NULL, DB_BTREE, 
  DB_AUTO_COMMIT | DB_CREATE | DB_THREAD, 0644) == 0).
  这一调用将使用 B-树作为主索引结构创建表。该表将在 my_databases/personnel 目录中物化,使用名称 employee.db。文件将包含一个表并具有由最后的参数 (0644) 指定的文件系统权限。指定的标记在事务中创建表,允许以后的事务操作
  (DB_AUTO_COMMIT);允许表不存在时创建表 (DB_CREATE);并指定可由多个控制线程同时使用得到的句柄 (DB_THREAD)。
  注意,您尚未指定具体由什么组成主键 (索引) 或数据字段好似存储于该表中。这都将是应用程序的任务,稍后接触到插入、选择和更新部分的内容时这将变得更清楚。
现在,我们来看看如果在 employee id 上有一个主索引同时对姓使用一个次索引时将会出现什么情况。
  您应该使用上述 SQL 查询并执行。
  CREATE INDEX lname ON employee (last_name)
  在 Berkeley DB 中,次索引就像是表。然后您可以联合表,使一个表成为另一个表的次索引。为实施这一功能,需要更深入地了解应用程序要使用的数据表示。
  假设应用程序要使用 C 结构以在我们的员工表中包含字节组。您可以按下面所示定义结构: 
typedef struct _emp_data { 
  char lname[20]; 
  char fname[15]; 
  float salary; 
  char street[20]; 
  char city[15]; 
  char state[2]; 
  int zip; 
  } emp_data;
  假设员工 ID 为简单的整数:
  typedef int emp_key;
  在 Berkeley DB 中,操作键或数据项时,您使用 DBT 结构。DBT 包含了不透明的字节串,以指针和长度来表示。指针由 DBT 的数据字段引用,长度存储于 DBT 的大小字段中。如果希望操纵表示一个员工的键/数据对,您需要将一个 DBT 用于 emp_key,另一个用于 emp_data。  
DBT key_dbt, data_dbt; 
  emp_key ekey; 
  emp_data edata; 
  memset(&key_dbt, 0, sizeof(key_dbt)); 
  memset(&data_dbt, 0, sizeof(data_dbt)); 
  /* 
  * Now make the key and data DBT's reference the key and data 
  * variables. 
  */ 
  key_dbt.data = &ekey; 
  key_dbt.size = sizeof(ekey); 
  data_dbt.data = &edata; 
  data_dbt.size = sizeof(edata);
  这里我们可以了解到 SQL 中的字节组由键/数据对表示,应用程序负责了解如何解释这些对。

Tags:开发人员 Oracle Berkeley
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明