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

Duda optimizar campos tabla

Estas en el tema de Duda optimizar campos tabla en el foro de Bases de Datos General en Foros del Web. Buenas, Me gustaría saber vuestra opinión sobre la siguiente estructura de la tabla @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE TABLE partidos (     ...
  #1 (permalink)  
Antiguo 24/03/2010, 13:14
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Duda optimizar campos tabla

Buenas,

Me gustaría saber vuestra opinión sobre la siguiente estructura de la tabla

Código SQL:
Ver original
  1. CREATE TABLE partidos (
  2.     id INT(11) NOT NULL AUTO_INCREMENT,
  3.     idsoccer INT(1) NOT NULL,
  4.     competicion INT(1) NOT NULL,
  5.     fecha DATETIME NOT NULL,
  6.     ronda VARCHAR(6),
  7.         estado VARCHAR(6),
  8.     home VARCHAR(25) NOT NULL,
  9.     away VARCHAR(25) NOT NULL,
  10.     ht VARCHAR(5),
  11.     ft VARCHAR(5),
  12.     PRIMARY KEY(id)
  13. );

Los datos que van en ella son de este estilo:

Código:
1 | 684585 | 23 | 2009-08-29 20:00 | 1 | FT | Real Madrid | 3-2 | 2-1 | Deportivo La Coruna |
2 | 684589 | 23 | 2009-08-29 22:00 | 1 | FT | Zaragoza | 1-0 | 0-0 | Tenerife |
3 | 684593 | 23 | 2009-08-30 17:00 | 1 | FT | Racing Santander | 1-4 | 1-3 | Getafe |
4 | 684586 | 23 | 2009-08-30 17:00 | 1 | FT | Athletic Bilbao | 1-0 | 0-0 | Espanyol |

En detalle...


id | idsoccer | competicion | fecha | ronda | estado | home | ft | ht | away

ID > lo pongo yo auto_incremental para que no haya repetidos
IDSOCCER > es el ID que asigna la pagina externa (que parseo) al partido
COMPETICION > si es primera división, segunda, copa, etc... pero lo guardo como un valor entero puede ir de 1 a 99.999 x ej.
FECHA > la fecha del partido
RONDA > sería la jornada en liga, o 1/8, 1/4 1/2, final.. en caso de eliminatorias
ESTADO > si ha acabado FT, HT media parte, PLAY jugando...
HOME > equipo que juega en casa
FT > resultado al final del encuentro
HT > resultado a la media parte
AWAY > equipo que juega fuera de casa

Los resultados serán como mucho de 11-11 de (5 caracteres) siendo lo normal 3

Agradezco vuestros comentarios y sugerencias
  #2 (permalink)  
Antiguo 26/03/2010, 08:24
Avatar de ikaroraul  
Fecha de Ingreso: octubre-2006
Ubicación: La Paz
Mensajes: 391
Antigüedad: 17 años, 7 meses
Puntos: 16
Respuesta: Duda optimizar campos tabla

Esta buena... tomaste bien la longitud de campos... ahroa solo no te olvids de validar tb ese dato en el formulario de registro... muy bueno... pocos hacen ese trabajo usualmenten le mente varchar(255).

Felicitaciones
__________________
Msn: [email protected]
  #3 (permalink)  
Antiguo 26/03/2010, 10:08
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda optimizar campos tabla

Cita:
Iniciado por ikaroraul Ver Mensaje
Esta buena... tomaste bien la longitud de campos... ahroa solo no te olvids de validar tb ese dato en el formulario de registro... muy bueno... pocos hacen ese trabajo usualmenten le mente varchar(255).

Felicitaciones
Gracias,

De todas formas no me queda muy claro el número que va dentro del int(1) a que hace referencia...

SMALLINT, para números enteros, con rango desde -32768 a 32767. Si se configura como unsigned, 0 a 65535.

MEDIUMINT para números enteros; el rango de valores va desde -8.388608 a 8388607. Si se configura como unsigned, 0 a 16777215

Entiendo que si configuro un SMALLINT unsigned puedo llegar hasta los 65535 valores, correcto? entonces para que se pone el numero entre parasentesis en los int()?¿?

Segun la doc oficial de mysql

Another extension is supported by MySQL for optionally specifying the display width of integer data types in parentheses following the base keyword for the type (for example, INT(4)). This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. (That is, this width is present in the metadata returned with result sets. Whether it is used or not is up to the application.)

¿Lo llena de ceros delante? yo pensaba que los ceros se ponian con zerofill...

Muchas gracias de antemano!

Última edición por neodani; 26/03/2010 a las 10:14
  #4 (permalink)  
Antiguo 26/03/2010, 14:30
Avatar de ikaroraul  
Fecha de Ingreso: octubre-2006
Ubicación: La Paz
Mensajes: 391
Antigüedad: 17 años, 7 meses
Puntos: 16
Respuesta: Duda optimizar campos tabla

mmmm pues la verdad tenia la idea de que int (valor) valor te limitada a la cantidad de digitos... pero probando pues = me deja poner mas digitos que 1, pues la verdad ya me entro la duda... :S
__________________
Msn: [email protected]
  #5 (permalink)  
Antiguo 26/03/2010, 18:19
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: Duda optimizar campos tabla

El valor entre paréntesis de un INT no es la cantidad de dígitos, sino el ancho de representación que usa, por ejemplo, ZEROFILLED.
Sólo en los DOUBLE, FLOAT y DECIMAL, en el caso de MySQL, se usan para definir la cantidad de dígitos.
El rango de representación de un entero está dado por el tipo de dato y su rango.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 27/03/2010, 02:12
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda optimizar campos tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El valor entre paréntesis de un INT no es la cantidad de dígitos, sino el ancho de representación que usa, por ejemplo, ZEROFILLED.
Sólo en los DOUBLE, FLOAT y DECIMAL, en el caso de MySQL, se usan para definir la cantidad de dígitos.
El rango de representación de un entero está dado por el tipo de dato y su rango.
Pero entonces en los INT no sirve de nada poner un número entre parentesis a no ser que sino le añades el ZEROFILLED (para que te rellene 0 delante) estoy en lo cierto?

Muchas gracias!
  #7 (permalink)  
Antiguo 27/03/2010, 06:56
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: Duda optimizar campos tabla

No. Para que te quede claro, sería mejor que leyeras el manual de referencia: Tipos de columna
Específicamente:
Cita:
MySQL soporta otra extensión para especificar de forma óptima el ancho a mostrar de un tipo entero en paréntesis después de la palabra clave para el tipo (por ejemplo, INT(4)). Esta especificación opcional del ancho de muestra se usa para alinear a la izquierda la muestra de los valores con ancho menor que el ancho especificado para la columna.

El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, no el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna.

Cuando se usa en conjunción con el atributo de extensión opcional ZEROFILL, el relleno por defecto de espacios se replaza por ceros. Por ejemplo, para una columna declarada como INT(5) ZEROFILL, un valor de 4 se muestra como 00004. Tenga en cuenta que si almacena valores mayores que el ancho de muestra en una columna entera, puede tener problemas cuando MySQL genera tablas temporales para algunos joins complicados, ya que en estos casos MySQL cree que los datos encajan en el ancho original de la columna.
Usa el manual. El 90% de las veces las respuestas esenciales están allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 27/03/2010, 07:33
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda optimizar campos tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No. Para que te quede claro, sería mejor que leyeras el manual de referencia: Tipos de columna
Específicamente:
Usa el manual. El 90% de las veces las respuestas esenciales están allí.
Gracias gnzsoloyo, te agradecería si puedes confirmarme esto, por favor:

Si no vas a usar los valores almacenados de la forma 0001, 0002, etc... es mejor no usar paréntesis cuando defines los enteros.


Ya que la frase
"no el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna." no me es clara del todo.

Muchas gracias
  #9 (permalink)  
Antiguo 27/03/2010, 08:38
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: Duda optimizar campos tabla

En todo lo que signifique representación de datos, deja de lado lo que implique almacenamiento y déjaselo a la aplicación.
Lo que dice el manual hace referencia al uso de consultas en SQL, y no a lo que luego uses en la aplicación, y el caso al que te refieres es un buen ejemplo.
Si usas ese tipo de definición de campos, con los paréntesis, y usas la consola de MySQL, obtendrás esos "0001", "0002", etc.; pero cuando uses una interfase, esos mismos datos llegarán a la aplicación como 1, 2, etc. a pesar de ponerle el ZEROFILL, porque cuando las tablas pasan a la aplicación sufren una conversión de tipos a Integer, Int32, Int, Decimal, Double, o lo que sea que se use en ese lenguaje. Esto hará que los ceros a la izquierda de la coma desaparezcan (¿Recuerdas el concepto de "cero a la izquierda"?), a menos que los datos numéricos sean convertidos en cadenas...
En cualquier caso, es absolutamente innecesario ponerle el ZEROFILL a mi juicio, porque si lo que quieres es rellenar la representación, bien puedes usar funciones como LPAD() o RPAD(), que hacen exactamente esa tarea, pero en el SELECT (y los lenguajes de programación cuentan con funciones similares).

Resumiendo: Si quieres ponerle esa condición, pónsela, pero no afectará el resultado a menos que uses cierto tipo de interfases, y serán ignorados a la hora de usarlos en las aplicaciones .Net, PHP, Java, Jscript o cualquier otra, porque esos casos usan tipos propios de dato.
El uso de ese formato, al decir de Seven of Nine: "Es irrelevante"...

¿Se comprende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 27/03/2010, 15:24
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda optimizar campos tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En todo lo que signifique representación de datos, deja de lado lo que implique almacenamiento y déjaselo a la aplicación.
Lo que dice el manual hace referencia al uso de consultas en SQL, y no a lo que luego uses en la aplicación, y el caso al que te refieres es un buen ejemplo.
Si usas ese tipo de definición de campos, con los paréntesis, y usas la consola de MySQL, obtendrás esos "0001", "0002", etc.; pero cuando uses una interfase, esos mismos datos llegarán a la aplicación como 1, 2, etc. a pesar de ponerle el ZEROFILL, porque cuando las tablas pasan a la aplicación sufren una conversión de tipos a Integer, Int32, Int, Decimal, Double, o lo que sea que se use en ese lenguaje. Esto hará que los ceros a la izquierda de la coma desaparezcan (¿Recuerdas el concepto de "cero a la izquierda"?), a menos que los datos numéricos sean convertidos en cadenas...
En cualquier caso, es absolutamente innecesario ponerle el ZEROFILL a mi juicio, porque si lo que quieres es rellenar la representación, bien puedes usar funciones como LPAD() o RPAD(), que hacen exactamente esa tarea, pero en el SELECT (y los lenguajes de programación cuentan con funciones similares).

Resumiendo: Si quieres ponerle esa condición, pónsela, pero no afectará el resultado a menos que uses cierto tipo de interfases, y serán ignorados a la hora de usarlos en las aplicaciones .Net, PHP, Java, Jscript o cualquier otra, porque esos casos usan tipos propios de dato.
El uso de ese formato, al decir de Seven of Nine: "Es irrelevante"...

¿Se comprende?
Comprendido, mil gracias gnzsoloyo

Etiquetas: campos, tablas
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 00:43.