Database 为什么一些键值数据存储拒绝表/存储桶的概念? 一些关键值数据存储(例如伯克利DB的C版本,基础DB,SQLite 4内核)使用平坦的键值空间,也就是说,它们没有桶的概念,据我所见,支持分组数据的唯一方法是将一部分密钥与相应的表/桶相关联,或者,如果不需要扫描,至少在值中嵌入一些类型标记

Database 为什么一些键值数据存储拒绝表/存储桶的概念? 一些关键值数据存储(例如伯克利DB的C版本,基础DB,SQLite 4内核)使用平坦的键值空间,也就是说,它们没有桶的概念,据我所见,支持分组数据的唯一方法是将一部分密钥与相应的表/桶相关联,或者,如果不需要扫描,至少在值中嵌入一些类型标记,database,key-value-store,Database,Key Value Store,嵌入类型信息(例如,在关键字前加上bucket name)似乎会不可避免地增加数据存储的大小,但对此类数据存储的用户没有明显的好处。 另一方面,分离数据存储,例如使用一个bucket-一个数据存储方案可能无法很好地处理涉及多个bucket的事务 鉴于此,我想知道拒绝桶有什么好处,为什么数据存储引擎的作者可以考虑这样做?除了数据存储的简单性和通过一系列易于编码的扫描操作获取整个数据存储的内容之外,可能还有其他好处。至少最新版本的BerkeleyDB支持多个存储桶,即您可以在同一环境中创建多个“数据

嵌入类型信息(例如,在关键字前加上bucket name)似乎会不可避免地增加数据存储的大小,但对此类数据存储的用户没有明显的好处。 另一方面,分离数据存储,例如使用一个bucket-一个数据存储方案可能无法很好地处理涉及多个bucket的事务


鉴于此,我想知道拒绝桶有什么好处,为什么数据存储引擎的作者可以考虑这样做?除了数据存储的简单性和通过一系列易于编码的扫描操作获取整个数据存储的内容之外,可能还有其他好处。

至少最新版本的BerkeleyDB支持多个存储桶,即您可以在同一环境中创建多个“数据库”,事务跨越针对同一环境创建的所有数据库

在sqlite 4或sqlite 3 lsm扩展的情况下,可能是为了保持简单

实际上,只有wiredtiger才有多个表。据我所知,这是一个优化


请注意,FoundationDB有
子空间
目录

的概念,我想你说的是Java中的Berkeley DB,而不是BDB的C版本(正如我在文章中指出的)。如果我没有遗漏一些东西,那么它仍然没有bucket的概念——我正在阅读“伯克利DB数据库可以被认为是一个更大数据库中的一个表。”对于我来说,table==bucket。我遗漏了什么。是的,但就我所见,事务不能跨越多个DB。如果使用多个数据库,则必须是应用程序级2PC协议或类似协议才能实现ACID。
DB_TXN
方法附加到
DB_ENV
,因此它可以跨
DB
ref工作:我不知道,出于某种原因,我认为不同的数据库不能共享同一事务。但我的知识可能已经过时了。很好,谢谢分享。