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

¿En cual de las dos tablas deberia de poner la clave foranea?

Estas en el tema de ¿En cual de las dos tablas deberia de poner la clave foranea? en el foro de Bases de Datos General en Foros del Web. Hola, quiero crear dos tablas: "usuario" (nombre de usuario y password) y "datos_personales" (nombre y apellidos, domicilio, etc) Entre las dos tablas hay una relacion ...
  #1 (permalink)  
Antiguo 07/10/2009, 05:21
 
Fecha de Ingreso: septiembre-2008
Mensajes: 146
Antigüedad: 15 años, 8 meses
Puntos: 1
¿En cual de las dos tablas deberia de poner la clave foranea?

Hola,

quiero crear dos tablas: "usuario" (nombre de usuario y password) y "datos_personales" (nombre y apellidos, domicilio, etc)

Entre las dos tablas hay una relacion "uno-a-uno".

Mi duda: ¿en cual de las dos tablas deberia de poner la clave foranea?
  #2 (permalink)  
Antiguo 07/10/2009, 05:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ¿En cual de las dos tablas deberia de poner la clave foranea?

En DATOS_PERSONALES. Un usuario tiene datos personales, y los datos personales pertenecen a un usuario.
En ese modelo, la existencia del usuario viene primero, por tanto es tabla primaria.
__________________
¿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 07/10/2009, 06:36
 
Fecha de Ingreso: septiembre-2008
Mensajes: 146
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: ¿En cual de las dos tablas deberia de poner la clave foranea?

Gracias,

mi pregunta ha partido tras ver este schema de Doctrine:
Código:
User:
  columns:
    username: string
    password: string
    contact_id: integer

Contact:
  columns:
    first_name: string
    last_name: string
    phone: string
    email: string
    address: string
el cual genera este .sql:

Código:
CREATE TABLE user (id BIGINT AUTO_INCREMENT, username TEXT, password TEXT, contact_id BIGINT, INDEX contact_id_idx (contact_id), PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE contact (id BIGINT AUTO_INCREMENT, first_name TEXT, last_name TEXT, phone TEXT, email TEXT, address TEXT, PRIMARY KEY(id)) ENGINE = INNODB;
ALTER TABLE user ADD FOREIGN KEY (contact_id) REFERENCES contact(id);
¿Podemos concluir que es erroneo no?
  #4 (permalink)  
Antiguo 07/10/2009, 08:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ¿En cual de las dos tablas deberia de poner la clave foranea?

Si y no. No es ortodoxo, pero no es completamente erróneo.
La regla de las FK dice que entre dos tablas con una cardinalidad 1:1, se puede poner el campo FK en cualquiera de las dos, pero sólo en una.
El problema es conceptual: En este modelo:
Código sql:
Ver original
  1. CREATE TABLE USER (
  2.   id BIGINT AUTO_INCREMENT,
  3.   username TEXT,
  4.   password TEXT,
  5.   contact_id BIGINT,
  6.   INDEX contact_id_idx (contact_id),
  7.   PRIMARY KEY(id)) ENGINE = INNODB;
  8. CREATE TABLE contact (
  9.   id BIGINT AUTO_INCREMENT,
  10.   first_name TEXT,
  11.   last_name TEXT,
  12.   phone TEXT,
  13.   email TEXT,
  14.   address TEXT,
  15.   PRIMARY KEY(id)) ENGINE = INNODB;
  16.  
  17. ALTER TABLE USER
  18.     ADD FOREIGN KEY (contact_id)
  19.     REFERENCES contact(id);
El contacto existe antes que el usuario. Eso sólo tiene sentido en el contexto de un determinado modelo de sistema que requiera, por ejemplo, que un usuario haya entrado antes como contacto, para permitirle ser usuario.
Eso, desde el vamos, depende de las reglas del negocio, por lo que es algo que el Analista tiene que estipular.

Hay, de todos modos un problema en el modelo: Está usando palabras reservadas para los nombres de campos, lo que puede hacer que a la hora de las consultas se generen errores casi indetectables.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/10/2009, 16:55
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 19 años, 8 meses
Puntos: 6
Respuesta: ¿En cual de las dos tablas deberia de poner la clave foranea?

Bueno depende de como lo veas:

- Si tu negocio dice que primero creas el usuario y luego la persona, la foranea debe estar en la persona.

- En caso sea al reves, creas a la persona y luego le asocias un usuario, la foranea debe estar en el usuario.

- Te recomendaria que uses solo una tabla; ya q tu tabla usuario no va a tener muchos datos.
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #6 (permalink)  
Antiguo 07/10/2009, 17: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: 16 años, 5 meses
Puntos: 2658
Respuesta: ¿En cual de las dos tablas deberia de poner la clave foranea?

Cita:
Iniciado por Thumper Ver Mensaje
Bueno depende de como lo veas:

- Si tu negocio dice que primero creas el usuario y luego la persona, la foranea debe estar en la persona.

- En caso sea al reves, creas a la persona y luego le asocias un usuario, la foranea debe estar en el usuario.

- Te recomendaria que uses solo una tabla; ya q tu tabla usuario no va a tener muchos datos.
Es como dije... eso lo definen las reglas del negocio...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 08:48.