web-dev-qa-db-fra.com

Comment représenter une matrice de données 2D dans une base de données

J'ai un ensemble de données qui se compose d'un ID et d'une matrice (n x n) de données liées à cet ID.

Les noms de colonne (A, B, C, D) et les noms de ligne (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 |

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, cependant, cela semble être quelque chose de difficile étant donné la nature plate du SGBDR.

Suis-je mieux de détenir l'ID et un blob XML représentant la matrice de données, ou est-ce que je néglige une solution plus simple ici.

Merci.

37
miguel

Les SGBDR ne sont pas plats. La partie R veille à cela. Ce dont vous avez besoin c'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 EntityData.

Vous avez maintenant un schéma qui peut être analysé au niveau SQL, au lieu d'être simplement un vidage de données où vous devez extraire et extraire tout au niveau de l'application afin de découvrir quoi que ce soit à ce sujet.

33
chaos

C'est l'une des raisons pour lesquelles PostgreSQL prend en charge les tableaux en tant que type de données. Voir

Où cela montre 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 qu'un type de colonne est une matrice 3x3.

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

7
jdkoftinoff

Si vous voulez une solution vraiment relationnelle:

Matrix
------
id

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

Mais des contraintes pour vous assurer que vous disposiez de 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 stockerais en tant que csv:

Matrix
------
id
cols
data

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

4
Draemon

Je l'implémenterais probablement comme ceci:

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

Si tout ce que vous recherchez est de stocker les données, cette structure contiendra n'importe quelle matrice de taille et vous permettra de reconstituer n'importe quelle matrice à partir de l'ID. Vous aurez besoin d'un post-traitement pour le présenter au "format matriciel", mais c'est à cela que sert le code frontal.

2
Lee

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

De plus, il semble que par sa nature très basique, une table de base de données typique fait déjà ce dont vous avez besoin, n'est-ce pas?

0
djangofan