5

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

我一直在使用 mysql,我有 2 个选项:每个键值一行,每个键一行,文本字段中的所有值。但是这些对我来说似乎效率不高,因为第一个模型有很多行数、冗余数和第二个模型文本字段将变得非常大。

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

谢谢

4

4 回答 4

2

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

id (primary key)
key
value

每个键->值关系都有一行

为每一列添加一个索引,查找应该是相当有效的。你有没有分析过这其中的任何一个表现出瓶颈?

于 2011-07-11T11:43:31.127 回答
2

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

于 2011-07-12T16:21:45.447 回答
2

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

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

我认为用于存储这些数据的典型数据结构将是一个列族,其中键作为行键,列作为值。

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}]},
      ...
      ...
    ]
}

希望这会有所帮助。

于 2011-07-13T14:55:14.830 回答
0

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

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

于 2011-07-13T04:15:16.030 回答