Foros del Web » Programando para Internet » PHP »

Duda sorbe estructura mysql para juego online

Estas en el tema de Duda sorbe estructura mysql para juego online en el foro de PHP en Foros del Web. Hola gente, estoy desarrollando un pequeño juego de navegador, y actualmente estoy revisando la estructura mysql para optimizarla. Por un lado, hay una tabla de ...
  #1 (permalink)  
Antiguo 22/09/2011, 09:50
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Pregunta Duda sorbe estructura mysql para juego online

Hola gente, estoy desarrollando un pequeño juego de navegador, y actualmente estoy revisando la estructura mysql para optimizarla.

Por un lado, hay una tabla de "items" en el servidor, la cual se va expandiendo constantemente, ya que los crean los usuarios. Por otro, la tabla de "usuarios", donde está la info de login, y actualmente, un campo donde dice que items tiene el usuario en cuestión (es decir, en el server pueden haber 100 items, pero el usuario solo tener 25).

La cuestión, es que en este momento el campo de items del usuario es un string, con id´s separados por coma. Se que esto es totalmente impractico, pero lo hice de está forma, primero por una falta de conocimiento, y segundo, porque si todo sale bien, con el tiempo pueden haber miles de usuarios, con miles de elementos creados, y me asusta un poco tener todos los registros en una misma tabla ya que desconosco la capacidad de mysql ("miles" de registros me suena a mucho, pero no se si realmente lo son para un servidor).

La pregunta concreta es sobre que sería más optimo, si buscar datos dentro de un string (que puede llegar a ser muy grande, ya que cada usuario puede llegar a los 500 items facilmente), o tener una tabla más, con un registro por cada elemento, de cada usuario (es decir, tendría miles y miles de registros).

Otra cosa, los items del server y del usuario están separados, porque la gente puede organizar sus items en categorías y demás, entonces el item "agua" de Jose, es diferente al de xxLegolasxx2 (de estár todos en una misma tabla, habría un "agua" por cada usuario que lo tenga).

Dejo un gráfico de como me imagino las tablas (resumidas) en cada caso:

Con string:


Separado en registros:


Por favor, tengamos en cuenta que necesito contemplar la posibilidad de que sean Miles y miles de registros en la segunda opción!

Espero que se entienda y me puedan asesorar! Saludos , Facu.
  #2 (permalink)  
Antiguo 22/09/2011, 10:28
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 17 años, 2 meses
Puntos: 55
Respuesta: Duda sorbe estructura mysql para juego online

@Efe_p
vamos por partes como dijera jack el destripador

si los items no son muchos y tampoco van a crecer demasiado en el tiempo podrias ponerlos directamente como campos del usuario

si los items van a ser por ejemplo 50 esto ya es un problema para opcion uno, enteonces deberias crear una tabla para items (id, nombre), otra para relacionarnos con los usuarios (idItem, idUsuario, cantidad)

en mi experiencia desarrollando juegos la segunda opcion siempre fue la mejor, es un poco mas robusto pero no tiene limitaciones
respecto de las cargas del servidor, lo mejor sera optimizar la tabla
utilizar indices, vistas para acceder rapidamente y algunos procedimientos almacenados cuando hay q hacer grandes operaciones

espero te sirva la ayuda
Emilio
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 22/09/2011, 10:41
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Respuesta: Duda sorbe estructura mysql para juego online

Hola Emilio, muchas gracias por tu respuesta. Con respecto a las cantidades, la idea es que sean muchos items en un futuro (significaría que la gente estuvo jugando), así que según lo que me dices la opción del string queda descartada.

En el caso de la tercera tabla, la que relacionará items con usuarios, para agilizar la carga, ¿estaría bien utilizar el id del usuario como indice (no conozco del todo el funcionamiento de los indices)? ya que sería de esta forma:

Digamos que la 3ra tabla es itemsPorUser

> Se logueo Jose
> Buscamos en la tabla itemsPorUser, que items tiene jose (es decir, la consulta buscaría todo lo que tenga el id de jose en itemsPorUser)
> Recupera las características de cada item de Jose de la tabla Items

Es decir, no se si serviría un id con autoincrement como indice para esta tercera tabla, ya que no se usaría ese dato para las búsquedas, sino que se usaría más el dato de "a quien pertenece" ese registro.
  #4 (permalink)  
Antiguo 22/09/2011, 11:05
Avatar de DrFaust  
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Aires
Mensajes: 308
Antigüedad: 11 años, 2 meses
Puntos: 87
Respuesta: Duda sorbe estructura mysql para juego online

La segunda opción es infinitamente más versátil. Por la temática que tienen tus ejemplos, estoy seguro de que tarde o temprano vas a querer implementar items complejos.

Por ejemplo, vas a querer implementar un sistema de crafting donde cada item lleve el nombre del personaje que lo forjó (Espada Larga de xxLegolasxx), o un sistema de equipo mejorable (Armadura Completa ---> Armadura Completa +1 de Fuego), o un sistema de durabilidad y ruptura de items, etcétera. Y tener los objetos en una tabla aparte, cada uno de ellos con su respectivo set de propiedades únicas, te va a facilitar muchísimo la vida.

Además, es un paradigma más fácil desde un punto de vista del mantenimiento. Por ejemplo, el día en que un jugador encuentre la forma de multiplicar items (SIEMPRE encuentran la forma), va a ser más fácil darse cuenta de que en la tabla de items aparecieron 7000 armaduras +9, que encontrar una ID en el inventario de uno de los personajes.

Respecto a qué columna utilizar como índice, yo tampoco soy un experto en el tema, pero tené en cuenta lo siguiente. Al mostrar el inventario sin duda vas a buscar la ID del usuario en la lista de items. Pero a partir de entonces, cada vez que el juego necesite conocer o modificar algo de un item en particular, va a utilizar la ID del item. Creo que lo segundo va a suceder más frecuentemente que lo primero.

Te convendría utilizar la ID del item como clave primaria (que por cierto siempre debería ser única), y la ID del usuario como índice.
__________________
Desarrollador web profesional

Última edición por DrFaust; 22/09/2011 a las 11:15
  #5 (permalink)  
Antiguo 22/09/2011, 13:36
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Respuesta: Duda sorbe estructura mysql para juego online

Hola Faust, excelente aporte, las propiedades múltiples de cada item por usuario es algo que en algún momento voy a implementar, y la verdad no había pensado concretamente como hacerlo. Voy a ir sin duda por la opción 2, si hubiera seguido desarrollando en formato strings, después se me iba a complicar tal cual lo marcas.

Además, estuve investigando un poco el tema de la cantidad de registros, y me encontré con que "miles" no es una grán cantidad para la capacidad de procesamiento media de un server (siendo registros simples obviamente). Recién llegando a los "millones" es cuando hay que aplicar técnicas de particionamiento y demás para evitar perdidas de velocidad. Así que voy a investigar un poco más el tema de los indices y a reformular la estructura!

Gracias y saludos, Facu.
  #6 (permalink)  
Antiguo 22/09/2011, 13:54
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 12 años, 2 meses
Puntos: 91
Respuesta: Duda sorbe estructura mysql para juego online

La opción 2 es la mejor.
Además si un usuario pierde un item vas a tener que hacer muchas validaciones para eliminarlo
o incluso si quieres saber si un usuario tiene un item en particular o que usuarios tienen ciertos items en particular.

Por tu salud, y como ya te han dicho acá arriba la opción 2 es la mejor :P

Saludos y suerte con el juego ;D
  #7 (permalink)  
Antiguo 23/09/2011, 08:28
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Respuesta: Duda sorbe estructura mysql para juego online

Gracias Ribon, se va a llamar "Wikimia", ojala caigan algún día en el : )

Etiquetas: cantidad, capacidad, estructura, mysql, optimo, pesado, rapido, registros, string
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:36.