2010-07-07 84 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