Tema: Novato
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/02/2011, 05:51
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 10 meses
Puntos: 574
Respuesta: Novato

PK primary key -- clave principal
FK foring key -- clave foranea

La PK tiene la funcion de identificador unico del elemento

La FK obliga a entrar un dato que ya exista en la taba referenciada.

En nuestro caso la FK referenciada a articulo nos asegura que no puedes inventariar un tipo de articulo que previamente no este fichado, en el caso de los departamentos controla que no puedas situar algo en un departamento in exitente.

Las FK ademas permiten controles de integridad, puedes decidir que pasa cuando se elimina por ejemplo la ficha de un articulo en la tabla referenciada, puede impedir la eliminacion si existen registros relacionados en el inventario, o lo contrario solo con eliminar la ficha eliminará los registros relacionados.

Si te fijas en la tercera tabla de la que te he propuesto solo va aguardar identificadores numericos y eso tiene muy poco peso mientras que si guardas las descripciones n veces ocupa mucho espacio, además "mesa redonda" es distinto de "mesa redonda" (dos espacios) o peor tambien es distinto de "mesa redonda " (espacio al final).

Departamentos
1 Matematicas
2 Lengua
3 Lengua estrangera

Articulos
1 Mesa redonda
2 Mesa cuadrada

Inventario
1 1 1 25 <--- seria la mesa redonda numero 25 localizada en Matematicas
2 1 2 32 <--- seria la mesa cuadrada numero 32 localizada en Matematicas
3 2 1 26 <--- seria la mesa redonda numero 26 localizada en Lengua
....

esto ocupa menos espacio y es mucho mas eficiente para la gestion de la bbdd que

Departamentos
1 Matematicas
2 Lengua
3 Lengua estrangera

Articulos
1 Mesa redonda
2 Mesa cuadrada

Inventario
1 Matematicas Mesa redonda 25 <--- idem
2 Matematicas Mesa cuadrada 32 <--- idem
3 Lengua Mesa redonda 26 <--- idem
....
(esta tabla es mucho mas pesada que la anterior por razones obvias...)

Los depatamentos pueden entrar los datos en una misma tabla mientras identifiquen como propio cada registro, esto te permite crear un INDICE UNICO sobre CODIGO con lo que te aseguras que no se indentifique con el mismo codigo dos elementos...

Una secilla consulta

SELECT * FROM inventario WHERE idDepartamento=X

te da el inventario del departamento X

o si la sofisticamos

SELECT * FROM inventario INNER JOIN articulos ON inventario.idArticulo=articulos.idArticulo WHERE inventrio.idDepartamento=X

te da lo mismo pero con todos los datos de cada articulo (nombre descripcion....)

En cuanto a ordenar por fechas

SELECT * FROM inventario INNER JOIN articulos ON inventario.idArticulo=articulos.idArticulo WHERE inventrio.idDepartamento=X
ORDER BY inventario.fecha
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.