我需要编写一个带有键值存储作为后端的node.js服务。我的数据如下:
Item
Name: "Item 1"
Attributes
AttributeA: "ValueA"
AttributeB: "ValueB"
AttributeC: "ValueC"
Item
Name: "Item 2"
Attributes
AttributeA: "ValueC"
AttributeB: "ValueD"
我问自己,这是我要求的最佳后端。我需要一个快速后端,可以从node.js轻松访问,并且可以处理大量数据(1-2百万项,15-20个属性)。重要的是,属性可能因项目而异,因此没有20个修复属性。我以后的查询看起来像这样:
或者像couchDB这样的noSQL数据库会更好?一些提示我会很感激。 ;)
谢谢
托本
答案 0 :(得分:3)
虽然它可能取决于其他参数(如属性的大小,类型,读/写比率),但我认为像MongoDb这样的文档数据库(ou couchDb,即使我没有使用它个人)会很合适。原因是你想根据属性的'值'进行查询,这在像Redis这样的数据库中是不可能的(没有改变你提出的模式,即使Redis非常适合许多用例) )。
使用以下文档:{name:“Item 1”,AttributeA:“ValueA”,AttributeB“ValueB”...},您可以实现您提到的查询:
db.docs.find({name:“Item 2”}); (如果经常使用此查询,可能会在名称上设置索引) db.docs.distinct( 'attributeA'); db.docs.find({attributeB:{$ exists:true}}});
依旧......
你可以在这里找到一个非常好的nodejs mongodb驱动程序:https://github.com/christkv/node-mongodb-native
希望这有帮助!
答案 1 :(得分:1)
我认为mongoDB非常适合你。它不是一个键/值存储,但它是一个文档存储,有点不同。
这是与nodejs的mongo有什么好处:
以下是一些限制:
一如既往,了解您的工具。我建议你阅读这本书:http://manning.com/banker/。写得很好。
答案 2 :(得分:0)
如果你想使用Redis来做这件事有点棘手。
处理具有特定属性的所有项目的检索。为每个属性设置一个集合。每次添加项目时,如果它具有该属性,则将其添加到集合中。当您想要检索具有该属性的所有项目时,只需请求整个集合,然后根据该项目检索所有项目。
添加内容
HMSET item1 attributeA value attributeB value
SADD set_attributeA item1
SADD set_attributeB item1
对于您的案例
1
HGETALL item1
2
SMEMBERS set_attributeA
然后迭代并获取所有值
HGET item1 attributeA
3
use HGETALL instead of HGET
对于节点库使用https://github.com/mranney/node_redis,它有一些很好的附加功能,比如用HGETALL的结果制作对象,以及用hmset存储哈希的对象