join - 减少 CouchDB 中的多个连接
问题描述
在我的 CouchDB 数据库中,我有以下模型(在数据库中实现为具有不同type
字段的文档):
- 球队:
name
,id
(有很多比赛,有很多球迷) - 匹配:
name
,team_a
,team_b
,time
(有很多团队,有很多推文) - 粉丝:(
team_id
有很多推文) - 推文:
time
,,,sentiment
fan_id
我想平均每个团队的推文情绪。如果我使用 SQL,我会这样做:
SELECT avg(sentiment)
FROM team
JOIN match on team.id = match.team_a OR team.id = match.team_b
JOIN fan on fan.team = team.id
JOIN tweet on (tweet.time BETWEEN match.time AND match.time + interval '1 hour') AND tweet.user = fan.id
GROUP BY team.id
但是,在 CouchDB 中,您最多可以在视图函数中执行 1 次连接,如文档中所述(通过发出连接字段作为键)。
如何在 CouchDB 中更好地建模以允许该查询工作?我真的不想过多地去规范化,但我想如果必须的话我会的?
解决方案
这有点复杂,但我使用我所谓的“三级索引”。目标是能够编写应用到另一个视图的视图。不幸的是,这样做的唯一方法是使用视图将数据写入辅助数据库,然后在该数据库上使用另一个视图。这样做需要一个外部过程——我使用一个脚本来监听主数据库的 _changes 提要,然后在发生变化时更新辅助数据库中的相关文档。
因此,在您的示例中,您的辅助数据库可能包含每个团队的单个文档,其中包含该文档中的所有(或最新)比赛/球迷/推文数据。然后,您编写一个从该辅助数据库中提取情绪(或其他)的视图。
推荐阅读
- linux - CronTab 每 5 分钟重启一次不起作用
- c# - 通知所有消费者消息
- android - 平板电脑容器android中的片段显示问题
- css - 在一个组件中修复 mat-fab 按钮
- c# - 从 db RESTful Web API 最佳实践中传递日期
- python - 从句子中的方括号中获取子串
- azure-devops - 获得批准的 Azure DevOps 计划发布
- php - PHP 和 MYSQL:使用 mysql 数据插入输入选择并在更改选择时显示所有其他字段
- docker - 从 Airflow 向外部火花容器提交火花作业
- javascript - 如何对齐sankey图的标签?