Сложность с алгеброй матриц заключается в определении того, что является областью матрицы для целей моделирования данных. Это ценность? Это матрица в целом? Это не предопределенный вопрос, поэтому я дам вам два решения и каковы компромиссы.
Решение 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));