couchdb文档设计用于带有时间戳的定向和wieghted图中的边

时间:2015-05-17 15:56:42

标签: couchdb pouchdb

我在"最好的"中挣扎了一下。存储设计" graph-ish" couchdb / pouchdb中的数据。 我在要存储的节点之间的特定时间内有特定量的移动/流量,因此它有点像带有时间戳的有向和加权图。

每条数据都有:

  • 时间戳
  • 金额
  • 来源
  • 目标

我的问题以及我想用这些数据回答的问题是:

  • 最后的X动作是什么?
  • 在特定时间范围内发生了什么动作?
  • 节点N的输入和输出是什么(在特定的时间范围内)?
  • 节点集N,N1,...(在特定时间范围内)的输入和输出是什么?

那么,如何将数据存储在couchdb中,我可以回答问题并充分利用couchdbs的功能和特性?

从我目前的观点来看,我有两个选择:存储除了_id中的所有内容,或仅使用时间戳构建_id,并为amount,source和traget使用额外的值。

对于第一个解决方案,可以构建视图函数,如here,文档可能如下所示:

{
"_id":    "app:movement:at:20150517T154200:from:node:aaaa:to:node:bbbb",
"amount":  123456
},

对于第二个解决方案,文档可能如下所示:

{
"_id":    "app:movement:at:20150517T154200", # maybe plus random value
"from":   "aaaa",
"to":     "bbbb",
"amount":  123456
}

view-functions不会像第一个例子那样使用正则表达式,但可以直接访问这些值。

更多" chouchdb-ish"?你会怎么做?什么是更具前瞻性的?

感谢您的关注。

1 个答案:

答案 0 :(得分:2)

我建议将_id值定义为UUID。您的解决方案在一个用例中具有优势:当您想要使用主索引_all_docs来请求数据时,例如出于性能原因。但它会限制您的数据处理的用例。

示例文档结构可以是

{
  "_id":    "", // UUID
  "from":   "",
  "to":     "",
  "amount":  ,
  "timestamp": "", // ISO8601
  "type": "movement"
}

现在您想要请求数据:

  

最后的X动作是什么?

使用doc.timestamp作为键的视图,您可以询问

_view/viewname?descending=true&limit=3

获得最后3个动作。

  

在特定时间范围内发生了什么动作?

使用doc.timestamp作为键的视图,您可以询问

_view/viewname?startkey=:timestamp1&endkey=:timestamp

获取该时间范围内的动作。

  

节点N的输入和输出是什么(在特定的时间范围内)?

它在时间戳处理中的工作方式相同,但您需要一个带有复杂键的视图。您的视图可以发出例子:

emit([doc.from,doc.timestamp], null)
emit([doc.to,doc.timestamp], null)

现在,您可以将节点添加到时间帧过滤的请求中。

  

节点集N,N1,...(在特定时间范围内)的输入和输出是什么?

与之前的用例相同。但是,只有当节点名称并排放置在索引中时,才能在一个请求中请求多个节点数据。否则,您将需要对CouchDB的多个请求。