我可以在 Berkeley DB 中使用多个密钥吗?

问题描述 投票:0回答:3

我想在 Berkeley DB 中使用以下 Perl 逻辑(用于数百万条记录):

$hash{key1}{key2}{key3}{count1}++;
$hash{key1}{key2}{key3}{count2}++;

...

for (key1) {
   for (key2) {
     for (key3) {
        print $hash{key1}{key2}{key3}{count1}."\t".$hash{key1}{key2}{key2}{count2};
        }
     }
  }

有多个键的例子吗?我当然可以使用“伪多个”密钥( key1_key2_key3 );但还有其他办法吗?

perl berkeley-db
3个回答
4
投票

Berkeley-db 不支持这样的多个键。每条记录只能有一个键。

您可以将这些键连接起来形成一个键,正如您所说。

您可以使用 MLDBM 提供嵌套键的外观。但这是通过在

key1
下存储序列化哈希来实现的,因此如果您在顶级键下嵌套了很多键,那么效率会非常低。

或者,您可以放弃 BDB 并使用真正的 SQL 数据库。 DBD::SQLite 易于安装,包含 SQLite 数据库引擎及其驱动程序。

我会选择连接键或真正的数据库,具体取决于您到底想要做什么。


0
投票

对于这种情况,要解决这个问题,你可以像这样构造一个唯一键:

$seperator = "_"; #seperator depends on your data,pick one never found in your key.
$key = join $seperator , ($key1,$key2,$key3);
$hash{$key}{$count1}++;
$hash{$key}{$count2}++;

...

for (key1) {
   for (key2) {
     for (key3) {
        $un_key = join $seperator , (key1,key2,key3);
        print $hash{$un_key}{count1}."\t".$hash{$un_key}{count2};
        }
     }
 }

0
投票

Berkeley 数据库支持多个密钥,尽管用于执行此操作的 API 并非在所有语言中都可用。看一下文档“Berkeley DB Concepts”中的“Secondary Keys”部分

https://docs.oracle.com/cd/E17076_05/html/gsg/JAVA/javadplconcepts.html#secondary

© www.soinside.com 2019 - 2024. All rights reserved.