【问题标题】:Database Design for 2D Matrix Algebra二维矩阵代数的数据库设计
【发布时间】:2013-03-25 08:49:53
【问题描述】:

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

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

  • SQL 伪代码

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

本质上是设置计算的坐标。

【问题讨论】:

  • 你能再详细点吗?目前还不清楚。表将包含什么以及将从中获取什么。

标签: database database-design matrix


【解决方案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));

【讨论】:

  • 好...直到矩阵改变大小。 +1
  • @CADbloke,我假设您的意思是我们将矩阵更新为不同大小的矩阵。然而,问题是这不会造成任何特别的问题。无论哪种方式,您都必须处理乘法函数中的大小不变性。在这种情况下,我们处理值(并且值不会改变)而不是对象或可变类型....
  • 是的,这就是我的意思。我的用例偶尔会在两个维度上添加额外的项目,基本上是 X,Y 距离表。同意,这不是一项不可能完成的任务,只是很繁琐。
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 2020-12-26
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多