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

时间:2010-10-07 22:04:09

标签: perl berkeley-db

我想在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);但还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

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

如您所述,您可以将密钥连接起来形成一个密钥。

您可以使用MLDBM来显示嵌套键的外观。但这可以通过在key1下存储序列化哈希来实现,因此如果你有很多嵌套在顶级键下的密钥,效率会非常低。

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

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

答案 1 :(得分: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};
        }
     }
 }