3

我需要编写一个带有键值存储作为后端的 node.js 服务。我的数据如下所示:

Item
  Name: "Item 1"
  Attributes
    AttributeA: "ValueA"
    AttributeB: "ValueB"
    AttributeC: "ValueC"

Item
  Name: "Item 2"
  Attributes
    AttributeA: "ValueC"
    AttributeB: "ValueD"

我问自己,哪个是满足我要求的最佳后端。我需要一个快速的后端,它可以从 node.js 轻松访问,并且可以处理大量数据(具有 15-20 个属性的 1-2 百万个项目)。重要的是,属性可能因项目而异,因此没有 20 个修复属性。我以后的查询将如下所示:

  • 获取项目 1 的所有属性
  • 获取属性 A 的所有值(来自所有项目)
  • 获取所有包含属性 B 的项目

或者也许像 couchDB 这样的 noSQL DB 会更好?我会很感激一些提示。;)

谢谢

托本

4

3 回答 3

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

希望这可以帮助!

于 2012-03-27T12:46:30.507 回答
1

我认为 mongoDB 非常适合您。虽然它不完全是键/值存储,但它是一个有点不同的文档存储。

以下是 mongo 与 nodejs 的优点:

  • 可索引的键。
  • 复合索引允许快速多属性查询。
  • 无模式。您可以添加/删除您认为合适的属性。如果您没有某些项目的属性,这对您有好处。
  • 快,我用它做的一切都快得惊人。
  • 为大量文件而设计。您正确索引的数百万个项目只会让 mongodb 对任何疑问一笑置之。
  • 强大的。findAndModify 和 map/reduce 之类的东西给了你惊人的灵活性。大多数时候你甚至不需要它们。
  • 熟悉的 JavaScript 语法。this.db.items.findOne({attrA : 'value'}) 感觉不错。

这里有一些限制:

  • 似乎每个人都启动了 node-js/mongodb 驱动程序。最完整的https://github.com/christkv/node-mongodb-native存在一些可用性问题。您的代码最终看起来非常受回调驱动。
  • 每个文档 16mb 限制。通常不是问题,但需要小心。
  • 分片是工程/设计中的一项练习。这不是太复杂,但确实需要一些先见之明。我将从一台服务器开始,并根据需要进行扩展。
  • 您需要一个 64 位服务器。这一天通常不是问题,但需要注意。

与往常一样,了解您的工具。我推荐阅读这本书: http: //manning.com/banker/。它写得很好。

于 2012-03-27T17:55:38.783 回答
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 将对象存储在哈希中

于 2012-03-28T02:56:26.300 回答