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