什么是数组/有序查找数据库?

时间:2009-04-22 17:46:13

标签: database performance arrays map seek

我正在寻找支持以下功能的数据库:

1)数据库中的记录类似于Python词典或Perl哈希。例如,“购买”记录可能如下所示:

<purchase 5436> = { product: "BMX Bike", price: 99.50, city: "Springfield" }

2)记录存储在可变长度的数组中。该数据库包含许多这些数组。例如,购买表可能如下所示:

purchase array 1: [ <purchase 5436>, <purchase 54>, <purchase 112> ]
purchase array 2: [ <purchase 76>, <purchase 5984>, <purchase 1102>, <purchase 12> ]
...
purchase array 658: [ <purchase 10142>, <purchase 35>, <purchase 6458>, <purchase 23> ]

3)我希望能够在这个数据库上进行两种查询:

3a)计算符合各种标准的记录数。例如,有多少购买价值超过50?我知道有很多数据库支持这个。

3b)计算记录按特定顺序出现的次数。例如,有多少阵列是购买超过50,然后在“斯普林菲尔德”购买?我不知道你会用什么样的数据库来做这件事。

编辑:对Steve Haigh的回应:我应该提到速度很重要,这个数据库需要支持千兆字节的数据。例如,可能有1,000,000,000个购买阵列,我想要计算其中有多少人在“Springfield”购买,然后在“Hometown”购买(注意订单很重要)。也许我错了,但我认为关系数据库对于这个目的来说太慢了。

5 个答案:

答案 0 :(得分:2)

您确定无法使用链接或联结表对关系数据库执行此操作吗?

您将拥有一列订单,一列产品和一个表订单产品,每个订单的每个产品都有一行。

我认为article可能表达得比我更好。

答案 1 :(得分:2)

  

例如,可能有   1,000,000,000购买阵列,我   想算一下他们中有多少人   在“斯普林菲尔德”购买随后   在“故乡”购买(注意   订单很重要)。也许我错了,   但我认为关系数据库会是   为此目的太慢了。

您所描述的是典型的data warehouse查询,而AFAIK通常使用关系数据库来实现,尽管这些查询针对报告而不是针对并发事务处理进行了优化。但是,如果您使用“常规”RDBMS,我认为速度的差异不会太大。当然,如果你有足够的资金,你可以去一个特殊的数据仓库DBMS。

对速度的最重要影响是:1)针对大型磁盘数据集进行优化的技术 - 这正是所有“真实”DMBS提供的,2)以正确方式组织的数据。

  

3b)计算记录的次数   以某种顺序出现。对于   例如,有多少个数组   是一个超过50的购买和   然后在“斯普林菲尔德”购买了   制作?我不知道是什么样的   你会用来做这个的数据库。

您将使用a schema designed to support that kind of query的关系数据库。你将不得不放弃你应该如何表示数据的先入为主的概念。

答案 2 :(得分:1)

你真的不需要关系数据库,因为你只需要在集合中分组的key-&gt;值对,你需要在两个表之间连接(一个用于记录,一个用于集合)来迭代记录。一个集合,在你的情况下是不值得的。

为了满足您的性能要求,您需要确保整个结构适合内存并且不需要访问磁盘。您可能需要多个服务器来执行此操作,以及将查找分派给其他服务器的主服务器(假设您的结构大小大于现代服务器可以处理的合理内存量,并且您的速度要求是如此你无法承受磁盘分页。

对于您提到的那种查询,您最好的选择是获得一些数据冗余。在插入时,您将跟踪这些计数。数据冗余帐篷只是通过阅读名称来吓跑人们,但有时是必要的。只需要非常小心你的实施,并在这里投入大量的单元测试。

但是,某种类型的查询可能会在几毫秒内无法实时完成,并且关于使用一个条件查找购买然后再购买其他条件的查询似乎是这个。你可以找到一种在插入/删除/修改时保持对这些数字的实时跟踪的方法,或者你必须实际迭代你的数百万个数组,无法避免这种情况。您需要考虑数据的最新需求,并且可能每隔几小时预先计算一次,以生成这些统计信息,然后能够使用查找键在O(1)中访问它们。

简而言之,您的问题超出了您决定用来解决问题的技术。

答案 3 :(得分:0)

我不确定我完全理解你在寻找什么,但是你看过couchdb吗? 。 它的文档导向和架构免费

答案 4 :(得分:0)

你所描述的内容与MUMPS非常相似,即使我对定义查询的能力有所怀疑,其中数组中“记录”的顺序是可能的。

看一下这个链接,你也会看到目前的商业版本。