Cómo representar una matriz de datos 2-D en una base de datos

Resuelto miguel asked hace 15 años • 6 respuestas

Tengo un conjunto de datos que consta de una identificación y una matriz (nxn) de datos relacionados con esa identificación.

Tanto los nombres de las columnas (A,B,C,D) como los nombres de las filas (1,2,3) también son importantes y deben mantenerse para cada ID individual, así como los datos (a1,b1,c1,d1 ,...)

Por ejemplo:

identificación | Un | B | C | D |

1 | a1 | b1 | c1 | d1 |

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

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

Estoy tratando de determinar la mejor manera de modelar este conjunto de datos en una base de datos; sin embargo, parece algo difícil dada la naturaleza plana de RDBMS.

¿Es mejor que mantenga el ID y un blob XML que represente la matriz de datos, o estoy pasando por alto una solución más simple aquí?

Gracias.

miguel avatar Jul 16 '09 23:07 miguel
Aceptado

Los RDBMS no son planos. La parte R se encarga de eso. Lo que necesitas es:

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

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

Entity:EntityDataes una relación de uno a muchos; cada celda de la matriz tiene una fila EntityData.

Ahora tiene un esquema que se puede analizar a nivel de SQL, en lugar de ser simplemente un volcado de datos donde tiene que extraer todo a nivel de aplicación para poder descubrir algo al respecto.

chaos avatar Jul 16 '2009 16:07 chaos

Esta es una de las razones por las que PostgreSQL admite matrices como tipo de datos. Ver

  • http://www.postgresql.org/docs/8.4/static/functions-array.html y
  • http://www.postgresql.org/docs/8.4/static/arrays.html

Donde muestra que puede usar una sintaxis como ARRAY[[1,2,3],[4,5,6],[7,8,9]]para definir los valores de una matriz de 3x3 o val integer[3][3]declarar un tipo de columna como una matriz de 3x3.

Por supuesto, esto no es SQL estándar en absoluto y es específico de PostgreSQL. Otras bases de datos pueden tener implementaciones similares pero ligeramente diferentes.

jdkoftinoff avatar Jul 16 '2009 16:07 jdkoftinoff

Si desea una solución verdaderamente relacional:

Matrix
------
id

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

Pero las limitaciones para asegurarse de tener datos válidos serían espantosas.

Consideraría una matriz como un valor único en lo que respecta a la base de datos y la almacenaría como csv:

Matrix
------
id
cols
data

Que es algo más ligero que XML.

Draemon avatar Jul 16 '2009 16:07 Draemon

Probablemente lo implementaría así:

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

Si lo único que busca es almacenar los datos, esta estructura contendrá una matriz de cualquier tamaño y le permitirá reconstituir cualquier matriz a partir del ID. Necesitará algo de procesamiento posterior para presentarlo en "formato matricial", pero para eso está el código de interfaz.

Lee avatar Jul 16 '2009 16:07 Lee