【发布时间】:2014-05-31 22:12:02
【问题描述】:
我以前从来没有问过这样的问题,我最终总是通过搜索偶然发现我正在寻找的东西,但是这里发生了很多事情,我已经到了搜索能力的尽头。 . 感谢您的帮助/建议。
问题
我需要即时生成报告,说明我的组织中有多少“学生”参加了每个“评估”,以及与每个“评估”相关的标准。
- 提前计算学生总数并存储在评估报告中
- 报告行需要与“评估”连接才能显示信息
- 标准有子标准,但评估只知道子标准。
- 评估有多个子标准,并将它们存储在一个 id 数组中。
我正在尝试以最高效的方式来最小化 Postgres 的负载,但我不相信我已经实现了这个目标......
设置
服务器:运行 Ubuntu 的 Amazon EC2
应用(服务器): Node.js (0.10.26)
应用程序(客户端): Angular.js (1.2.13)
数据库(查询): PostgreSQL (9.3.1)
数据库(缓存): MongoDB (希望以后缓存报告)
桌子
评估
_id int4
description text
category varchar(60)
sub_standards int4 ARRAY
...
assesments_report(预先计算的总和)
assessment_id(FK) int4
client_id(FK) int4
students int4
completed int4
incomplete int4
...
子标准
_id
standard_id(FK) int4
description varchar(255)
...
标准
_id int4
name varchar(60)
description varchar(255)
...
查询
//Stored as array for readability in Node-Postgres use
SELECT r.*, as.* FROM assessments_report r
INNER JOIN (
SELECT a._id AS assessment_id, a.description, a.category, a.states,
array_to_json(array_agg(ss.*)) AS standards
FROM assessments a LEFT JOIN (
SELECT ss.*, s.name AS parent_name, s.description AS parent_description
FROM sub_standards ss
INNER JOIN standards s ON ss.standard_id = s._id
) ss ON ss._id = ANY (a.sub_standards) GROUP BY a._id
) as
ON as.assessment_id = r.assessment_id
WHERE r.client_id = $1
每行所需的输出(显示为 JSON)
assessment_id: 2,
students: 2,
complete: 1
incomplete: 1,
description: "...",
category: "...",
states: ["AL","AZ",...],
standards: [
{
_id: 1,
standard_id: 3,
description: "...",
parent_name: "...",
parent_description: "..."
},
{
_id: 2,
standard_id: 4,
description: "...",
parent_name: "...",
parent_description: "..."
},
]
【问题讨论】:
-
为了有效地帮助优化查询,可用模式 + 示例数据(理想情况下是 sqlfiddle.com)将是非常可取的。您还应该为当前查询显示
explain analyze输出。 -
@CraigRinger 感谢您的来电!我创建了the fiddle 并将其添加到问题中。在其中,我更具体地了解了我的设置和未来的改进/更改,如果这有帮助,请告诉我。
标签: sql arrays json node.js postgresql