RethinkDB调查建模



我正在开始一个新项目(一个调查应用程序),我选择了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和索引,或者concatMapgetAll,也可以使用索引,使查询更高效。对于您的用例,我将说放弃JOIN。

分离东西可能更容易运行一些聚合。比如统计今年第一季度系统中参与调查的用户数量。

我仍然不清楚你有什么样的数据,如果你能更新你的问题,关于你想要放入什么样的数据,我可以帮助创建一个数据模型。

最新更新