Comparto con Delphius en practicamente todo
cram, Por algo implemente esto, y realmente a la gente le encanta. Yo tambien creo que las busquedas por estos numeros son muy utiles y los usuarios saben valorarlo
En particular yo lo dejo como string tanto el DNI como el CUIT; a pesar de que sea todo numeros, la naturaleza mas correcta para este dato en particular, en estas reglas de negocio, indican que lo mejor es un string
Por ejemplo, con un string podes realizar filtros parciales (tipo LIKE) o busquedas incrementales (F3, F3, F3, vas avanzando al siguiente); y si por supuesto que es posible convertir la columna dado el momento pero eso tiene bastante mas costo
En el unico caso que realmente ayuda tener el Integer, es para las búsquedas exactas, ahi si mejora la performance, aunque tambien creo que lo que apunta genriquez es cierto, hay que ver si esa performance es realmente notable en este orden de registros
Tambien aclaro que no lo uso como clave candidata, ni primaria, ni nada, ya que para ese proposito sigo pensando que las claves artificiales son las mejores; de ninguna manera me puedo permitir identificar univocamente a un registro con un valor que ingresa el usuario
Aun asi, mantengo un indice de tipo "unique" para asegurarme que no haya duplicados; en este caso una cosa son las reglas de negocio, y da igual si es fradulento o un error del gobierno, o lo que sea; pero tambien existen los errores de tipeo y por eso siempre me parece que es una buena idea que la BD solita se encarge de asegurar que no haya repetidos
Saludos
¿eh?...
1 - digo 5
2 - digo 6
3 - claro, como dice el segundo: 5
Es precisamente lo que expuse en el principio. No usar tipos numéricos para estos campos.
Lo que dije en un principio al iniciar el tema es que uso tipo char, por ejemplo para el DNI, que en realidad le llamo Nro_Doc, Char(8).
Y aclaro, es precisamente por lo que dices, da más flexibilidad al momento de trabajar con el dato como está, ya sea búsquedas incrementales (mala palabra en algunos casos) o para evitar el uso de conversiones internas, o sea en el programa.
Ya que tocaron el tema de perder algo de tiempo en el proceso, definir como char(8) lleva un tiempo para aquellos casos en que el Nro_Doc, tenga -supongamos- cuatro dígitos, (cosa que es imposible), dado que el motor llena con blancos hasta llegar a ocho (8) de longitud, pero se usa char debido a que es muy poco probable una longitud diferente de 8, por lo que se ahorra un pequeño espacio al no definir como varchar(8).
En realidad son sutilezas, pero en cuanto a definirlo como cadena y no como número, no tanto, ya que el ahorro de trabajo es suficiente como para adoptar esta alternativa.
Suelo usar esta regla:
- el campo no será usado en operaciones matemáticas: char o varchar.
- el campo casi siempre tiene una longitud, lo defino como char.
- el campo es de longitud considerable y muy variable, uso varchar.
- cuando quiero acotar un valor numérico uso numeric, caso contrario integer o smallint, o algún otro.
Por ejemplo, en el caso moneda, suelo usar numeric(9,2) y no un tipo float o double.
Y por sobre todo a cada columna la defino con un dominio, no uso los tipos básicos, aunque tenga que crear un dominio de tipo smallint, sin restricciones, ni default, ni nada.
Saludos
Saludos.
Editado por cram, 31 marzo 2016 - 09:12 .