我正在开始一个新项目(一个调查应用程序),我选择了RethinkDB作为我的数据库;然而,我有一些关于数据建模的问题。我会有每个用户只能回答一次的问题。此外,我还将提供报告,告诉用户选择每个选项的百分比。一开始我想到了下面的建模:
{
title: String,
total_answers: Number,
options: [{
value: Number,
label: String,
respondents: [User IDs]
}]
}
问题是RethinkDB建议在数组中只嵌入几百个项目,我可能会有500多个调查对象。另一种选择是创建一个answers
表,并链接到问题id和选项,但报告查询可能是一个问题,因为每次调查都会有很多问题。
我应该走哪条路?谢谢!
首先,这是嵌入与连接之间的经典数据建模。既然它是经典的,让我们回顾一下已有的内容,以供参考:
- https://rethinkdb.com/docs/data-modeling/
- http://openmymind.net/Multiple-Collections-Versus-Embedded-Documents/
- MongoDB关系:嵌入或引用?
在我们继续之前,让我们同意每个解决方案都有自己的优点和缺点。
现在回到你的问题,正如你写的,嵌入有它自己的问题。嵌入需要将整个文档装入内存。在上面运行的任何查询都将加载整个文档。另外,当您更改为options.respondents
数组时,RethinkDB将重写整个文档。您也将有许多用户回答调查,这将被添加到options.respondents
同时。这意味着要写很多东西。
在我看来,在应用范围内,嵌入式对于不需要独立存在的数据是很好的。这意味着数据总是与其父数据一起使用,我们很少需要单独访问自己的数据,最好是嵌入。
对于需要频繁访问的数据,其本身应该属于其他表。并使用JOIN
运行报告,合并结果。
当你写的时候,你确实想运行查询报告,这是你应该把它分开的标志。它提供了很大的灵活性,因为您在自己的表上有东西,您不必深入到数组中,并转换数据。
RethinkDB支持JOIN,您可以使用eqJoin
和索引,或者concatMap
和getAll
,也可以使用索引,使查询更高效。对于您的用例,我将说放弃JOIN。
分离东西可能更容易运行一些聚合。比如统计今年第一季度系统中参与调查的用户数量。
我仍然不清楚你有什么样的数据,如果你能更新你的问题,关于你想要放入什么样的数据,我可以帮助创建一个数据模型。