2016-07-28 31 views
1

我正在使用PostgreSQL來協調大型模擬,其中涉及通過整數數組初始化我的應用程序的各個組件。特別是,我有一個「控制器」的概念,每個控制器都需要可變數量的參數進行初始化。動態表名vs靜態表中的數組列

我有一個job表,它存儲了controller_id和一個controller_parameters外鍵,用於實際鏈接到我們想要的一組參數。我的想法開始是做到以下幾點:

  1. 使用controller_id動態選擇從中選擇初始化參數表名。每個表都有一個controller_parameters列,它將實際的初始化數據鏈接到源表。

  2. 一旦我們知道了表,運行SELECT * FROM @someController_parameters_table p WHERE p.controller_parameters = controller_parameters LIMIT 1;

  3. 把這些成具有整數數組字段被返回給客戶端自定義類型。

主要問題是,這有動態SQL,我聽說這不是一件好事。

我建議的更改是有一個新的表,比如controller_parameters其中有(controller_id, parameters_id, parameters[])列。第三列存儲單個控制器和參數集的初始化參數。

這個設計的優點是我們回到靜態SQL的土地,這是很好的。缺點是,當我生成插入到單個參數表的實際參數時,我通常使用交叉連接來獲取各個參數的所有排列,並將它們相應地插入到各個表中。我個人不知道如何獲取交叉連接的表格行並將其轉換爲int[],因此這是一個潛在的障礙。

想法?

回答

0

您可以使用array_agg來獲取組的結果並將其轉換爲數組。

select controller_id, parameters_id, array_agg(parameter) 
from ... 
group by controller_id, parameters_id 

這裏有聚集函數PostgreSQL的文檔:

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html

+0

所以ARRAY_AGG()像陣列(),但你不必指定列?它只是做不在Group By子句中的每一列?訂單是否與Order By子句中的內容相同? – ijustlovemath