database - software - Cómo representar una matriz de datos 2D en una base de datos
lucidchart database diagram (6)
Tengo un conjunto de datos que consta de un ID y una matriz (nxn) de datos relacionados con ese ID.
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:
ID | A | 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 ser algo difícil dada la naturaleza plana de RDBMS.
¿Será mejor que guarde 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.
¿Pueden los datos ser considerados como "datos de fila"? si es así, entonces podrías almacenar cada fila como un Objeto (o Blob XML) con los datos A, B, C, D y luego, en tu "representación", utilizas algo como un LinkedHashMap (suponiendo que Java) para obtener los objetos con una clave de ID.
Además, parece que por su naturaleza muy básica, una tabla de base de datos típica ya hace lo que necesita ¿no es así?
Esta es una de las razones por las que PostgreSQL admite matrices como un 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 se muestra puede usar sintaxis como ARRAY[[1,2,3],[4,5,6],[7,8,9]]
para definir los valores de una matriz de 3x3 o un val integer[3][3]
para declarar un tipo de columna como una matriz de 3x3.
Por supuesto, esto no es para nada SQL estándar y es específico de PostgreSQL. Otras bases de datos pueden tener implementaciones similares, pero ligeramente diferentes.
O mejor aún, lo que puedes hacer es crear una matriz lógica como estructura. Digamos que quiere almacenar una matriz m X n. Cree m atributos en la tabla. En cada atributo, almacenar n elementos separados por delimitadores ...
mientras recuperas los datos, simplemente realiza el análisis inverso para recuperar fácilmente los datos.
Probablemente lo implementaría así:
Table MatrixData
----------------
id
rowName
columnName
datapoint
Si todo lo que está buscando es almacenar los datos, esta estructura contendrá cualquier matriz de tamaño y le permitirá reconstituir cualquier matriz de la ID. Necesitará un poco de procesamiento posterior para presentarlo en "formato de matriz", pero para eso sirve el código de la interfaz.
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 en la matriz tiene una fila EntityData.
Ahora tiene un esquema que se puede analizar en el nivel de SQL, en lugar de simplemente ser un volcado de datos en el que tiene que extraer y extraer todo en el nivel de la aplicación para averiguar algo al respecto.
Si quieres una verdadera solución relacional:
Matrix
------
id
Matrix_Cell
-----------
matrix_id
row
col
value
Pero las restricciones para asegurarse de tener datos válidos serían horribles.
Consideraría una matriz como un único valor en lo que respecta al DB y lo almacenaría como csv:
Matrix
------
id
cols
data
Que es algo más ligero que XML.