Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

consejo/sugerencia con base de datos

Estas en el tema de consejo/sugerencia con base de datos en el foro de Mysql en Foros del Web. buenas, tengo una duda 'estructural' que no se como solucionar. os cuento. tengo un juego en fla, que tiene 3 mini juegos. y algunos de ...
  #1 (permalink)  
Antiguo 18/03/2011, 11:53
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
consejo/sugerencia con base de datos

buenas,

tengo una duda 'estructural' que no se como solucionar. os cuento. tengo un juego en fla, que tiene 3 mini juegos. y algunos de los juegos tienen niveles. tengo 2 base de datos, una de usuarios y la otra de puntuaciones.

hasta ahora, tenia en puntuaciones un solo registro, uno unico por usuario. lo unico que hacia era hacer un update del mismo registro, en el caso de que el resultado final fuera mayor o no. ahora necesito que cada partida se guarde por separado, con lo que hago inserts por separado. y ahi va la pregunta. tengo esta estructura:

Código:
CREATE TABLE `puntuaciones` (
  `id_puntuacion` bigint(7) NOT NULL AUTO_INCREMENT,
  `nick` varchar(100) NOT NULL,
  `nivelJ1` varchar(10) DEFAULT '0',
  `punt1J1` varchar(5) NOT NULL DEFAULT '0',
  `punt2J1` varchar(5) NOT NULL DEFAULT '0',
  `punt3J1` varchar(5) NOT NULL DEFAULT '0',
  `punt4J1` varchar(5) NOT NULL DEFAULT '0',
  `contadorJ2` varchar(5) NOT NULL DEFAULT '0',
  `punt1J2` varchar(5) NOT NULL DEFAULT '0',
  `punt2J2` varchar(5) NOT NULL DEFAULT '0',
  `punt1J3` varchar(5) NOT NULL DEFAULT '0',
  `tiempoJ3` varchar(7) NOT NULL DEFAULT '0',
  KEY `id_puntuacion` (`id_puntuacion`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
pero que pasa? que si por ejemplo juego al juego 3, el juego unicamente me guarda las 3 ultimas variables. y las otras se quedan a 0. y si juega al juego 1, me deja las otras a 0.

es un inconveniente tener campos vacios sin guardar? de que forma lo podria solucionar? como os digo, necesito tener listado por usuario, donde aparezcan todas las partidas realizadas, para cada juego. como puedo hacerlo?

saludos!
  #2 (permalink)  
Antiguo 18/03/2011, 12:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consejo/sugerencia con base de datos

Cita:
pero que pasa? que si por ejemplo juego al juego 3, el juego unicamente me guarda las 3 ultimas variables. y las otras se quedan a 0. y si juega al juego 1, me deja las otras a 0.

es un inconveniente tener campos vacios sin guardar? de que forma lo podria solucionar? como os digo, necesito tener listado por usuario, donde aparezcan todas las partidas realizadas, para cada juego. como puedo hacerlo?
Pasarle, tanto como pasarle, al sistema no le pasa nada, salvo que los valores serán NULL. El problema viene por otra parte: Desperdicias espacio de almacenamiento y tienes que asegurarte de no leer campos NULL luego.

Desde la óptica del modelado de datos, tienes un diseño erróneo porque planteaste el esquema basado en un único juego y no en todos, y como cada juego es diferente, debería tener un esquema de tabla diferente (herencia, un equivalente a clases y subclases en POO), o bien un esquema tal que permita administrar cualquier juego sin importar de cuántas variables necesite almacenar.

Yo me inclinaría por el segundo caso, que puede que te resulte más simple, aunque un poco más complicado de gestionar:

Una tabla para los datos genéricos del juego, y una tabla para las variables con tes campos, algo así como:

Cita:
Juego(id_juego, nick, tiempo_juego, ultimo_nivel)
Puntaje(id_juego, id_puntaje, puntos)
En este caso tendrás un registro por cada variable de puntaje que se necesite, y siempre puedes recuperarlas todas simplemente con dos datos: nick e id_juego.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/03/2011, 12:08
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: consejo/sugerencia con base de datos

uffff gracias pero me he perdido! jajajaa

el problema es que yo he heredado la programacion de un compañero que lo hizo, y ahora al cogerlo yo no lo veo correcto. es mas, estaba todo en una misma tabla usuarios, y se guardaba todo a la vez, datos y partidas.

no acabo de entender lo que me dices. yo guardo las variables de cada juego por separado. es decir, el j1 guarda lo suyo, el j2 lo suyo y asi.

no acabo de entender tu propuesta...pueedes indicarme mejor?

saludos!
  #4 (permalink)  
Antiguo 18/03/2011, 12:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consejo/sugerencia con base de datos

NO voy a entrar en detalles profundos sobre el modelo relacional ahora, porque parece que no es la idea, pero lo básico sería:
Por un lado tienes una entidad denominada "Juego", que puede tener una o muchas variables, pero lo que es seguro es que cada instancia de Juego puede tener diferentes cantidades de ellas. Eso implica que hay un conjunto de atributos (valores) que dependen del Juego en sí, pero que no es constante. Entonces se percibe que hay una entidad que denominamos "Puntaje" que depende de "Juego". Como depende de él y sólo existe porque el juego existe, se denomina "entidad débil", y hereda la clave primaria de la fuerte (Juego).
Esto se traduce en una tabla para Juego y otra para Puntaje. En la primera pones los atributos que son propios de todos los juegos. En la segunda pones aquellos atributos que te permitan saber a qué juego y usuario pertenece cada valor de puntos. En esta forma, la segunda tabla (Puntaje) debe tener dos campos para identificarse y un tercer camo para el valor: 1) La PK de la tabla Juego; 2) Un ID secuencial para numerar las variables propias de cada juego de un usuario y 3) El valor que se guarda.
Esta forma permite que un juego de tipo 1 tenga, por ejemplo, 3 variables; un juego de tipo 2, tenga 7 variables y así sucesivamente. El único secreto es que luego, para recuperar los valores de cada juego la consulta debe cruzar ambas tablas con un INNER JOIN:
Código MySQL:
Ver original
  1. SELECT P.nro_variable, P.valor_variable
  2. FROM juego J INNER JOIN puntaje P ON (J.juego_id = p.juego_id)
  3. WHERE J.nick = 'nickbuscado' AND J.nro_juego = numeroDeJuego;
y además, en lugar de recuperar un único registro, recibes una tabla ordenada donde en la misma columna y en forma sucesiva aparecen uno a uno los valores buscados.

¿Se entiende más?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/03/2011, 03:12
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: consejo/sugerencia con base de datos

buenas

estoy probando y no acabo de entender lo que me indicas. el problema esta sobretodo en el juego 1. tiene esta estructura:

`nivelJ1` varchar(10) DEFAULT '0',
`punt1J1` varchar(5) NOT NULL DEFAULT '0',
`punt2J1` varchar(5) NOT NULL DEFAULT '0',
`punt3J1` varchar(5) NOT NULL DEFAULT '0',
`punt4J1` varchar(5) NOT NULL DEFAULT '0',

y el problema es que para pasar de nivel, tienes que superar el 75% de aciertos. si eso pasa, la variable nivel suma 1, y entonces queda nivel 2, y entonces ak acceder al juego, te lleva directamente al nivel 2. se entiende?

por eso, puedes ponerme la estructura de las tablas que tu me planteas?

saludos y muchas gracias por tu tiempo!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:13.