Database design 数据库调查建模的再思考

Database design 数据库调查建模的再思考,database-design,rethinkdb,database,nosql,Database Design,Rethinkdb,Database,Nosql,我正在启动一个新项目(一个调查应用程序),我选择RejectionDB作为我的数据库;然而,我对数据建模有一些疑问。我将提出每个用户只能回答一次的问题。此外,我将有报告,将告诉用户选择每个选项的百分比。首先,我想到了以下建模: { title: String, total_answers: Number, options: [{ value: Number, label: String, respondents: [User IDs] }] } 问题是R

我正在启动一个新项目(一个调查应用程序),我选择RejectionDB作为我的数据库;然而,我对数据建模有一些疑问。我将提出每个用户只能回答一次的问题。此外,我将有报告,将告诉用户选择每个选项的百分比。首先,我想到了以下建模:

{
  title: String,
  total_answers: Number,
  options: [{
    value: Number,
    label: String,
    respondents: [User IDs]
  }]
}
问题是RequiredDB建议在一个数组中只嵌入几百个条目,我可能会在每次调查中有500多个受访者。 另一个选项是创建一个
答案
表,并链接到问题id和选项,但报告查询可能是一个问题,因为每次调查我都会有很多问题

我应该走哪条路?
谢谢

首先,这是嵌入与连接之间的经典数据建模。因为它是经典的,让我们回顾一下我们已经拥有的,以供参考:

在我们继续之前,让我们同意每个解决方案都有其优缺点

现在回到你的问题,正如你所写的,嵌入有它自己的问题。嵌入需要将整个文档加载到内存中。对其运行的任何查询都将加载整个文档。另外,当您更改为
选项.represponder
数组时,RequiredDB将重写整个文档。您还将有许多用户回答调查,调查将被添加到
选项中。同时,受访者也将回答
。这意味着大量的写作

在我看来,在应用范围内,嵌入式对于不需要独立存在的数据是很好的。这意味着数据总是与其父级一起使用,很少需要单独访问拥有数据的数据,最好嵌入

对于需要频繁访问的数据,其本身应该属于其他表。并使用
JOIN
运行报告,合并结果

在编写时,您确实希望运行查询报告,这表明您应该将其分开。它提供了极大的灵活性,因为您在自己的表中有东西,您不必深入数组并转换数据

RejectionDB支持JOIN,您可以将
eqJoin
与索引一起使用,或者
concatMap
getAll
与索引一起使用,使查询更加高效。对于您的用例,我会说让我们一起加入

分离出来可能更容易运行聚合。如统计一季度系统参与调查的用户数

我仍然不清楚您所拥有的数据类型,如果您可以更新您想要输入哪种数据的问题,我可以帮助您围绕它创建一个数据模型