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

Todas las tablas tienen q tener Primary Key?

Estas en el tema de Todas las tablas tienen q tener Primary Key? en el foro de Mysql en Foros del Web. Se q se pueden modelar tablas sin llaves primarias, pero se considera q también es aceptable? o necesariamente tienen q tener llave Primaria? Lo pregunto ...
  #1 (permalink)  
Antiguo 11/12/2011, 11:15
 
Fecha de Ingreso: junio-2009
Mensajes: 84
Antigüedad: 15 años, 4 meses
Puntos: 2
Todas las tablas tienen q tener Primary Key?

Se q se pueden modelar tablas sin llaves primarias, pero se considera q también es aceptable? o necesariamente tienen q tener llave Primaria?


Lo pregunto porq tengo una tabla de Visita, esta tiene una Fecha_Pedido_Visita, pero también tengo q considerar el tiempo de espera de retraso por la visita. Esto quiere decir q puede o no tener una fecha_Cumplimiento_Visita, por lo q se me ocurrió asociarlo con otra tabla llamada "Cumplimiento" con el atributo "fecha_Cumplimiento_Visita", en la imagen lo muestro.



El problema es q si en la tabla "Cumplimiento" le agrego una Llave Primaria, esta se le asociará una Llave Foránea a Visitas y esto dejaría como si todas las visitas hubieran sido realizadas, cuando en realidad no siempre es así.

Por eso pregunto... todas las tablas necesariamente tienen q tener al menos una Llave Primaria?
  #2 (permalink)  
Antiguo 11/12/2011, 12:00
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: Todas las tablas tienen q tener Primary Key?

En primer lugar: Según el modelo E-R, toda entidad debe tener una clave primaria. Esto no es opcional, porque necesariamente necesitas algo que te permita no sólo identificar un único registro dentro de una tabla que puede tener millones, sino que también necesitas un modo de asegurarte que el registro se refiera a una instancia que no esté repetida. Y para eso es la PK.
Te repito: No es opcional. Una tabla sin PK es una "bolsa" no discriminante de cosas, pero no es una tabla relacional.

Cita:
El problema es q si en la tabla "Cumplimiento" le agrego una Llave Primaria, esta se le asociará una Llave Foránea a Visitas y esto dejaría como si todas las visitas hubieran sido realizadas, cuando en realidad no siempre es así.
No, no es así.
En tu modelo, la tabla "Visitas" es una tabla relacional, esto es, representa una relación N:N entre Cliente y Pedido. Esta tabla debería tener una PK compuesta por tres atributos: cliente_id, tecnico_id y un discriminante que nos determine qué pedido es. Conforme el paradigma relacional ese discriminante debería ser una fecha y hora, que es la fecha y hora en que se registró el pedido, y no la fecha de realización de la visita, que es un atributo de la entidad Visita. Esto es porque una visita tiene:
1) Un Cliente que la solicita.
2) Un técnico que la realiza.
3) Una fecha y hora de realización del pedido.
4) Una fecha y hora de la visita, acordados con el cliente.
5) Una fecha efectiva de realización de la visita.
En ese contexto, la tabla relacional "Visita" tiene cinco atributos como mínimo, de los cuales sólo tres son la PK. Los otros dos son atributos no clave, porque no se requieren para identificar el pedido, sino para establecer cuándo se debe hacer y cuándo se hizo.
No tienen nada que ver con la identidad del registro, y por tanto no es necesaria una tercera tabla (al menos no en tu modelo).
¿Se entiende?

Lo que sí puede existir es un subconjunto adicional de tablas que nos pueda mostrar lo que se hizo efectivamente y qué se requirió en la visita una vez realizada. Cosas como Plan de Visitas, Herramientas Usadas, Desperfectos, Trabajos realizados, etc. Cosas que se desprenden del relevamiento del sistema, pero que no has incluido en tu post.
De todos modos, para lo que preguntas, creo que esto es suficiente.

Cita:
Por eso pregunto... todas las tablas necesariamente tienen q tener al menos una Llave Primaria?
Una última aclaración: Una tabla solo puede tener una única clave primaria. Jamás puede tener dos o más. Lo que sí puede tener es lo que se denominan claves candidatas, y que se expresan en las tablas como índices de tipo UNIQUE.
En MySQL los indices UNIQUE pueden ser usados como referencia para las FK, pero no son PK en el estricto sentido.
UNIQUE es uno de los atributos de una PK, pero no a la inversa, porque un indice UNIQUE puede contener NULL y una PK jamás.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: primary, tabla, tablas, tener, todas
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 13:57.