Jump to content


Photo

Como representar un Vector y una Matriz en una base de datos


  • Please log in to reply
9 replies to this topic

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 10 November 2009 - 08:36 PM

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,
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 10 November 2009 - 08:48 PM

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. :)
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 10 November 2009 - 08:58 PM

Aquí puedes ver algo de información sobre lo que bien comenta Rolphy

http://ibexpert.net/...finitions#Multi

Salud OS
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 11 November 2009 - 08:56 AM

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,
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 11 November 2009 - 09:45 AM

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 :s.

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,
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 11 November 2009 - 09:49 AM

Con calma amigo, hasta agotar recursos, siempre hay algo que no estamos tomando en cuenta. :)

Salud OS
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 11 November 2009 - 10:09 AM

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 



delphi
  1. Vector:
  2.   Codigo: Integer PK
  3.   Nombre: String
  4.  
  5. VectorDetalles:
  6.   CodigoVector: Integer FK
  7.   COdigoDetalle: Integer PK
  8.   Valor: String;



donde un detalle es por cada valor del vector,  en verdad sigo sin ver porque te quieres enrredar la vida.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 11 November 2009 - 11:59 AM

Gracias compañeros,

Eduardo... ¿todavía no me conoces? ¡Si soy el anti KISS!  :D :p
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,
  • 0

#9 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 11 November 2009 - 12:13 PM

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
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 11 November 2009 - 01:34 PM

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,
  • 0




IP.Board spam blocked by CleanTalk.