2017-08-13 23 views
1

我有電影數據庫下表:最佳實踐從衆多的Postgres表中選擇數據

電影

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

演員

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

我的問題是什麼最好的做法是從所有表格中獲取與特定電影相關的所有數據,在我看來,一個sql查詢的數據是理想的,所以我不必對每個表執行多個查詢db。

當我試圖在一個查詢得到的一切,我得到重複的數據,例如我得到冠軍中旬上的每一行,而它需要的只是一個時間:

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

的Web應用程序將Postgres的輸出轉換爲哈希像:

電影=> {中期=> 9,標題=> '傑森X',演員=> [ '凱恩Hodger', '的LexA癩']}

隨着電流的Postgres輸出我得到例如$電影{標題}等於[ '星際公敵', '星際公敵'],這裏只需要'傑森X'

+0

這是可能的,但你不應該這樣想。你應該在業務邏輯中處理它。 –

+0

@JakubKania所以你會建議獲取所有數據和一個查詢(與重複的數據)並解析它在業務邏輯?或通過多個查詢獲取數據查詢每個表並將它們合併到邏輯中? 我更關心如何做到這一點,尋找一個良好的做法。 – hythm

回答

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) 

參見:

的最佳做法的問題是有點冒險的,是因爲它可以被認爲過於寬泛或意見爲主。它在很大程度上取決於數據的大小。在返回行數有限的大多數簡單情況下,使用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) 

如果由應用程序在同一時間處理的行數較大時(比如說,幾十萬),那麼更有效的解決方案可以是在客戶端側使用多個查詢和數據的處理。

+0

klin:感謝您的幫助,我會嘗試使用JSON和聚合函數,並會報告這些對我有用。 – hythm

+0

感謝klin,我沒有看到現在使用jsonb類型的任何好處(可能將來需要)...array_agg函數正是我所需要的和編程語言即時使用處理postgres數組類型以及使用array_agg(actors) – hythm