任何人都可以建议数据库设计/ DBMS存储2D时间序列矩阵数据。允许快速的BACK END代数计算:例如:
表A,B,C .. Col1:日期 - 时间戳 col2:数据阵列? (矩阵数据)
插入表C 选择 将数据A乘以B.Data 矩阵A开始日期=矩阵B开始日期 矩阵A结束日期=矩阵B结束日期
基本上设置计算的坐标。
答案 0 :(得分: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在内的许多db都会强制执行数组实际上是一个矩阵。然后你需要编写自己的乘法函数等。我建议以对象关系的方式和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));