Ir al contenido


Foto

relacionar dos tablas


  • Por favor identifícate para responder
6 respuestas en este tema

#1 jecavi20

jecavi20

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 03 septiembre 2013 - 05:25

buenas noches tengo un problema de relaciones entre dos tablas y soy muy novato en el tema y espero que aqui me ayuden a resolverlo gracias de antemano

estoy haciendo un sistema de un censo donde las personas se registran con nombre apellido cedula y registran a sus familiares con sus nombre apellidos y su parentesco con el jefe familiar, tengo una tabla para el jefe familiar y otra para los parientes

la tabla del jefe familiar

id_jefefamiliar
cedula
nombre
apellido

y la tabla de los prientes

id_pariente
cedula
nombre
apellido
tipo_parentezco

pero no se como relacionarlos para que a la hora de la consulta se relacionen los parientes con su respectivo jefe familiar ya que los id de las dos tablas son autoincrementales y no se repiten, como podria hacer la relacion de un jefe familiar a muchos parientes

gracias de antemano por su colaboracion
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 04 septiembre 2013 - 02:31

Buenas

En una relación maestro-detalle, la tabla detalle tiene que tener el ID de la tabla maestro con el que se relaciona. Si no tiene ese ID (no tiene por qué ser forzosamente el campo clave, puede ser un campo único), es imposible hacer la relación.

Saludos
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 04 septiembre 2013 - 06:54

Para concretar lo que te dice cadetill, tus tablas deberían quedar así:

id_jefefamiliar
cedula
nombre
apellido

y la tabla de los parientes

id_pariente
id_jefefamiliar  // Este campo es la clave foránea
cedula
nombre
apellido
tipo_parentezco

Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 septiembre 2013 - 08:43

Hola,
En vista a que en realidad la información es la misma en ambas tablas lo más sensato y lógico es que se desaparezca una de ellas. En su lugar se añade una clave foránea que apunte a la clave primaria de su propia tabla. Es decir, una relación a autoreferenciada.
Ahora para identificar al jefe familiar basta simplemente con añadir un campo más que sea booleano: Si/No o 1/0 cuyo nombre sea EsJefe. Aunque no es estrictamente necesario añadir este campo, por diseño se considera a un Jefe de Familia (si me disculpan, quiero expresar que mal suena decirlo de esta forma... totalmente anticuado, atrasado y contrario a los plenos derechos. Vivimos en el siglo XXI, no en el XV) aquel cuya clave foránea sea nula.
En resumen algo como esto:



delphi
  1. +---------------+
  2. | GrupoFamiliar |---+
  3. +---------------+  |
  4.           ^     |
  5.           |     |
  6.   +---------+



GrupoFamiliar:
IDPersona
Nombre
Apellido
Cedula
PersonaID
EsJefe

Siendo PersonaID la clave foránea. Nótese en como utilizo esta nomeclatura para diferenciar a las claves primarias de las secundarias:
<ID>NombrePK
NombreFK<ID>

Es un sano consejo que les dejo. Les ahorrará algunos dolores de cabeza.

Dejo para el final una advertencia: no todos los motores de base de datos tienen soporte para tabalas autoreferenciadas; aunque hoy la mayoría de ellos si lo soportan. Debe revisarse la documentación del motor a fin de determinar la viabilidad de esta alternativa. Que dicho sea de paso es lo que sugiere las reglas normales;)

Saludos,
  • 0

#5 jecavi20

jecavi20

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 04 septiembre 2013 - 12:40

gracias a todos por sus respuestas

lo del jefe familiar lo tengo que identificar porque asi es como me piden que realice el sistema se que suena anicuado xd pero bueno solo me quedan dos preguntas

1) si lo hago como dice cadetill y Wilson como hago para para que se guarde el mismo id_jefefamiliar en las dos tablas y solo en las filas de los familiares que este registro ya que cuando le dan a registrar se guardan todos los datos del jefe familiar y de los familiares al mismo tiempo, no es uno por uno

y

2) administrador Delphius si lo hago como usted me indica se ve mejor de verdad pero como agregaría ese campo booleano para solo se ponga si o 1 en la fila del jefe familiar, ya que como lo mencione se guardan los datos de todos al mismo tiempo al darle al botón registrar

y muchas gracias por su ayuda y su tiempo
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 septiembre 2013 - 06:51

Para agregar dicho campo solamente debes ejecutar un ALTER TABLE seguido de un ADD indicando el nombre del campo y del tipo. Como forma opcional podrías definir previamente un dominio y hacer que el campo sea de este tipo.
Si usas algún administrador de base de datos MySQL visual agregarle el campo a dicha tabla es algo trivial. Y lo mismo, o similiar, se procede para efectuar la clave foránea autoreferenciada.

Respecto a tu duda de como llevar el alta lo más adecuado sería que nos ilustres en como lo estás efectuando tu en estos momentos. ¿Que componentes usas? Danos una muestra del código y en base a ello te podremos dar una orientación y alternativas.
De todas formas, sea cual fuese tu diseño y el código, todo se resume en un proceso abstracto:

1) INSERT INTO ... para insertar los datos del jefe
2) SELECT MAX(IDPERSONA) para recuperar el ID del jefe (O bien que no sea autonumérico y que tu mismo le indiques el ID con el que vas a contar. Esto te ahorra este paso intermedio).
3) INSERT INTO ... PERSONAID VALUES (....,  IDRECUPERADO, ....) por cada miembro familiar restante.

Como bien se ilustra lo que primero se debe hacer es justamente tener el registro que hará de "maestro". Luego, ya con su valor de ID se procede con el alta del resto de la familia y pasándole como valor en la clave foránea el ID correspondiente.

Esto da pie a que si o si primero hay que tener el registro maestro. Sin ello no hay integridad referencial.
Pero volviendo al comienzo... partamos desde lo que llevas hecho ¿Te parece? Danos más pistas.

Saludos,
  • 0

#7 jecavi20

jecavi20

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 06 septiembre 2013 - 01:42

ya lo hice como me indico con el select max y si me funciono, no conocia este codigo. muchisimas gracias por su ayuda, sin ella no lo habría hecho mejor :cheesy: gracias a todos
  • 0




IP.Board spam blocked by CleanTalk.