Cómo representar una matriz de datos 2-D en una base de datos
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.
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:EntityData
es 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.
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.
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.
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.