2010-07-07 3 views
1

Quelqu'un peut-il donner des conseils sur une conception de base de données/SGBD pour stocker des données de matrice de séries temporelles 2D. Pour permettre des calculs algébriques BACK END rapides: par exemple:Conception de base de données pour l'algèbre matricielle 2D

Tableau A, B, C Col1: Date - Horodatage col2: Data- Array? (Data Matrix)

  • code SQL Psuedo

INSERT INTO TABLE C SELECT Multiplier A.Data A par B.Data Où Matrice A = Date de début Matrice B Date de début et la matrice A Date de fin = Matrice B Date de fin

Définissez essentiellement les coordonnées pour le calcul.

+0

Est-ce devoirs? –

+0

Pouvez-vous être plus élaboré? Ce n'est pas encore clair. Ce que la table contiendra et ce qui sera extrait d'elle. –

Répondre

1

La difficulté avec l'algèbre matricielle est de déterminer ce qu'est un domaine sur la matrice à des fins de modélisation de données. Est-ce une valeur? Est-ce une matrice dans son ensemble? Ce n'est pas une question prédéfinie, alors je vais vous donner deux solutions et quels sont les compromis.

Solution 1: Valeur dans une cellule de matrice est un domaine:

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) 
); 

La grande préoccupation est que cela ne l'applique pas très bien la taille de la matrice. De plus, une valeur manquante pourrait être utilisée pour représenter 0 ou pourrait ne pas être autorisée. L'idée d'utiliser une matrice dans son ensemble a un certain attrait. Dans ce cas:

CREATE TABLE matrix (
    id serial not null unique, 
    timestamp not null, 
    matrix_data numeric[] 
); 

Notez que beaucoup de db de PostgreSQL y compris appliquerons qu'un tableau est en fait une matrice. Ensuite, vous devrez écrire vos propres fonctions pour la multiplication, etc. Je vous recommande de le faire de manière relationnelle avec l'objet et sur PostgreSQL car il est assez programmable pour ce genre de choses. Quelque chose comme:

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; 
$$; 

Ensuite, vous pouvez appeler la multiplication matricielle:

SELECT * FROM multiply(matrix(1), matrix(2)); 

Vous pouvez même insérer dans la table le produit de deux autres matrices:

INSERT INTO matrix (matrix_data) 
SELECT matrix_data FROM multiply(matrix(1), matrix(2)); 
+0

Bon ... jusqu'à ce que la matrice change de taille. +1 –

+1

@CADbloke, je suppose que vous voulez dire que nous mettons à jour une matrice d'une taille différente. La chose est cependant que cela ne pose pas de problèmes particuliers. Vous devez gérer les invariances de taille dans vos fonctions de multiplication de toute façon. Nous travaillons sur des valeurs (et les valeurs ne changent pas) plutôt que sur des objets ou des types mutables dans ce cas .... –

+0

yup, c'est ce que je voulais dire. Mon cas d'utilisation ajouterait occasionnellement des éléments supplémentaires dans les deux dimensions, c'est fondamentalement et la table de distance X, Y. D'accord, ce n'est pas une tâche impossible, juste fiddly. –

Questions connexes