我正在开始一个新项目(调查应用程序),我选择了RethinkDB作为我的数据库;但是,我对数据建模有一些疑问。我将会遇到每个用户只能回答一次的问题。此外,我将有报告说明选择每个选项的用户百分比。起初我想到了以下建模:
{
title: String,
total_answers: Number,
options: [{
value: Number,
label: String,
respondents: [User IDs]
}]
}
问题在于RethinkDB建议在数组上只嵌入几百项,每次调查我可能会有500多名受访者。
另一个选项是创建一个answers
表并链接到问题ID和选项,但报告查询可能会有问题,因为每次调查都会有很多问题。
我应该遵循哪条路? 谢谢!
答案 0 :(得分:2)
首先,这是嵌入与连接之间的经典数据建模。由于它是经典的,让我们回忆一下我们已有的东西,供参考:
在我们开始之前,让我们同意每个解决方案都有自己的优势和劣势。
现在回到你的问题,就像你写的那样,嵌入有自己的问题。嵌入需要将整个文档加载到内存中。您在其上运行的任何查询都将加载整个文档。此外,当您更改为options.respondents
数组时,RethinkDB将重写整个文档。您还将有许多用户回答此调查,该调查将同时添加到options.respondents
。这意味着很多写作。
在我看来,嵌入式对于在应用范围内不需要站立的数据是有益的。这意味着始终与其父级一起使用的数据,并且很少我们需要分别访问自己的数据,嵌入它是件好事。
对于需要频繁访问的数据,它本身应该属于其他表。并使用JOIN
运行报告,合并结果。
在你写的时候,你确实想要运行查询报告,这是一个你应该把它分开的标志。它提供了很大的灵活性,因为你有自己的桌面上的东西,你不必深入挖掘数组,并转换数据。
RethinkDB支持JOIN,您可以使用eqJoin
索引,concatMap
和getAll
,也可以索引,使查询更有效。对于你的用例,我会说放开JOIN。
将事物分开可能更容易运行某些聚合。例如计算系统中的用户数量在一年中的第一季度参与surverys。
我仍然不清楚你拥有的数据类型,如果你可以更新你想要放入什么类型的数据的问题,我可以帮助创建一个数据模型它。