sql - qué - que es una base de datos relacional en access
Almacenamiento de matrices en una base de datos relacional (4)
¿Es tu matriz densa de escasa? Si es escaso, puede ser mejor para cada entrada simplemente almacenar una lista de resultados, en lugar de tener una tabla 2D completa que sea mayormente de 0.
Estoy trabajando en un proyecto para un cliente y pasando por el diseño inicial de la base de datos. El proyecto será una aplicación web simple para el seguimiento de los procesos y sus resultados dentro de un diagrama matricial. Estoy buscando una buena manera de almacenarlos en tablas relacionales.
En este momento estoy pensando que tengo una tabla general para Rutinas que las colas xey también se mapearán y tal vez fuera de esa una tabla de búsqueda que contiene el ID de las coordenadas en las que se registra un "golpe". ¿Alguien tiene mejores maneras de hacer esto?
¡Gracias!
EDITAR:
Este es solo el comienzo del proyecto, por lo que tengo detalles limitados hasta ahora, pero mi razonamiento principal detrás de varias tablas es que las matrices serán completamente dinámicas en tamaño y genéricas, de modo que cada una puede ser diferente y estarán vinculadas a un usuario
También olvidé mencionar que el orden de los valores de x / y es importante, lo que respaldó aún más mi razonamiento detrás de tener múltiples tablas para xy y valores, por lo que asumo firmemente que la necesidad de conocer cada celda individual es importante
EJEMPLO:
El ejemplo básico (aunque abstracto) de esto se encuentra en el proceso con respecto a un restaurante. Las acciones son cosas como sentarse, pedir comida, revisar el menú, pedir bebidas, comer, pagar, etc. los resultados se toman en orden, las bebidas entregadas, la comida entregada, el cambio dado. Aunque aparentemente simple, se vuelve complejo cuando se toman en consideración las cosas que ocurren de manera diferente con cada evento, también en el caso de comida para llevar o buffets. El orden de las acciones y resultados se convierte en parte integral al ver las diferencias entre las situaciones.
En lugar de dos tablas, solo usaría una tabla: (x, y, resultado). Más allá de eso, es difícil dar más consejos con la información limitada proporcionada.
Hay muchas maneras de hacer esto, necesitaríamos mucha más información para ser más específicos sobre lo que sería mejor para usted. Sin embargo, aquí están las dos formas de SOP:
Ya sea una tabla separada para cada matriz:
CREATE TABLE YourMatrixName(
RowNo smallint NOT NULL,
ColNo smallint NOT NULL,
CellValue varchar](50) NULL,
CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED
([RowNo] ASC, [ColNo] ASC)
) ON [PRIMARY];
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_YourMatrixName ON dbo.YourMatrixName
(ColNo, RowNo);
GO
O, todas las matrices en una tabla:
CREATE TABLE Matrices(
MatrixName varchar(24) NOT NULL,
RowNo smallint NOT NULL,
ColNo smallint NOT NULL,
CellValue varchar(50) NULL,
CONSTRAINT [PK_Matrices] PRIMARY KEY CLUSTERED
([MatrixName] ASC, [RowNo] ASC, [ColNo] ASC)
) ON [PRIMARY];
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_Matrices ON dbo.Matrices
(ColNo, RowNo);
GO
Estas son formas normales estándar, prácticamente todas las otras formas de hacerlo no están bien normalizadas. Algunas ventajas de estos enfoques:
- No tiene que completar cada celda, solo las que está usando. O tener un valor predeterminado (0 o "") y omitirlos.
- Este es fácilmente el enfoque más flexible, incluso en el modelo "todo en uno", no es necesario restringirlos al mismo tamaño de ninguna manera, y es muy fácil cambiarlos de tamaño.
- Puede consultar fácilmente el contenido de la matriz, algo que es cada vez más difícil en los métodos de almacenamiento más compactos.
- Los "hit" o cualquier otro aspecto de las celdas de la matriz son fáciles de implementar como campos adicionales en las filas. Haga que sean nulos si está preocupado por el espacio adicional, e indíquelos si desea consultar / informar sobre estos atributos por separado. También es tan fácil de actualizar características como esta con este modelo también.
La principal desventaja es que generalmente hay una gran sobrecarga de datos y espacio. Muchos asumen que también hay una gran sobrecarga para insertar o recuperar nuevas matrices, pero de hecho hay varias técnicas documentadas que pueden hacerlo bastante rápido.
Memoria de video, una matriz 2D muy simple se almacena de la siguiente manera:
ABCD
EFGH
IJKL
en ram secuencialmente como una matriz como
A,B,C,D,E,F,G,H,I,J,K,L
el elemento x, y se puede encontrar en el desplazamiento de la matriz
[y*width+x]
por ejemplo, x = 2, y = 2 (basado en cero) se refiere al elemento K.
[y*width+x]=[2*4+2]=10.
elemento de matriz 10 (de nuevo basado en cero) = K, así que estás bien.
El almacenamiento en una lista delimitada por comas le permitirá colocar una matriz de cualquier tamaño en un campo nvarchar. Esto supone que no necesita consultar celdas individuales en SQL , sino que simplemente toma la matriz como un todo y la procesa del lado del cliente.
Su mesa puede verse así:
tbl_matrices
----
id
user_id
matrix nvarchar(max)
Además, esto funciona muy bien si las matrices son escasas, de lo contrario terminará con un montón de elementos vacíos. Aunque también puedes trabajar alrededor de eso.