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

Opinion para armar una clave primaria

Estas en el tema de Opinion para armar una clave primaria en el foro de Bases de Datos General en Foros del Web. Cuento mi probelma: Mostramos a nuestro profesor una base de datos y el nos pidió que armemos de cierta manera la clave primaria. ¿Cual es ...
  #1 (permalink)  
Antiguo 19/06/2010, 14:47
 
Fecha de Ingreso: junio-2009
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
Opinion para armar una clave primaria

Cuento mi probelma:

Mostramos a nuestro profesor una base de datos y el nos pidió que armemos de cierta manera la clave primaria.
¿Cual es mi problema? como teniamos las tablas funcionaban y el cambio que nos pidio no lo entiendo muy bién

Ejemplifico asi se entiende de que hablo (con abstraccion de datos)
La base de datos es para un colegio, las tablas que voy a mostrar son para el "plan de estudio" (curricula creo que pude ser en otros paises)

tblPlan (IDplan-PK-, NombrePlan-numeric-)
tblCarrera (IDcarrera-PK-, Nombre, IDplan-FK-)
tblMateria (IDmateria-PK-, NombreMateria, CursoMateria ,IDCarrera-FK-, IDPlan-FK-)

* Todos las PK son autonumericas
* No hay relaciones muchos a muchos, una materia no puede estar en dos carreras ni en dos planes, tampoco una carrera en dos planes.

El profesor quiere que la clave de la materia contenga datos del plan, carrera y curso

Ej: Id_materia: 20002317
2000(Nombreplan)2(IDcarrera)3(CursoMateria)17(el identificador de la materia)

Según el profesor con esta clave podriamos consultar varios datos solo en el idmateria, primero lo vi muy logico, pero a la hora de armar el codigo se me complica y me pregunto si vale la pena armarla asi

¿Vale la pena armar ID de esa forma?
¿Estaba bién armada anteriormente la tabla?
¿Un ID de 9 0 10 digitos no es "malo"?

Y las consultas, por ejemplo; obtener todas las materia del plan "2000"
Para mi seria facilisimo asi SELECT nombre FROM Materia WHERE id_plan=2000
Pero de con esta forma quitaria el idplan y tendria que buscar el 2000 en el idmateria y lo veo mucho mas complicado tampoco se si vale la pena.

Espero sus opiniones y que alguién me pueda dar una mano
Desde ya muchas gracias!!!

PD: alguién seguramente va a pensar por que no se lo planteo a mi profesor, es que no lo voy a ver hasta dentro de un mes más o menos.
  #2 (permalink)  
Antiguo 19/06/2010, 15:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Opinion para armar una clave primaria

Vamos a hacer una aclaración centrándonos en qué es una clave primaria: Es un campo o conjunto de campos que identifica unívocamente un registro en una tabla.
Ahora bien, ni en el paradigma relacional, ni en ninguna regla especifica que una PK deba ser numérica ni autoincremental. Sólo dice que debe ser única y no nula.
Esto significa que una PK se crea sobre la base de campos de cuyos valores depende el resto, o que considerados en conjunto se puede establecer que no existen repeticiones en ningún caso.

Dicho esto, vamos a hacer una aclaración, extendiendo el tema: Es muy habitual que por facilidad de programación, se creen PK basados en campos autoincrementales. Son sencillos, fáciles de entender y más fáciles aún de programar... Pero son conflictivos.
Cuando usas este tipo de campos no se percibe que presentan problemas graves cuando se desea realizar consolidaciones de datos provenientes de diferentes bases. En estos casos, cada base instalada es un espejo en cuanto a su estructura, pero no en cuanto a sus datos; diferentes sucursales de una empresa que trabajen con bases aisladas una de otra, pueden tener el mismo número de cliente asignado a personas diferentes. ¿Cómo harías para diferenciarlos, si la PK coincide?

¿Se entiende el problema?

Son inconvenientes que surgen de expandir las bases de datos, o simplemente por crecimiento de la actividad comercial. En esos casos (mucho más habituales de lo que esperas), ese modelo de PK no sirve.
Por eso se necesita volver atrás y replantear la forma deu sar la PK... sólo que cuando una base está en producción no puedes hacer modificaciones estructurales de ese tipo sin tener enormes problemas de migración... que la Gerencia no va a estar contenta de tener que realizar.

Yendo a tu problema, la solución consiste en que debes establecer la clave candidata para cada tabla omitiendo las PK numéricas... es decir, volver atrás y ajustarte al paradigma sin "fabricar" claves. Simplemente analizando bien cada tabla.

En tu caso, describes las tablas implicadas de esta forma:
Cita:
tblPlan (IDplan-PK-, NombrePlan-numeric-)
tblCarrera (IDcarrera-PK-, Nombre, IDplan-FK-)
tblMateria (IDmateria-PK-, NombreMateria, CursoMateria ,IDCarrera-FK-, IDPlan-FK-)
Lo que a primera instancia puede hacerse es no usar un campo numérico para identificar las tres tablas, sino usar uno que pueda identificar incluso hasta la institución. Y aunque no te parezca es sencillo: Un plan de estudios, una carrera del mismo y hasta una materia ya tienen una identidad dada por la autoridad que supervisa las instituciones educativas. Con eso sería suficiente para comenzar. Es posible incluso que esos identificadores no sean numéricos sino alfanumericos.
TE doy un ejemplo basado en tu propio modelo:
"UM2002FCIT007CM2004A" componen la clave de una materia que cursé al inicio de la carrera. Esa clave identifica incluso el horario en que la cursé y en qué grupo y con qué docente lo hice. Obviamente no es una clave que pueda repetirse.

Respondiendo a tus preguntas:
Cita:
¿Vale la pena armar ID de esa forma?
Si. La precisión, integración y consolidación de datos es mayor.

Cita:
¿Estaba bién armada anteriormente la tabla?
Técnicamente si, pero puedes tener problemas de consolidación de datos a futuro.
Cita:
¿Un ID de 9 0 10 digitos no es "malo"?
Es irrrelevante. Un campo numérico no se almacena como cifras sino como binarios, por lo que poner un número de 10 cifras o uno de 20 sólo se diferencia en 4 bytes (4 bytes contra 8).

Cita:
Y las consultas, por ejemplo; obtener todas las materia del plan "2000"
Para mi seria facilisimo asi SELECT nombre FROM Materia WHERE id_plan=2000
Pero de con esta forma quitaria el idplan y tendria que buscar el 2000 en el idmateria y lo veo mucho mas complicado tampoco se si vale la pena.
¿Y crees que a nivel de consultas ese cambio representa una diferencia de performance?
Absolutamente ninguna. Vuelve a leer lo que dices... ¿Qué diferencia puede haber en hacer
Código SQL:
Ver original
  1. SELECT nombre FROM Materia WHERE id_plan=2000;
o hacer?:
Código SQL:
Ver original
  1. SELECT nombre FROM Materia WHERE idplan=8;

La diferencia es que el 8 no significa nada fuera de contexto, pero el 2000 si, si dices que quieres saber cuáles son los nombres de materias dictados en el año 2000.

Espero que tanto escrito sirva de algo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/06/2010, 15:26
 
Fecha de Ingreso: junio-2009
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Opinion para armar una clave primaria

WOW! gnzsoloyo Muchas Gracias por tomarte el trabajo de explicarmelo! ahora cazo mas o menos por donde viene la mano en armar asi la clave.
Te pido disculpas tal vez mis planteos sean demasiadas injenuos

Yo habia entendido que al poner por ejemplo el curso en el IDmateria ya no deberia ir el campo "Curso" en la tabla
y que consultando en el campo IDmateria podria obtener de que curso eran.
A eso me referia cuando hablaba de hacer la consulta obtener las materias del plan 2000, pense que el campo "id_plan_estudio" no estaria más en la tabla materias
y para conocer el plan, deberia consultar por ejemplo los primeros 4 numeros del ID_materia
¿Totalmente errado lo mio no?

A mis tablas deberia dejarlas como estan, sin quitar ninguna clave foranea, solo armar mejor las claves primarias ¿no?

Bueno muchisimas gracias por responderme

Saludos!

Etiquetas: clave, primaria
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:35.