如何删除辅助表中的条目

Posted

技术标签:

【中文标题】如何删除辅助表中的条目【英文标题】:how is deletion of the entry in secondary table done 【发布时间】:2016-12-19 08:32:59 【问题描述】:

假设我们有一个主表,其内容如下:

key  value
--------------
a    andreas
b    bernd
c    chris
e    ernst
f    frank
g    gerold

我们创建了一个次要的,带有一个只计算主要数据中的字母的回调,我们会得到

5 b
5 c
5 e
5 f
6 g
7 a

现在,当我删除“ernst”条目时,辅助条目“5 e”也将被删除。如何确定必须删除哪个次要条目? BDB 是否再次执行回调,然后对计算值进行表扫描? “5”可以跳,但是要找到“5 e”就需要一个光标,对吧?

【问题讨论】:

【参考方案1】:

Berkeley DB 中的次要 主要之间的关联是基于唯一标识符的。因此,对于 key->value 存储,辅助值 == 主键。

具有关联辅助主数据库的唯一标识符,没有歧义。

【讨论】:

问题不在于歧义,因为(如您所说)sec.data == pri.key,您可以访问完全索引的主数据库。但是访问辅助键不能被完全索引,因为辅助键不是唯一的。所以从中删除必须进行光标搜索?还是我错过了什么? 我不确定你问的是什么:游标在 BDB 内部和外部都使用。回调使用主键->值调用一次,并负责为与唯一主键关联的操作(包括删除)创建一组辅助键->值对。没有光标暴露给回调。为什么使用(或不使用)内部游标很重要? 我想避免性能问题:当我删除主数据库时,我不希望 BDB 也进行表扫描以删除辅助数据库。看我的例子:它如何知道要删除键为“5”的行中的哪一行,而无需全部阅读? (在我的例子中只有 4 个,我的生活将有 10m+)。还是初级中的“e ernst”和次级中的“5 e”以某种方式相互连接(对我来说是不可见的)? 测量是最好的性能调整。同时,该文档声称辅助关联数据库的效率更高(而不是更低)。连接操作(像这样)已经高度优化:它不像这样是顺序线性搜索。但是试试看(和调整:缓存/页面大小的调整肯定会有所帮助)。 您可以通过使用不同的辅助键而不是简单的 strlen 来获得更高的性能。您是否考虑过将前几个字符添加到计数中?这应该会减少您的 1000 万+ 关键潜在搜索空间,而无需额外成本。或者只使用适当的散列:偏向于短字符串,散列将是均匀分布。

以上是关于如何删除辅助表中的条目的主要内容,如果未能解决你的问题,请参考以下文章

Spring:如何从联结表中删除条目?

Hibernate Envers:如何从我的审计表中删除条目?

如何从java中的链表中删除一个对象?

如何通过键删除 lua 表条目?

从哈希表中删除条目的最佳方法

从表中删除所有数据,但最后 N 个条目