二维矩阵代数的数据库设计

时间:2010-07-07 09:30:51

标签: database database-design matrix

任何人都可以建议数据库设计/ DBMS存储2D时间序列矩阵数据。允许快速的BACK END代数计算:例如:

表A,B,C .. Col1:日期 - 时间戳 col2:数据阵列? (矩阵数据)

  • SQL Psuedo Code

插入表C 选择 将数据A乘以B.Data 矩阵A开始日期=矩阵B开始日期 矩阵A结束日期=矩阵B结束日期

基本上设置计算的坐标。

1 个答案:

答案 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));