首页 文章

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

提问于
浏览
5

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

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

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

谢谢

4 回答

  • 0

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

    id (primary key)
    key
    value
    

    每个key-> value关系都有一行

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

  • 2

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

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

    希望这会有所帮助 .

  • 2

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

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

相关问题