我在"最好的"中挣扎了一下。存储设计" graph-ish" couchdb / pouchdb中的数据。 我在要存储的节点之间的特定时间内有特定量的移动/流量,因此它有点像带有时间戳的有向和加权图。
每条数据都有:
我的问题以及我想用这些数据回答的问题是:
那么,如何将数据存储在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"?你会怎么做?什么是更具前瞻性的?
感谢您的关注。
答案 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的多个请求。