从许多postgres表中选择数据的最佳实践

时间:2017-08-13 23:22:01

标签: postgresql web-development-server

我有以下表格的电影数据库:

 mid |  title     
-----+---------
  9  | Jason X

演员

mid |   name 
----+------------
 9  | Kane Hodder
 9  | Lexa Doig

我的问题是从所有表中获取与特定电影相关的所有数据的最佳做法是什么,我认为在一个SQL查询上获取数据是理想的,所以我不必对db进行多次查询每张桌子。

当我尝试在一个查询中获取所有内容时,我会获得重复数据,例如我在每一行都获得标题 mid ,但需要只有一次:

 mid | title   | name 
---------------+------------
  9  | Jason X | Kane Hodder
  9  | Jason X | Lexa Doig

webapp会将Postgres输出转换为类似的哈希:

  

movie => {mid => 9,title => '杰森X',演员=> [' Kane Hodger',   ' Lexa doig']}

使用当前的postgres输出,我得到重复数据,例如 $ movie {title} 等于 [' Jason X',' Jason X' ] ,只需' Jason X'

1 个答案:

答案 0 :(得分:0)

您可以使用JSONB type:

select to_jsonb(m) || jsonb_build_object('actors', jsonb_agg(a.name)) as movies
from movies m
join actors a using(mid)
group by mid;

                                 movies                                 
------------------------------------------------------------------------
 {"mid": 9, "title": "Jason X", "actors": ["Kane Hodder", "Lexa Doig"]}
(1 row)

另见:

最佳做法的问题在SO上有点冒险,因为它可以被认为过于宽泛或基于意见。它在很大程度上取决于数据的大小。在大多数返回行数有限的简单情况下,使用json非常方便。您还可以使用其他聚合函数,例如string_agg ()

select m.*, string_agg(a.name, ',') as actors
from movies m
join actors a using(mid)
group by mid;

 mid |  title  |        actors         
-----+---------+-----------------------
   9 | Jason X | Kane Hodder,Lexa Doig
(1 row) 

如果应用程序一次处理的行数较大(比如几十万),那么更有效的解决方案可能是在客户端使用多个查询和数据处理。