【问题标题】:What is an array/ordered lookup database?什么是数组/有序查找数据库?
【发布时间】:2009-04-22 17:46:12
【问题描述】:

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

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 个,然后在“Springfield”中进行了购买?我不知道您将使用哪种数据库来执行此操作。

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

【问题讨论】:

    标签: database performance arrays map seek


    【解决方案1】:

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

    您将有一列订单、一列产品和一个表 order-products,其中每个订单的每个产品都有一行。

    我认为这个article 可能比我能表达的更好。

    【讨论】:

      【解决方案2】:

      例如,可能有 1,000,000,000 个购买阵列,我 想计算他们中有多少人有 在“斯普林菲尔德”购买,然后 在“家乡”购买(请注意 顺序很重要)。也许我错了, 但我认为关系数据库将是 为此目的太慢了。

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

      对速度的最重要影响是 1) 一种针对查询基于磁盘的大型数据集而优化的技术 - 这正是所有“真正的” DMBS 所提供的,以及 2) 以正确的方式组织数据。

      3b) 统计记录的次数 以一定的顺序出现。为了 例如,有多少个数组 是否进行了超过 50 次的购买并且 然后在“斯普林菲尔德”购买 制成?我不知道是什么样的 用于执行此操作的数据库。

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

      【讨论】:

        【解决方案3】:

        您实际上并不需要关系数据库,因为您只是将键-值对分组在集合中,您需要在两个表之间进行连接(一个用于记录,一个用于集合)以迭代记录收藏,在你的情况下是不值得的。

        对于您的性能要求,您需要确保整个结构适合内存并且不需要访问磁盘。您可能需要多台服务器来执行此操作,以及将查找分派到其他服务器的主服务器(假设您的结构的大小大于现代服务器可以处理的合理内存量,并且您的速度要求如此大到你负担不起磁盘分页。

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

        但是,可能存在某种查询,您永远无法在几毫秒内实时完成,并且关于查找具有一种条件的购买,然后是具有另一种条件的购买的查询似乎是这。要么您找到一种在插入/删除/修改时保持实时跟踪此数字的方法,要么您将不得不实际迭代数百万个数组,无法避免这种情况。您将需要考虑您的数据需要多长时间,并且可能每隔几个小时预先计算一次以生成这些统计信息,然后能够使用查找键在 O(1) 内访问它们。

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

        【讨论】:

        • 不相关?那么“按集合分组”到底是什么意思?
        • 嗯,你是对的,那是一种关系。我的意思是不值得为这样一个简单的父/子结构花时间在 Joins 上,但你是对的,我会编辑我的答案。感谢您指出。
        【解决方案4】:

        我不确定我是否完全理解你在寻找什么,但你看过couchdb 吗? . 其面向文档且无架构

        【讨论】:

          【解决方案5】:

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

          查看链接,您将看到当前的商业版本。

          【讨论】:

            猜你喜欢
            • 2020-08-26
            • 2016-04-02
            • 1970-01-01
            • 2011-05-03
            • 1970-01-01
            • 1970-01-01
            • 2011-05-01
            • 2012-02-02
            • 1970-01-01
            相关资源
            最近更新 更多