Data structures 数据模型的选择:要更新和映射的试剂原子的嵌套映射或向量?

Data structures 数据模型的选择:要更新和映射的试剂原子的嵌套映射或向量?,data-structures,clojure,clojurescript,reagent,Data Structures,Clojure,Clojurescript,Reagent,我正在开发一个试剂应用程序来管理酒店预订网站的季节。数据显示在表格视图中,当前存储在一个atom中,该atom持有一个嵌套的地图,其中季节ID作为键,如下所示: (def seasons (r/atom {1 {:begin "2020-04-02" :end "2020-04-19" :selected false …much more data like price per room etc} 2 {:begin "2020-0

我正在开发一个试剂应用程序来管理酒店预订网站的季节。数据显示在表格视图中,当前存储在一个atom中,该atom持有一个嵌套的地图,其中季节ID作为键,如下所示:

(def seasons (r/atom
{1
 {:begin "2020-04-02"
  :end "2020-04-19"
  :selected false
  …much more data like price per room etc}
2
{:begin "2020-04-20"
  :end "2020-06-18"
  :selected true
  }
…}))
(def seasons
(r/atom
[{:id 1
  :begin "2020-04-02"
  :end "2020-04-19"
  :selected false
  …much more data like price per room etc}
 {:id 2
  :begin "2020-04-20"
  :end "2020-06-18"
  :selected true
  }…]))
这种结构的主要优点是通过
#(dissoc@seasures-seasure-id)
(在seasures中更新[seasure-id:begin]“2020-04-21”)
可以轻松地从我的组件中删除/修改季节,这将更加麻烦,因为可以将id集成到表示季节的地图中,例如:

(def seasons (r/atom
{1
 {:begin "2020-04-02"
  :end "2020-04-19"
  :selected false
  …much more data like price per room etc}
2
{:begin "2020-04-20"
  :end "2020-06-18"
  :selected true
  }
…}))
(def seasons
(r/atom
[{:id 1
  :begin "2020-04-02"
  :end "2020-04-19"
  :selected false
  …much more data like price per room etc}
 {:id 2
  :begin "2020-04-20"
  :end "2020-06-18"
  :selected true
  }…]))
这个版本更适合映射,这对于我当前的数据模型来说不是很愉快,我必须总是将id与实际映射重新组合成一个二进制向量,然后将结果seq back
粘贴到一个映射中

我越来越倾向于切换到第二种模式,因为通过将整个季节传递到一个函数中,删除/更新将是可行的……这样就根本不需要ID,例如:

(vec (remove #(= % season) @seasons))
或分别:

(vec (map #(if (= % season) 
       (update-in % [:begin "2020-04-21"]) %) @seasons))
由于这是我第一个真实世界的试剂应用程序,我有点不确定哪种数据模型更可取?两种方法之间是否存在性能方面的考虑因素?对于一个经验丰富的试剂开发者来说,哪一个看起来更理智?有没有我不知道的第三种方法?

非常感谢您对这个有点悬而未决的问题的任何意见


当您描述您的目的(季节)时,绩效不是一个考虑因素。每天三个“季节”每年只有约1000个——这对于计算机来说是一个很小的数字

那么,哪种方法更适合您的代码?您已经讨论了两个用例,一个用例支持方法A,另一个用例支持方法B。由你来决定

在方法A中,您对数据进行了“预索引”,因此您可以直接转到某个对象并对其进行修改。在方法B中,在处理之前,您必须进行小型搜索以找到某个对象。对于一个更大的问题,方法B最终会演变成一个DB,如Postgres、Datomic或Neo4J等

对于留在内存中的小问题,可以使用库:

  • -我个人最喜欢的!;)

在现阶段,这些可能有些过分,但您可能希望在将来记住它们。

值得一提的是,修改嵌套数据结构并保留其结构:谢谢,我打算研究斯佩克特一段时间……但对于我目前的项目来说,这可能有点过头了。非常感谢你的判断……我明白,在一个更高级的Clojurian人眼里,选择并不像我想象的那么明显,我看到的权衡事实上是真实的,不容易规避……我想我会的尝试重构到版本B…即使只是为了学习。图珀洛。森林看起来很棒……也许能解决我几次尝试走路时的打嗝。