假设我有表格companies
和employees
,其中后者有一个company_id
引用前者的字段。我想了解有关具有给定ID的公司以及在那里工作的人员的所有信息。我看到了两种方法,但是都有问题。
我可以通过联接一次性获得所有数据:
SELECT *
FROM companies, employees
WHERE <id> = companies.id
AND <id> = employees.company_id
但随后,companies
表中单行中的所有数据都会在结果的每一行中重复(即对公司的每个员工一次)。可以想象,客户端可以应用某种压缩或巧妙的分析来减少传输的数据量,但我不知道这是否确实完成或效果如何。
我可以使用两个查询:
SELECT *
FROM companies
WHERE <id> = companies.id
SELECT *
FROM employees
WHERE <id> = employees.company_id
但是必须两次访问数据库会增加延迟。
有没有办法解决这些效率低下的问题?我正在使用PostgreSQL,Slick(Scala)和Play。JDBC是否避免重复数据?
可能最简单的方法是将所有员工数据聚合到一个数组或一个json值中,该值或值将附加到公司的列中。对于jsonb
:
SELECT c.*, e.employee_data
FROM companies c
JOIN (
SELECT company_id, jsonb_agg(to_jsonb(employees)) AS employee_data
FROM employees
GROUP BY company_id) e ON e.company_id = c.id
WHERE <id> = companies.id;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句