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

Indices y claves foraneas en mysql

Estas en el tema de Indices y claves foraneas en mysql en el foro de Bases de Datos General en Foros del Web. Tengo una tabla de Facturas con el campo clave principal ID y demás datos como fecha, cliente, etc. Otra tabla Detalle Factura con ID factura ...
  #1 (permalink)  
Antiguo 08/04/2009, 15:45
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 19 años, 6 meses
Puntos: 0
Indices y claves foraneas en mysql

Tengo una tabla de Facturas con el campo clave principal ID y demás datos como fecha, cliente, etc.

Otra tabla Detalle Factura con ID factura y ID Articulo como clave principal y demás datos como cantidades y precios. Lo hago así para que no me repitan artículos dentro de la misma factura.

El problema es que al crear las claves foráneas en phpmyadmin, ID factura apuntando a la tabla facturas y ID artículo a la de artículos, me da una advertencia de que el campo ID factura no puede pertenecer a la vez a la clave foránea y a la principal (¿será por usar dos campos como clave principal?), y lo mismo con el ID artículo.

¿Cual de estas soluciones sería la mejor?
- Pasar de la advertencia y crear todas las claves y referencias.
- Crear un campo ID en la tabla de detalle y usarlo como clave principal. Aunque no lo usaría para nada más.
- Dejar la tabla de detalles sin clave principal
- No usar claves foráneas y que lo controle todo el programa.
- Otra mejor

Gracias
  #2 (permalink)  
Antiguo 09/04/2009, 08:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Indices y claves foraneas en mysql

Mi opinión:
Haz caso siempre de los avisos del programa.
Imagino que estarás usando tablas innoDB. Aprovecha, pues, las posibilidades que te ofrece para relacionar los campos. Y si decides hacerlo con programación, usa tablas MyISam, pero parece dar un paso atrás y requiere más programación.
Por otra parte, si no vas a relacionar esa tabla detallefactura con ninguna otra, aparentemente no parecería necesaria ninguna primary key en esa tabla. Si vas a relacionarla con alguna otra, yo crearía un id auto_increment de detallefactura, aunque por lo que dices no es tu caso. Pero tengo algunas razones para animarte a añadir ese campo id: ¿cómo corregirás un error en esa línea (registro) de detalle de factura? Me dirás que tendrás que buscar por número de factura y producto: no será más fácil buscar por número de id de detallefactura y cambiar lo que sea y devolverlo. Pues puede ocurrir que si no controlas con un índice único (o con programación) tengas en una misma factura dos líneas sobre un mismo producto. Yo añadiría el id a esa tabla para controlar mejor las actualizaciones y borrados con ese id de detallefactura.
Creo que podrías crear una primary key con los dos campos, pero necesitas haber creado previamente otro índice de cada uno de ellos y haberlos relacionado como foreign key con las primary key de las otras tablas.
Por otra parte, tal y como tienes la estructura, en verdad lo que necesitas es indexar los dos campos de la tabla detallefactura que usarás como foreign key (idfactura e idarticulo) y relacionarlos con sus respectivos primary key en las otras dos tablas. Pero, como te digo, controlas mejor todo con ese id de detallefactura.
Así mismo, si no quieres repetir en la misma factura un mismo producto, puedes crear además un índice único UNIQUE de dos columnas, concretamente con idfactura e idarticulo, en la tabla detallefactura, índice que evitará las repeticiones de un tipo de artículo en distintas líneas de una misma factura (es lo mismo que sí lo haces primary key, pero no puede funcionar como tal).
Lo que no puedes hacer es usar la misma columna (única) como primary key y foreign key en la misma tabla; eso creo.
Lo mismo te he liado más. Yo, la verdad, crearía ese id, aunque puedes usar un primary key con dos columnas, que, por lo demás, ya están indexadas.

Última edición por jurena; 09/04/2009 a las 09:15
  #3 (permalink)  
Antiguo 10/04/2009, 10:29
Avatar de jm00092  
Fecha de Ingreso: mayo-2005
Ubicación: Ronda
Mensajes: 106
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: Indices y claves foraneas en mysql

Muchas gracias por tu explicación tan detallada
Usaré un nuevo campo ID como clave principal
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 14:31.