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

Int o varchar como llave primaria

Estas en el tema de Int o varchar como llave primaria en el foro de SQL Server en Foros del Web. Un saludo a todos. Tengo una duda, sobre que tipo de dato me conviene usar int o varchar como llave primaria de una tabla. Por ...
  #1 (permalink)  
Antiguo 20/01/2012, 14:04
Avatar de giovani_loera  
Fecha de Ingreso: mayo-2011
Ubicación: Tijuana
Mensajes: 225
Antigüedad: 13 años, 7 meses
Puntos: 21
Int o varchar como llave primaria

Un saludo a todos.

Tengo una duda, sobre que tipo de dato me conviene usar int o varchar como llave primaria de una tabla.

Por ejemplo
Tengo una tabla llamada Producto, cada producto tiene un codigo ( por ejemplo TRZ09) que es unico, ademas tiene un campo para describir el producto.

Mi pregunta es ti me conviene usar el codigo como llave primeria o agrego una columna llamada ID (tipo int) para usarla como llave.

La llave primaria la utilizare en varias tablas para relacionarlar.

Espero que me den sus opiniones y sus experiencias.
  #2 (permalink)  
Antiguo 20/01/2012, 22:35
Avatar de ramirezmario7  
Fecha de Ingreso: febrero-2008
Ubicación: Medellín
Mensajes: 336
Antigüedad: 16 años, 10 meses
Puntos: 56
Respuesta: Int o varchar como llave primaria

Hola.

Por facilidad seria mejor con el int ya que lo puedes colocar que se incremente automatico pero pueden llegar a cometer el error de meter el mismo producto con diferente pk.

Lo de usar el varchar seria como mas seguro porke tu sabes ke el codigo es unico y asi nunca se duplicarian los productos.
Yo para tablas de productos siempre uso el codigo del producto como la pk
  #3 (permalink)  
Antiguo 21/01/2012, 00:22
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 22 años
Puntos: 37
Respuesta: Int o varchar como llave primaria

Yo acostumbro usar los numericos autoincrementables (int), para evitar duplicidad, luego tambien coloco un campo "codigo" donde el cliente puede poner el identificador de su producto, por supuesto, mediante programacion, validar que no se duplique el codigo.

Para el caso de campos string es char, no varchar, ya que varchar es un campo de texto de longitud variable, util para descripciones largas o contenidos en los que no sabes cual puede ser la longitud maxima del contenido.

Si luego creas la tabla de detalle de compras, puedes colocar ya sea el codigo o mejor, el idProducto (PK de productos), uno de los 2, por si hay un cambio en el catalogo, el PK no se modifica, solo el codigo, y el detalle de productos no se alteraria por integridad referencial.
  #4 (permalink)  
Antiguo 23/01/2012, 11:09
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Int o varchar como llave primaria

No he visto, por ningun lado, restriccion alguna para manejar campos STRING como PK.
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 23/01/2012, 14:39
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 20 años
Puntos: 38
Respuesta: Int o varchar como llave primaria

Al tener una llave numerica te hace mas rapidas las consultas, sobre todo si clave de producto es grande (digamos 18-20 caracteres) y haces joins con otras tablas con mucha info.. inventarios, transacciones.. etc..

Pero bueno a veces no es practico tener el auto incrementable por lo que ya se ha mencionado en otros posts..


Sin embargo si deseas utilizarlo SQL te provee de restriccion de clave unica, para validar la consistencia de tu info..y que no halla repetidos (sin depender de la capa de programacion)...

por ejemplo:

Código:
if OBJECT_ID('tempdb..#tmpTest') is not null drop table #tmpTest

create table #tmpTest (iKey int identity(1,1) Primary key, cProduct CHAR(10) Unique  )

INSERT INTO #tmpTest VALUES('PROD01'),('PROD02'),('PROD03'),('PROD04'),('PROD05')

SELECT * FROM #tmpTest

INSERT INTO #tmpTest VALUES('PROD05')


Este ultimo truena con este mensaje..

Msg 2627, Level 14, State 1, Line 9
Violation of UNIQUE KEY constraint 'UQ__#tmpTest__368D6FC77A67F969'. Cannot insert duplicate key in object 'dbo.#tmpTest'.
The statement has been terminated.
Y como referencia..

Primary key VS Unique key in SQL Server

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #6 (permalink)  
Antiguo 24/01/2012, 13:25
Avatar de giovani_loera  
Fecha de Ingreso: mayo-2011
Ubicación: Tijuana
Mensajes: 225
Antigüedad: 13 años, 7 meses
Puntos: 21
Respuesta: Int o varchar como llave primaria

Muchas Gracias a Todos.
Me ayudaron mucho, voy a tomar tu ejemplo Andres95 , pero es vez que se incremental are un store procedure donde adentro haga el insert pero antes de consultar el ultimo id de la tabla y sumarle +1.

Código SQL:
Ver original
  1. DECLARE @newID INT
  2. SELECT @newID=ISNULL(MAX(ID),0)+1 FROM myTabla
  #7 (permalink)  
Antiguo 24/01/2012, 18:06
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Int o varchar como llave primaria

Cita:
Iniciado por giovani_loera Ver Mensaje
Muchas Gracias a Todos.
Me ayudaron mucho, voy a tomar tu ejemplo Andres95 , pero es vez que se incremental are un store procedure donde adentro haga el insert pero antes de consultar el ultimo id de la tabla y sumarle +1.
Entre las diferentes formas que hay para calcular un ID, el select max() puede que sea la peor, considera dos ejemplos:

Código:
declare @newId int
select @newId=isnull(max(id),0)+1 from myTabla
insert into myTabla (id) values (@newId)
go
Por un lado, con un lock por defecto, transacciones implícitas y un índice sobre el campo ID, tendrás buen rendimiento, pero no hay garantías de que funcione, ya que en entornos de alta concurrencia o tablas de gran tamaño, se podría generar el mismo valor de @newId para dos consultas ejecutadas al mismo tiempo.

Código:
declare @newId int
begin transaction
select @newId=isnull(max(id),0)+1 from myTabla with (tablock)
insert into myTabla (id) values (@newId)
commit transaction
go
Por otro lado, con un lock tipo tabla y transacciones explícitas evitas que se genere un valor duplicado para @newId, ya que en caso de dos consultas al mismo tiempo, una se ejecuta y la otra queda en espera, pero esto puede provocar bajo rendimiento en entornos de alta concurrencia.

Si el campo ID va a ser una PK sustituta tipo INT te recomiendo que utilices identity.

Saludos
  #8 (permalink)  
Antiguo 27/01/2012, 11:07
 
Fecha de Ingreso: enero-2012
Mensajes: 9
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Int o varchar como llave primaria

Es mas performante usar un tipo entero que una cadena alfanumerica :)

Para busquedas, bajas y modificaciones podrías usar el ID auto incemental, y otro campo en la misma tabla para usar el código de producto alfanumérico.

De este modo la consulta es mucho mas ligera si tuvieses 1000000 de registros ;)

Espero te sirva de ayuda

Saludos!
  #9 (permalink)  
Antiguo 04/05/2012, 15:04
Avatar de ingelenalopez  
Fecha de Ingreso: mayo-2012
Ubicación: Santo Domingo, Dominican Republic
Mensajes: 12
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Int o varchar como llave primaria

Eso que quieres hacer se llama clave "forzada", he trabajado con base de datos con miles de millones de registros y el rendimiento de tus consultas no va a depender de que un campo sea int o varchar.
25 millones de registros con un PK autoincremento o un PK alfanumérico tiene el mismo tiempo de respuesta y utiliza el mismo plan de ejecución.
Toma en cuenta que cuando el usuario realice una búsqueda lo hará por el código del producto o por su nombre, no por el identity y los índices se crean a partir de las cláusulas where que vayas a usar en las consultas.

Experiencia, 6+ años en administración de base de datos SLQ Server desde la 7 y hasta la 2008.
Consejo:
- Crea claves foráneas.
- Crea índice basándote en los filtros de la aplicación.
- Dale mantenimiento a los índices (Rebuild si IndexFragmentation > 40%; Reorganize IndexFragmentation está entre 10 y40%).
- Recompila vistas y stored procedures siempre que le hagas un alter (sp_recompile)
- Crea estadísticas

Estos, entre otras cosas, son los que te darán mejor rendimiento, el tipo de datos no influye tanto como para preocuparse por eso...

Cualquier duda estoy a las órdenes.

Etiquetas: int, llave, primaria, tabla, varchar, campos
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 10:58.