我有一个要求是建立一个问题调查系统。 简单地说,它需要问题,预定义的答案和用户的答案记录。
对于用户记录,我需要保留所有历史记录,这就是我需要“is live”列的原因。因此,每个用户的最新答案都是正确的。当用户再次回答同一个问题时,该用户的所有现有答案记录都将成为历史记录(是实时=假)。
似乎结构简单。但是当我得到超过10万个问题,超过100万用户,并且每个用户每个问题都有超过20个答案记录,那么记录超过100,000 * 1,000,000 * 20 = 2,000,000,000,000条记录。然后它就成了一个大问题。
我还需要描述如何使用这些数据。我需要提供另一个系统,它可以通过定义问题答案标准,使用用户的记录来定位一组用户。例如:
(Q1=A1 && Q2=A3 && Q3=A5 && (Q4=A8 || Q5=A9))
条件1 (Q1!=A1 && Q2=A3)
条件2 (Q4=A8 || Q5!=A9)
条件3 在我定义标准后:
api需要快速而且活泼。 api会经常被调用。
所以想象一下,一张桌子上有200,000,000,000条记录。 api调用将非常缓慢甚至杀死数据库。
所以,我有一些不好的解决方案,我只是在这里列出所以我们可以讨论:
但是我可以看到解决方案不是很好而且效率很高。所以想在这里讨论它。无论什么样的技术(sql,nosql,hadoop等......)
请把你的想法放在这里。
答案 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您的收藏品。