Berkeley DB的数据存储结构

BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)。在创建数据库的时候,必须通过dbtype参数将存储结构指定为上述结构中的一种,一旦数据库文件已创建则不能再更改其结构。

结构 描述
BTree 数据存储在一个有序的,平衡的树型结构中。在B树结构中,Key和Value都可以复杂的数据,这意味着它们可以是整数、字符串或复杂的数据结构。同时,这种结构允许重复的Key值,即两个记录拥有同样的Key(需要在创建数据库时打开XXX开关)。
哈希 数据存储在一个扩展的线性哈希表。同B树类似,Key和Value可以是复杂的数据,它也支持相同Key的记录(需要打开XXX)
队列 数据存储在一个固定记录长度的队列中。每个记录使用一个逻辑记录号作为它的Key。这种结构有利于快速在尾部插入,而且针对这种结构有一个专用的操作可以让你从队列头部删除并返回数据。这种结构的特点在于它提供记录级的锁,这非常有利于在并发访问队列时提供更高的性能。
记录号 基本同队列类似,它也使用一个逻辑记录号作为Key,但这里的记录可以是定长的,也可以是不定长的

B树(BTree)

通过指定dbtype=db.DB_BTREE用哈希表作为存储结构。B树中的B是Balanced的缩写,实际使用过程中,B树同哈希表基本一样。

哈希表(Hash)

通过指定dbtype=db.DB_HASH使用哈希表作为存储结构。

队列(Queue)

通过指定dbtype=db.DB_QUEUE使用队列作为存储结构。初次使用这种结构你能感觉到它与B树和哈希有较大的差异。

>>> from bsddb import db >>> quedb = db.DB() >>> quedb.open('quedb.db',dbtype=db.DB_QUEUE,flags=db.DB_CREATE) >>> quedb.put("number1","1") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: String keys not allowed for Recno and Queue DB's >>>

上面的代码我们新建了一个名字为quedb的队列数据库,在使用我们熟悉的put方法时出错,原因是队列类型是不接受字符串类型的Key名称,Key只能是数字。

>>> quedb.put(1,"first item") >>> print quedb.items() [(1, 'first item ')]

实际应用中,经常Key对我们来说并不重要,我们可以使用一个简化的append方法向队列添加元素,这个方法会将添加元素的Key(记录号)作为返回值:

>>> quedb.append("second item") 2 >>> print quedb.items() [(1, 'first item '), (2, 'second item ')]

在队列中仍可以使用get方法获取值、使用put方法更改值,以及使用delete删除值:

>>> print quedb.get(1) first item >>> quedb.put(1,"1st item") >>> print quedb.items() [(1, '1st item '), (2, 'second item ')] >>> quedb.delete(1) >>> print quedb.items() [(2,'second item ')]

你可能想让这种数据结构操作起来也更像一个队列。可以使用另一个简化的功能consume,这样我们使用append在队列尾部加入数据,使用consume取出队列首部的数据,很方便地实现了FIFO的操作:

>>> quedb.append("third item") 3 >>> quedb.consume() ('\x02\x00\x00\x00', 'second item ')>>> quedb.consume() ('\x03\x00\x00\x00', 'third item ') >>> quedb.consume() >>>

记录号

记录号数据结构有些特性和队列很类似,它支持put,get,append,delete等方法,同样,它的Key也只能是数字类型。需要注意的是,在创建数据库之前不需要指定记录长度,它也不能象队列类型那样使用consume方法。

选择正确的数据结构

首先你要知道准备使用BDB解决什么样的问题,如果你需要存储复杂的数据(包括字符串),那么你应当使用B树或者哈希。如果你想使用逻辑编号,那么应当使用队列或记录号。 
那么问题来了,在B树、哈希,队列、记录号之间应当如何做选择呢?

选择B树还是哈希?

当在主键有序时,Btree算法应该被使用。

Hash 和 Btree 两种方式在小的数据集合上几乎没有性能的差别。不过,由于Hash使用的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进行适当的调整。所以当一个数据集合足够大且关键字为随机分布时,采用Hash算法比较好。

选择队列还是记录号?

当用记录号作为数据存取的主键时,应该使用 Queue和Recno存取方法。记录号由算法本身生成。实际上,这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。两者基本上都是建立在Btree算法之上,提供存储有序数据的接口。Queue的优势在于:由于其记录为定长,在插入操作时把记录插入到队列的尾部,所以速度最快,而且它执行上锁和并发处理的水平也相当高。 Recno 的长处在于它支持一些Queue不能实现的特征,比如可变长记录和支持flat-text文件。记录号可以是可变的或者不变的: 可变指的是当记录被删除或者插入记录号发生变化;不变指的是记录号无论数据库如何操作,记录号都不会发生改变。 Recno 可以被设置为不变和可变两种形式。

转载于:https://www.cnblogs.com/bonelee/p/6251280.html

Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...相关推荐

  1. 纸上谈兵: 哈希表 (hash table)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...

  2. 学习数据结构笔记(8) ---[哈希表(Hash table)]

    B站学习传送门–>尚硅谷Java数据结构与java算法(Java数据结构与算法) 一般在java程序访问数据库时都会安排从内存的缓存层中取数据;之前的做法是自己写个哈希表,实现对数据的缓存. 哈 ...

  3. PHP关联数组和哈希表(hash table) 未指定

    PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...

  4. 【散列表(哈希表) Hash Table(上)】:Word文档中的单词拼写检查功能是如何实现的?

    Word 这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word 的这个 ...

  5. 【C++ 包装器类 map】C++ 标准库(std)中的map结构 哈希表(unordered_map)和黑红树(map)教程

    目录标题 1. 哈希表(unordered_map)和黑红树(map)简介以及初始化 1.1 哈希表的基本介绍 1.1.1 哈希表初始化接口示例 1.1.2 哈希表的键值的注意事项 1.1.3 自定义 ...

  6. 【Python算法】哈希存储、哈希表、散列表原理

    哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...

  7. 哈希存储、哈希表原理

    哈希表的定义 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中. ...

  8. 【MongoDB】——数据存储结构与基本数据类型

    MongoDB数据存储结构 1.基本概念 在MongoDB中数据存储的基本概念是数据库.集合.文档. 文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行 ...

  9. Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

最新文章

  1. 总结一下“网络连接受限制”无法上网的解决办法
  2. 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题
  3. 第十六届全国大学智能车竞赛东北赛区报名信息统计
  4. validate做前端表单验证
  5. android 九宫格虚线,形状Drawable和九宫格
  6. 自问自答:在VB中如何实现像C++一样printf的功能
  7. Java设计模式之观察者Observer模式代码示例
  8. ai系统架构_人工智能中的模糊逻辑系统架构
  9. Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”
  10. html5如何进行测试,HTML5
  11. Nginx官网提供的版本类型
  12. netdev_priv() 函数
  13. 计算机组成原理—算数逻辑单元
  14. linux sar 历史负载,sar 查看历史负载
  15. 从自建服务器到选择阿里云 慎重选择
  16. plsqldevelop破解方法
  17. 科学计算机带度分秒,科学计算器度分秒
  18. 将数字金额转换成大写金额
  19. 嵌入式技术与应用专业毕业以后可以做什么?
  20. .7z.001 这种让人头疼的分卷格式

热门文章

  1. python txt提取特定数据_Python提取列表中的内容 用“python”怎么提取文件里的指定内容?...
  2. linux系统系统盘制作工具,轻松制作Linux系统启动盘的四种方法
  3. python zipfile_Python 学习入门(16)—— zipfile
  4. gis属性表怎么导成excel_使用Python脚本将Excel表批量赋值到ArcGIS属性表
  5. 服务器有操作系统吗,云服务器有操作系统吗
  6. 【微信小程序企业级开发教程】界面跳转方法总结
  7. 公共基础选择题—关系代数和范式
  8. JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义
  9. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_WhatsApp缓冲区漏洞曝光 攻击者可通过MP4文件执行远程代码...
  10. linux软中断优先级,Linux中软中断机制分析