leveldb - 如果值为空并且只有一个键,leveldb 是否存在结构问题?

标签 leveldb

我正在研究一种设计,其中数据的二级索引将使用键中的所有信息构建,而在值方面不需要任何信息。这可能会导致问题吗?

不是技术上是否可以有空白值。是否存在任何结构后果,例如:添加排序键可能会导致某些树结构不平衡? (我并不是说 leveldb 使用树,只是想打个比方;-))

即:说“主记录”看起来像(空值作为分隔符)

  • key = uniqueTableID\0 uniqueRowID
  • 值 = 一些字段的集合

典型单值字段的二级索引如下所示:

  • key = uniqueFieldID\0 keyValue\0 uniqueRowID

允许通过部分键 [uniqueFieldID\0 keyValue] 进行迭代,并且如果主记录被删除或键值发生更改,还可以轻松找到这些键并删除它们,从主记录的 uniqueRowID 进行返回。因此,可能有多个以相同 uniqueRowID 结尾的键值,但对于以 uniqueFieldID 开头并以 uniqueRowID 结尾的特定组合来说,只能有一个键

唯一的事情是我不需要将值放入该对的值一侧。

我对这个概念设计非常满意,只是检查一下是否有人能发现其中的漏洞。例如,它是否会扭曲 leveldb 内部结构并导致性能问题。

我预计在一个特定的应用程序中会有数以万计的此类 key 。

作为我们可能想要存储的值的示例,文本字段的辅助单词索引可能如下所示:

  • key = uniqueFieldID\0 keyValue\0 GUID
  • 值 = 单词出现次数的计数,或者如果扫描大 blob 的成本较高,则可能是偏移量列表

最佳答案

LevelDB中的键和值是不透明数组,快速查看constructor of a Slice的文档显示如何创建空切片:

// Create an empty slice.
Slice() : data_(""), size_(0)

这对于没有任何值数据的情况非常有用。

关于leveldb - 如果值为空并且只有一个键,leveldb 是否存在结构问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762509/

相关文章:

go - leveldb-go 示例,文档

c++ - 如何将 C++ 库静态链接到 OSX 中的 C 应用程序?

go - level-db golang 实现覆盖现有值?

c++ - leveldb DeleteObsoleteFiles 是私有(private)的

nosql - Leveldb 与 Redis、Riak 或 Tokyo Tyrant 相比如何?

javascript - 使用模型存储在关卡中的数据中的某些字段不会被持久化

node.js - 获取Redis数据库的ReadStream

go - 在磁盘上存储时间序列数据的滑动窗口

database - 键/值数据库的二级索引

c++ - 如何从 char 指针转换为自定义对象指针