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