36 votes

Comment représenter une matrice de données bidimensionnelle dans une base de données ?

J'ai un ensemble de données qui consiste en un identifiant et une matrice (n x n) de données liées à cet identifiant.

Les noms des colonnes (A,B,C,D) et des lignes (1,2,3) sont également importants et doivent être conservés pour chaque ID individuel, ainsi que les données (a1,b1,c1,d1,...).

par exemple :

ID | A | B | C | D | D'IDENTIFICATION

1 | a1 | b1 | c1 | d1 |

2 | ... | ... | ... | ... |

3 | ... | ... | ... | ... |

J'essaie de déterminer la meilleure façon de modéliser cet ensemble de données dans une base de données, mais cela semble difficile étant donné la nature plate des SGBDR.

Vaut-il mieux que je conserve l'ID et un blob XML représentant la matrice de données, ou est-ce que je néglige une solution plus simple ?

Gracias.

33voto

chaos Points 69029

Les SGBDR ne sont pas plats. La partie R s'en charge. Ce dont vous avez besoin est :

Table Entity
------------
ID

Table EntityData
----------------
EntityID
MatrixRow (1, 2, 3...)
MatrixColumn (A, B, C, D...)
Value

Entity:EntityData est une relation un-à-plusieurs ; chaque cellule de la matrice a une ligne d'EntityData.

Vous disposez maintenant d'un schéma qui peut être analysé au niveau SQL, au lieu d'être un simple vidage de données où vous devez tout extraire au niveau de l'application pour en savoir plus.

7voto

jdkoftinoff Points 1468

C'est une des raisons pour lesquelles PostgreSQL supporte les tableaux comme type de données. Voir

Où il est indiqué que vous pouvez utiliser une syntaxe comme ARRAY[[1,2,3],[4,5,6],[7,8,9]] pour définir les valeurs d'une matrice 3x3 ou val integer[3][3] pour déclarer un type de colonne comme étant une matrice 3x3.

Bien sûr, ce n'est pas du tout du SQL standard et c'est spécifique à PostgreSQL. D'autres bases de données peuvent avoir des implémentations similaires, mais légèrement différentes.

4voto

Draemon Points 15448

Si vous voulez une solution vraiment relationnelle :

Matrix
------
id

Matrix_Cell
-----------
matrix_id
row
col
value

Mais des contraintes pour s'assurer que vous avez des données valides seraient hideuses.

Je considérerais une matrice comme une valeur unique en ce qui concerne la base de données et je la stockerai en tant que csv :

Matrix
------
id
cols
data

Ce qui est un peu plus léger que le XML.

2voto

Lee Points 6659

Je l'implémenterais probablement comme ceci :

Table MatrixData
----------------
id
rowName
columnName
datapoint

Si vous ne cherchez qu'à stocker les données, cette structure peut contenir une matrice de n'importe quelle taille et vous permettre de reconstituer n'importe quelle matrice à partir de l'ID. Vous aurez besoin d'un post-traitement pour la présenter dans un "format de matrice", mais c'est à cela que sert le code frontal.

0voto

djangofan Points 6046

Les données peuvent-elles être considérées comme des "données de ligne" ? si c'est le cas, vous pourriez peut-être stocker chaque ligne comme un objet (ou un Blob XML) avec les données A, B, C, D et ensuite, dans votre "représentation", vous utilisez quelque chose comme un LinkedHashMap (en supposant Java) pour obtenir les objets avec une clé ID.

En outre, il semble que, par sa nature même, une table de base de données typique fasse déjà ce dont vous avez besoin, n'est-ce pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X