
Como representar un Vector y una Matriz en una base de datos
Comenzado por
Delphius
, nov 10 2009 08:36
9 respuestas en este tema
#1
Escrito 10 noviembre 2009 - 08:36
Hola amigos,
Hoy vengo con una duda más que pregunta, ando filosofando sobre distintas opciones para guardar vectores y una matrices en una base de datos.
En una primera impresión me dije, bueno lo más directo y sencillo es tener una relación (1:M) entre una hipotética tabla Vectores y una Tabla DetalleVectores.
De este modo se conseguiría que dado un vector V = [v1, ...vn] se tenga un registro en Vectores que lo identifique, y N registros en DetalleVectores.
El asunto es que este N puede ser bastante grande, y si lo multiplicamos por la cantidad de vectores aún más... Luego me dije que se podría mejorar el diseño y eliminar cierta carga si se contemplase posibles valores repetidos para sus componentes. Pero aún así, el diseño sería un tanto más complejo y requeriría de la implementación de búsquedas en tablas para saber si se encuentra o no (por más que sea "directo"... son ciclos y uso de procesador que puedo ahorrar).
La alternativa que he descartado es tener un solo registro con N campos.... Simplemente es inviable.
Podría pensar en valerme de la idea de un campo blob, pero no me convence del todo, ya que debería implementar un mecanismo de "traducción" algo tipo VectorToBlob y BlobToVector. Mi cabeza me quiere vender la idea de que es posible implementar un algoritmo de reducción/cifrado que sea capaz de obtener una representación compacta del mismo, pero no logro ver por donde podría analizarlo.
Si bien Firebird se puede vancar bien los miles de datos, quisiera aliviarle un tanto la carga... la idea más simple indica que opte por el (1:M) y un diseño similar para la matriz:
Matrices -1--M- Filas -1---M-Columnas
¿Como lo ven ustedes? ¿Se les ocurre por donde darle tuerca?
Saludos,
Hoy vengo con una duda más que pregunta, ando filosofando sobre distintas opciones para guardar vectores y una matrices en una base de datos.
En una primera impresión me dije, bueno lo más directo y sencillo es tener una relación (1:M) entre una hipotética tabla Vectores y una Tabla DetalleVectores.
De este modo se conseguiría que dado un vector V = [v1, ...vn] se tenga un registro en Vectores que lo identifique, y N registros en DetalleVectores.
El asunto es que este N puede ser bastante grande, y si lo multiplicamos por la cantidad de vectores aún más... Luego me dije que se podría mejorar el diseño y eliminar cierta carga si se contemplase posibles valores repetidos para sus componentes. Pero aún así, el diseño sería un tanto más complejo y requeriría de la implementación de búsquedas en tablas para saber si se encuentra o no (por más que sea "directo"... son ciclos y uso de procesador que puedo ahorrar).
La alternativa que he descartado es tener un solo registro con N campos.... Simplemente es inviable.
Podría pensar en valerme de la idea de un campo blob, pero no me convence del todo, ya que debería implementar un mecanismo de "traducción" algo tipo VectorToBlob y BlobToVector. Mi cabeza me quiere vender la idea de que es posible implementar un algoritmo de reducción/cifrado que sea capaz de obtener una representación compacta del mismo, pero no logro ver por donde podría analizarlo.
Si bien Firebird se puede vancar bien los miles de datos, quisiera aliviarle un tanto la carga... la idea más simple indica que opte por el (1:M) y un diseño similar para la matriz:
Matrices -1--M- Filas -1---M-Columnas
¿Como lo ven ustedes? ¿Se les ocurre por donde darle tuerca?
Saludos,
#2
Escrito 10 noviembre 2009 - 08:48
Saludos.
No entiendo bien tu idea, pero hasta donde tengo entendido Firebird soporta Arreglos.
No he explorado esa opción, quizás pueda servirte para lo que andas buscando.
No entiendo bien tu idea, pero hasta donde tengo entendido Firebird soporta Arreglos.
No he explorado esa opción, quizás pueda servirte para lo que andas buscando.

#3
Escrito 10 noviembre 2009 - 08:58
Aquí puedes ver algo de información sobre lo que bien comenta Rolphy
http://ibexpert.net/...finitions#Multi
Salud OS
http://ibexpert.net/...finitions#Multi
Salud OS
#4
Escrito 11 noviembre 2009 - 08:56
Hola,
Gracias por el consejo muchachos.
Recuerdo haber leído algo sobre ello... de lo que no estoy completamente seguro, es si la versión 1.5 ya lo soportaba o si es algo de la 2.0
Tengo que ponerme a ver esto.
Saludos,
Gracias por el consejo muchachos.
Recuerdo haber leído algo sobre ello... de lo que no estoy completamente seguro, es si la versión 1.5 ya lo soportaba o si es algo de la 2.0
Tengo que ponerme a ver esto.
Saludos,
#5
Escrito 11 noviembre 2009 - 09:45
Pues, estuve probando y si... puedo declarar un array, más no puedo declarar arrays multidimensional.
Se queja cuando intento declarar la segunda dimensión. 
Intenté ver de que modo se inserta y se extrae los datos pero no veo como... Buscando entre la FAQ, y otros sitios, y con la ayuda de San Google no encuentro algo que me oriente
.
De entrada, según la hoja de conformidad con el estandar SQL firebird pone con pinzas el soporte básico de arrays. 8-)
Creo que va a ser mejor normalizar el diseño y las tablas.
Saludos,


Intenté ver de que modo se inserta y se extrae los datos pero no veo como... Buscando entre la FAQ, y otros sitios, y con la ayuda de San Google no encuentro algo que me oriente

De entrada, según la hoja de conformidad con el estandar SQL firebird pone con pinzas el soporte básico de arrays. 8-)
Creo que va a ser mejor normalizar el diseño y las tablas.
Saludos,
#6
Escrito 11 noviembre 2009 - 09:49
Con calma amigo, hasta agotar recursos, siempre hay algo que no estamos tomando en cuenta. 
Salud OS

Salud OS
#7
Escrito 11 noviembre 2009 - 10:09
Hay un dicho que dice: "Si tu estas tranquilo mientras todos pierden la cabeza, es que no has visto la verdadera magnitud del problema"
Yo lo veo muy sencillo con la opcion 1:M
donde un detalle es por cada valor del vector, en verdad sigo sin ver porque te quieres enrredar la vida.
Yo lo veo muy sencillo con la opcion 1:M
delphi
Vector: Codigo: Integer PK Nombre: String VectorDetalles: CodigoVector: Integer FK COdigoDetalle: Integer PK Valor: String;
donde un detalle es por cada valor del vector, en verdad sigo sin ver porque te quieres enrredar la vida.
#8
Escrito 11 noviembre 2009 - 11:59
Gracias compañeros,
Eduardo... ¿todavía no me conoces? ¡Si soy el anti KISS!

Jajaja
Es que ando evaluando alternativas. Hasta ahorita la que más me está convenciendo es la de 1:M para vectores y la de 1:M-1:M para matrices.
Más que nada estoy tratando de ver si hay alternativas a ese diseño. Puesto que el crecimiento puede ser cuadrático... y si bien Firebird se lo puede vancar bien, busco reducir lo más posible la cantidad.
Saludos,
Eduardo... ¿todavía no me conoces? ¡Si soy el anti KISS!


Jajaja
Es que ando evaluando alternativas. Hasta ahorita la que más me está convenciendo es la de 1:M para vectores y la de 1:M-1:M para matrices.
Más que nada estoy tratando de ver si hay alternativas a ese diseño. Puesto que el crecimiento puede ser cuadrático... y si bien Firebird se lo puede vancar bien, busco reducir lo más posible la cantidad.
Saludos,
#9
Escrito 11 noviembre 2009 - 12:13
a ver, estos son los numero que saco:
Un vector o Matriz son estaticos, esto quiere decir que tienes que declararlo antes de utilizarlo, con lo cual reservas la memoria la utilizes o no. Aqui llegamos al punto que dependemos de la cantidad de memoria disponible, saquemos en cuenta siendo "extraordinariamente" optimistas que hablamos de 4GB, un BD de Firebird 4GB es uno risotada y no le supone mayor carga.
De pronto si estoy equivocado espero me corrijan, pero asi lo veo.
Ahora si lo que quieres es enrredarte la vida, saca a newdelphius y llevalo a pasear al centro y veras que de problemas te metes jeje
Un vector o Matriz son estaticos, esto quiere decir que tienes que declararlo antes de utilizarlo, con lo cual reservas la memoria la utilizes o no. Aqui llegamos al punto que dependemos de la cantidad de memoria disponible, saquemos en cuenta siendo "extraordinariamente" optimistas que hablamos de 4GB, un BD de Firebird 4GB es uno risotada y no le supone mayor carga.
De pronto si estoy equivocado espero me corrijan, pero asi lo veo.
Ahora si lo que quieres es enrredarte la vida, saca a newdelphius y llevalo a pasear al centro y veras que de problemas te metes jeje
#10
Escrito 11 noviembre 2009 - 01:34
Todavía no hice números. No puedo decir cuanto espacio ocupará, pero si puedo hacer estimaciones... veamos,
vector = 92*112 = 10304 componentes = 10304 registros
40 vectores = 10304 x 40 = 412160 registros
Matriz:
Versión ampliada AAT: 10304 x 10304 = 106.172.416 registros
Versión reducida ATA: 40 x 40 = 1600 registros
¡Enorme diferencia!
Como la matriz se puede calcular... necesito sólo a los 40 vectores que la forman... ya sea que tenga la ampliada o la reducida.
Algunos vectores también se pueden calcular...
De todas formas, Firebird lo soporta. Todavía no está del todo analizado que guardaré. Algunos datos pueden obtenerse por cálculos y se podría obviar en el almacenamiento. Por otro lado, el tenerlos guardados me evita estar haciendo miles de operaciones...
No se... esto se verá cuando hagas las pruebas definitivas.
Saludos,
vector = 92*112 = 10304 componentes = 10304 registros
40 vectores = 10304 x 40 = 412160 registros
Matriz:
Versión ampliada AAT: 10304 x 10304 = 106.172.416 registros
Versión reducida ATA: 40 x 40 = 1600 registros
¡Enorme diferencia!
Como la matriz se puede calcular... necesito sólo a los 40 vectores que la forman... ya sea que tenga la ampliada o la reducida.
Algunos vectores también se pueden calcular...
De todas formas, Firebird lo soporta. Todavía no está del todo analizado que guardaré. Algunos datos pueden obtenerse por cálculos y se podría obviar en el almacenamiento. Por otro lado, el tenerlos guardados me evita estar haciendo miles de operaciones...
No se... esto se verá cuando hagas las pruebas definitivas.
Saludos,