Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
codigo de producto como primary key

Buenas de nuevo,

Se que es una pregunta muy basica, pero estaba intentando hacer una base de datos de productos de un super y tengo la duda de si el codigo del producto (el del codigo de barras) se pueda usar o no como clave primaria.
Estuve buscando en san google y, en principio, no recomiendan ese metodo sobretodo si va a usar en otras consultas, mejor usar un autoincremental.

La pregunta es si esto es correcto, como se puede usar la clave codigo de producto (numero del codigo de barras) para que las consultas sean agiles como con la primary key, (imagino que como index pero no seria tan rapido) porque firebird no tiene alternative key.

gracias
Responder Con Cita
  #2  
Antiguo 24-05-2014
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Hola foristas, un cordial saludo.

Pues les voy a contar una experiencia reciente respecto a un sistema para cobro de catastro en Colombia (Impuesto Predial) donde el identificador de la tabla principal del sistema era el la cédula catastral de los inmuebles, todo estaba perfecto pero el gobierno cambio la estructura y contenido de esa cédula catastral. La decisión que tomé fue conservar como identificador la cédula catastral y hacer una conversión de datos, levantar llaves foráneas y actualizar todas las tablas donde se hacia referencia a la cédula catastral, y crear un campo para guardar la cédula catastral anterior.

Pero el problema se va a presentar en el futuro porque dentro de la cédula catastral hay 4 digitos que por el momento está en ceros (0000) pero que van a contener el codigo de Barrio / Vereda. Que sucede, esa concepción rompe el diseño de bases de datos pues eso 4 digitos no deberián forma parte de la llave primaria, la llave primaria depende de otras cosas para existir y puede variar en el tiempo y eso debe evitarse a toda costa.

Que me toca hacer ? Pues crear un identificador consecutivo oculto al usuario, crear una llave única (uk = unique key) para la cedula catastral porque eso si es seguro que no puede haber dos cedulas catastrales con igual valor.

Las consultas se pueden volver más complejas y más lentas y el trabajo de optimización se torna más importante.

Mi recomendación utiliza un consecutivo como identificador, utiliza el codigo del producto como llave alterna única UK (esto lo permite firbird) si y solamente si se garantiza que no habrá dos registros con igual código de producto.

Si el cliente por ejemplo quiere diferenciar por colores y tallas y los quiere manejar como productos diferentes los códigos también son distintos ?
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #3  
Antiguo 24-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
...
Puedes crear un índice para ese campo, si no lo usas como clave primaria. Por la velocidad no te preocupes, es igual, o más rápido.
Responder Con Cita
  #4  
Antiguo 25-05-2014
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.473
Poder: 21
newtron Va camino a la fama
Hola.

Un apunte sobre el tema de los códigos de barra. Aunque parezca extraño los códigos de pueden barra cambiar para un mismo artículo con lo que será fácil que te encuentres en existencias dos artículos idénticos pero con distintos códigos de barras lo que te generará un problema grave.

La solución para esto sería tener una tabla adicional de códigos en la que se guarde el código interno del artículo junto con su código de barras asociado y a la hora de buscar el artículo hacer una búsqueda del código de barras en esa tabla y luego buscar en la tabla de artículos el código interno que te devuelve esa búsqueda.

Esto es bastante útil puesto que puedes tener códigos de barras ilimitados para un mismo artículo y al mismo tiempo puedes asignarle a ciertos artículos de venta muy habitual códigos rápidos como el 1, 2, etc.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 26-05-2014
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Sólo como apostilla, según algunas lecturas (Scott W. Ambler, por ejemplo), no es buena idea usar como clave primaria cualquier dato que tenga que ver con las reglas de negocio. Pero sobre gustos...

Saludos
Responder Con Cita
  #6  
Antiguo 26-05-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Algún apunte más, aunque creo que ya te lo han comentado.

Los numéricos siempre son mejores como claves que los alfanuméricos.
Siempre puedes crearle un índice único por ese código, sin que sea clave primaria.
Asegúrate de que cumple condiciones de Pk o índice único.

No todos los códigos de barras lo cumplen. diferentes productos pueden tener el mismo cód. de barras (al menos en algunos campos) y el mismo artículo puede tener más de un código de barras.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 26-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Se debe utilizar un código que tu mismo generes basado en las necesidades del cliente. Este código es lo que se conoce como SKU (Stock Keeping Unit) y debe ser único para cada artículo y por supuesto puede tener ligados n número de códigos de barras siempre que sea exactamente el mismo artículo ya que los fabricantes a veces cambian sus códigos cuando cambian la presentación, el empaque o la fórmula de sus productos. Para el caso de los supermercados por lo regular los SKUs se dividen en departamentos y el código puede contener el número del mismo.

Por ejemplo tenemos los siguientes departamentos con sus códigos:

Abarrotes 92
Químicos del Hogar 13
Salud y Belleza 02..

Entonces los SKus de abarrates podrían empezar con 92 seguido del número de cifras que requieras según tu estimación de stock (92000 al 92999 por ejemplo).

Asi en todo momento puedes identificar a que departamento pertenece un artículo solo sabiendo su SKU, además te puede servir para poder dar de alta y vender artículos que de origen no traen código de barras, dicho código lo puedes generar tu mismo.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #8  
Antiguo 26-05-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias a todos por responder,

Si, ya lo aplique como decis

Código SQL [-]
CREATE TABLE PRODUCTOS
(
  ID_PRODUCTO Integer NOT NULL,
  CODIGOPRODUCTO Varchar(20) CHARACTER SET UNICODE_FSS,
  NOMBREPRODUCTO Varchar(50) CHARACTER SET UNICODE_FSS,
  ID_FAMILIA Integer,
  ID_SUBFAMILIA Integer,
  PRIMARY KEY (ID_PRODUCTO)
);

Código SQL [-]
ALTER TABLE PRODUCTOS ADD
  FOREIGN KEY (ID_FAMILIA) REFERENCES FAMILIAS (ID_FAMILIA);
ALTER TABLE PRODUCTOS ADD
  FOREIGN KEY (ID_SUBFAMILIA) REFERENCES SUBFAMILIA (ID_SUBFAMILIA);
CREATE UNIQUE INDEX IDX_PRODUCTOS1 ON PRODUCTOS (CODIGOPRODUCTO);

Bueno eso lo he sacado del flamerobin de lo que ya hice.

La tabla de ventas y detalleventas quedaria asi, no se si esta bien.

Código SQL [-]
CREATE TABLE ventas
(
id_venta integer not null,
fecha date,
primary key (id_venta)
);

Código SQL [-]
CREATE TABLE detalleventa
(
id_ventadetalle integer not null,
id_venta integer,
id_producto integer,
cantidad smallint,
primary key (id_ventadetalle),
foreign key (id_venta) references ventas (id_venta),
foreign key (id_producto) references PRODUCTOS (id_producto)
);

Aprovechando la pregunta .

Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Cómo "sacar" la existencia de un producto? Yare SQL 11 22-02-2013 23:28:24
Consultar el campo precio mediante el codigo de un producto GABOCABALLERO Conexión con bases de datos 6 17-10-2010 17:30:55
¿Cómo definir un "primary key" en tiempo de ejecución? SMTZ .NET 1 21-12-2005 19:43:00
primary key AMO SQL 7 14-02-2004 20:50:05
Primary Key y Unique Key DrMatasanos Conexión con bases de datos 1 21-05-2003 11:01:20


La franja horaria es GMT +2. Ahora son las 07:54:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi