2010-07-07 86 views
1

任何人都可以建議用於存儲二維時間序列矩陣數據的數據庫設計/ DBMS。爲了允許快速的後端代數計算:例如:二維矩陣代數的數據庫設計

表A,B,C .. Col1:Date-Timestamp col2:Data- Array? (矩陣數據)

  • SQL的僞代碼

INSERT INTO表C 通過B.Data SELECT 乘法A.Data A式矩陣的開始日期=基質B開始日期 和基質甲結束日期=矩陣B結束日期

基本上設置計算的座標。

+0

這是家庭作業? – 2010-07-07 10:02:29

+0

你能更精心製作嗎?尚不清楚。表格將包含什麼以及將從中獲取什麼。 – 2010-07-07 20:35:31

回答

1

矩陣代數的難點在於確定數據建模目的是什麼是矩陣上的一個域。這是一種價值嗎?它是一個整體的矩陣嗎?這不是一個預先定義的問題,所以我會給你兩個解決方案和權衡。

解決方案1:價值矩陣小區是一個域:

CREATE TABLE matrix_info (
    x_size int, 
    y_size int, 
    id serial not null unique, 
    timestamp not null, 
); 

CREATE TABLE matrix_cell (
    matrix_id int references matrix_info(id), 
    x int, 
    y int, 
    value numeric not null, 
    primary key (matrix_id, x, y) 
); 

大值得關注的是,這並不強制矩陣的大小非常好。此外,缺少的值可以用來表示0,或者可能不被允許。將矩陣作爲一個整體來使用的想法具有一定的吸引力。在這種情況下:

CREATE TABLE matrix (
    id serial not null unique, 
    timestamp not null, 
    matrix_data numeric[] 
); 

注意,很多數據庫的包括PostgreSQL將執行一個數組實際上是一個矩陣。然後你需要編寫你自己的函數來進行乘法運算等等。我會建議用對象關係的方式和PostgreSQL來做這件事,因爲它對於這類事情是非常可編程的。喜歡的東西:

CREATE TABLE matrix(int) RETURNS matrix LANGUAGE SQL AS 
$$ select * from matrix where id = $1 $$; 

CREATE FUNCTION multiply(matrix, matrix) RETURNS matrix LANGUAGE plpgsql AS 
$$ 
DECLARE matrix1 = $1.matrix_data; 
     matrix2 = $2.matrix_data; 
begin 
    ... 
end; 
$$; 

然後就可以調用矩陣乘法爲:

SELECT * FROM multiply(matrix(1), matrix(2)); 

你甚至可以插入到表中的其他兩個矩陣的乘積:

INSERT INTO matrix (matrix_data) 
SELECT matrix_data FROM multiply(matrix(1), matrix(2)); 
+0

好...直到矩陣改變大小。 +1 – 2017-06-27 01:41:23

+1

@CADbloke,我假設你的意思是我們將矩陣更新爲不同大小之一。但是,這並不構成任何特殊問題。您必須以任何方式處理乘法函數中的大小不變性。我們在這種情況下處理值(而且值不會改變),而不是對象或可變類型...... – 2017-06-28 10:08:29

+0

是的,這就是我的意思。我的用例偶爾會在兩個維度中添加額外的項目,它基本上是和X,Y距離表。同意,這不是一個不可能完成的任務,只是很煩瑣。 – 2017-06-28 10:15:07