Разработка базы данных для 2D матричной алгебры - PullRequest
1 голос
/ 07 июля 2010

Может ли кто-нибудь посоветовать проектирование базы данных / СУБД для хранения данных матрицы временных рядов 2D.Для обеспечения быстрых BACK END алгебраических вычислений: например:

Таблица A, B, C .. Col1: дата-метка времени col2: массив данных?(Матричные данные)

  • Код SQL Psuedo

ВСТАВИТЬ В ТАБЛИЦУ C ВЫБРАТЬ Умножить A.Data A на B.Data Где Matrix A Дата начала = Matrix B Дата начала AndМатрица A Дата окончания = Матрица B Дата окончания

По существу задайте координаты для расчета.

1 Ответ

1 голос
/ 25 марта 2013

Сложность с алгеброй матриц заключается в определении того, что является областью матрицы для целей моделирования данных. Это ценность? Это матрица в целом? Это не предопределенный вопрос, поэтому я дам вам два решения и каковы компромиссы.

Решение 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...