首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure中的关系表数据结构

Clojure中的关系表数据结构
EN

Stack Overflow用户
提问于 2016-04-09 04:40:00
回答 1查看 159关注 0票数 2

我正在寻找Clojure数据结构,它的工作原理类似于关系表(如在关系数据库中)。

Map (偶数双向) id -> (val1,val2,val3,...)做不到这项工作。例如,如果我想查找val2 = "something“的所有行,则需要O(n)。

但是我想在O(log )中的一列中执行搜索!

EN

回答 1

Stack Overflow用户

发布于 2016-04-10 04:24:20

在数据库中搜索不带索引的列谓词的行是O(n),因为必须检查每一行是否与该谓词匹配。如果您的谓词使用的列有索引,则可以使用该索引查找特定值的所有行,方法是在索引中查找该值作为键,以获取所有匹配的行。然后它通常是log(n)操作(它取决于索引的内部实现,例如对于B-tree,它是log(n))。

我不知道Clojure数据结构的开箱即用实现具有它们通常具有的单一用途的特征(例如,map是用于按单个键查找的关联数据结构,而不是具有多个索引的数据库中的多个键)。你宁愿需要一个库来提供某种类型的内存数据库,例如(正如缩略图在他的评论中提到的) DataScript,或者甚至是带有JDBC接口的内存中的SQL (例如,H2SQLHSQLDBDerbyDB,使用它们的内存存储)。

我不确定您的特定需求,但您也可以使用Clojure的基本API自己实现一些功能。例如,您可以使用Clojure set作为您的“表”,并使用clojure.set中的一些函数来增强它

你的桌子:

代码语言:javascript
运行
复制
(def my-table #{{:id 1 :name "John" :age 30 :gender :male}
                {:id 2 :name "Jane" :age 25 :gender :female}
                {:id 3 :name "Joe"  :age 40 :gender :male}})

并指定您的索引:

代码语言:javascript
运行
复制
(def by-id (clojure.set/index my-table [:id]))
(def by-age (clojure.set/index my-table [:age]))
(def by-gender (clojure.set/index my-table [:gender]))

然后在查询/过滤表时使用索引:

代码语言:javascript
运行
复制
(clojure.set/intersection
  (by-age {:age 30})
  (by-gender {:gender :male}))

;; => #{{:id 1, :name "John", :age 30, :gender :male}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36508949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档