Sql表或Mongo文档结构设计用于复杂的数据结构

时间:2013-01-04 02:54:04

标签: mysql sql mongodb nosql

我有一个要求是建立一个问题调查系统。 简单地说,它需要问题,预定义的答案和用户的答案记录。

  • 问题需要问题ID,问题文本
  • 答案需要答案ID,回答文字
  • 用户的答案记录需要记录ID,用户ID,问题ID,答案ID,日期,操作系统,IP,浏览器信息,现场直播

对于用户记录,我需要保留所有历史记录,这就是我需要“is live”列的原因。因此,每个用户的最新答案都是正确的。当用户再次回答同一个问题时,该用户的所有现有答案记录都将成为历史记录(是实时=假)。

似乎结构简单。但是当我得到超过10万个问题,超过100万用户,并且每个用户每个问题都有超过20个答案记录,那么记录超过100,000 * 1,000,000 * 20 = 2,000,000,000,000条记录。然后它就成了一个大问题。

我还需要描述如何使用这些数据。我需要提供另一个系统,它可以通过定义问题答案标准,使用用户的记录来定位一组用户。例如:

  1. (Q1=A1 && Q2=A3 && Q3=A5 && (Q4=A8 || Q5=A9))条件1
  2. (Q1!=A1 && Q2=A3)条件2
  3. (Q4=A8 || Q5!=A9)条件3
  4. 在我定义标准后:

    1. 我需要提供一个api来获取符合条件的所有用户ID(api1)
    2. 我需要提供一个api来获取用户的所有标准(api2)
    3. api需要快速而且活泼。 api会经常被调用。

      所以想象一下,一张桌子上有200,000,000,000条记录。 api调用将非常缓慢甚至杀死数据库。

      所以,我有一些不好的解决方案,我只是在这里列出所以我们可以讨论:

      1. 每个问题都有一个表来保存此问题的所有用户记录。
      2. 每个用户都有一个表来保存该用户的所有问题记录。
      3. 1和2
      4. 但是我可以看到解决方案不是很好而且效率很高。所以想在这里讨论它。无论什么样的技术(sql,nosql,hadoop等......)

        请把你的想法放在这里。

1 个答案:

答案 0 :(得分:2)

我会尝试使用mongoDB只使用一个“用户”集合来存储数组中的答案:

{userId: 1, 
 name: "nick",
 ...,
 "answers": [
    { questionId:1,
      answerId: 1,
      date: Date(...),
      ...,
      isLive: 1},
    { questionId:1
      answerId: 2,
      date: Date(...),
      ...,
      isLive: 0}
 ]
}

然后我会在属性“answers.isLive”上使用Multikey Index来确保高速访问“实时”答案。

“answers.questionId”和“answers.answerId”的另一个多键索引应确保使用您的标准检索数据的高性能。

与您的号码一样,我会从一开始就考虑sharding您的收藏品。