2010-07-07 3 views
1

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

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

  • SQL псевдопользователей код

INSERT INTO TABLE C ВЫБРАТЬ Multiply A.Data А на B.Data Где матрица А дата начала = Матрица B Дата начала и матрица А Конечная дата = Матрица B Конечная дата

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

+0

Является ли это домашнее задание? –

+0

Можете ли вы быть более сложными? Его еще не ясно. Что таблица будет содержать и что будет извлечено из нее. –

ответ

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 –

+1

@CADbloke, я предполагаю, вы имеете в виду, что мы обновляем матрицу до другого размера. Дело в том, что это не создает особых проблем. Вы должны обрабатывать инварианты размера в своих функциях умножения в любом случае. Мы работаем над значениями (и значения не меняются), а не объекты или изменяемые типы в этом случае .... –

+0

yup, вот что я имел в виду. Мой случай использования иногда добавлял дополнительные элементы в оба измерения, это в основном и таблица расстояний X, Y. Согласитесь, это нереальная задача, просто нерешительно. –

Смежные вопросы