MongoDB或CouchDB还是别的什么?

时间:2010-10-02 03:44:18

标签: sql mongodb couchdb database nosql

我知道这是关于这个主题的另一个问题,但我是NoSQL世界的一个完全的初学者所以我会喜欢一些建议。 SO的人告诉我MySQL可能对这个数据集不好,所以我问这个。我有以下格式的大量数据:

TYPE 1

ID1: String String String ...
ID2: String String String ...
ID3: String String String ...
ID4: String String String ...

我希望转换成这样的东西:

TYPE 2

ID1: String
ID1: String
ID1: String
ID1: String
ID2: String
ID2: String

这是最低效的方式,但我需要能够通过键和值进行搜索。例如,我的查询看起来像这样:

  • 我可能需要知道给定ID包含的所有字符串,然后将列表与另一个为不同ID获取的列表相交。
  • 我可能需要知道所有ID包含给定字符串

我希望在没有将Type 1转换为Type 2的情况下实现这一点,因为空间要求很高,但是想知道是否有MongoDB或CouchDB或其他东西(有人建议NoSQL这样开始谷歌搜索,发现这两个非常受欢迎)在这种情况下会帮助我。我可以使用一个14节点集群,但我会喜欢一些关于哪个是这个用例的正确数据库的建议。有什么建议吗?

一些额外的事情:

  • 输入通常是静态的。我将创建新数据,但不会修改任何现有数据。
  • ID长度为40个字节,而字符串大约为20个字节

1 个答案:

答案 0 :(得分:3)

MongoDB将允许您在类型1中有效地存储此数据。根据您的使用情况,它将看起来像这样(数据是JSON):

字符串数组

{ "_id" : 1, "strings" : ["a", "b", "c", "d", "e"] }

KV字符串集

{ "_id" : 1, "s1" : "a", "s2" : "b", "s3" : "c", "s4" : "d", "s5" : "e" }

根据您的查询,我可能会使用字符串数组方法。原因如下:

  

我可能需要知道所有字符串   给定的ID包含然后相交   获得另一个列表的列表   对于不同的身份证。

这很简单,您可以获得一个ID值的Key Value查找。在代码中,它看起来像这样:

db.my_collection.find({ "_id" : 1});

  

我可能需要知道所有ID包含给定字符串

同样容易:

db.my_collection.find({ "strings" : "my_string" })

是的,这很容易。我知道“字符串”在技术上是一个数组,但MongoDB会将该项目识别为数组并循环查找该值。这是are here的文档。

作为奖励,您可以索引“字符串”字段,您将获得数组的索引。所以上面的查找实际上会执行得相对较快(明显的权衡是指数会非常大)。

就扩展而言,14节点集群可能几乎是矫枉过正。但是,Mongo确实支持自动分片和复制集。他们甚至一起工作,这里是blog post from a 10gen成员,让你入门(10gen使Mongo)。