为具有多个值的密钥建议数据库,具有高度可扩展性

时间:2011-07-11 11:39:11

标签: nosql cassandra redis key-value riak

我们拥有key-multipleValues数据。每个密钥可以有大约500个值(每个值大约为200-300个字符),这些密钥的数量将大约为1000万。主要操作是检查给定密钥的值。

我一直在使用mysql,我有两个选项:每个键值一行,每个键一行,文本字段中包含所有值。但这些对我来说似乎并不高效模型有很多行,冗余和第二个模型文本字段会变得非常大。

我正在考虑使用nosql数据库用于此目的,之前我使用过mongodb,我认为它不适合我目前的情况。基于keyvalue或基于列系列的nosql db会更好。不需要分发。使用riak,redis,cassandra等的人分享你的想法。

由于

4 个答案:

答案 0 :(得分:2)

尝试直接的规范化方法:使用此模式的一个表:

id (primary key)
key
value

每个key->值关系

都有一行

为每列添加索引,查找应该相当有效。你有没有将其中任何一个描述为瓶颈?

答案 1 :(得分:2)

这确实直接映射到卡桑德拉。行键将是您的模型键,您的模型值将是Cassandra中的列名(是,名称)。您可以将Cassandra列值保留为空,或者在那里添加元数据(如时间戳)(如果有用)。

答案 2 :(得分:2)

根据您的描述,似乎某种键值​​存储将更适合您比较关系数据库。

数据本身似乎是非关系型的,为什么存储在关系存储中?使用像Cassandra这样的东西似乎是有效的。

我认为要存储此数据的典型数据结构将是一个列族,Key为Row-key,Columns为value。

MyDATA: (ColumnFamily)
  RowKey=>Key
    Column1=>val1
    Column2=>val2
    ...
    ...
    ColumnN=valN

数据看起来像(JSON表示法):

MyDATA (CF){
    [
      {key1:[{val1-1:'', timestamp}, {val1-2:'', timestamp}, .., {val1-500:'', timestamp}]},
      {key2:[{val2-1:'', timestamp}, {val2-2:'', timestamp}, .., {val2-500:'', timestamp}]},
      ...
      ...
    ]
}

希望这有帮助。

答案 3 :(得分:0)

我认为这不会超出单个机器上MySQL的规模。你需要调整插入,否则它将永远加载。您也可以考虑使用COMPRESS()或直接在应用程序中压缩值。可能会为您节省50%左右。

Redis基本上是一个内存数据库,所以它可能已经出局了。 Riak可能是一个不错的选择,或HBase或Cassandra。