none
Cual es la mejor forma para Crear una tabla "Padre" y relacionarla con una Tabla "Hijo" RRS feed

  • Pregunta

  • Saludos comunidad SQL Server

    Tengo la necesidad de crear una Tabla "Padres" para guardar los datos personales tanto del papa  como los de la mama de x hijo  y de igual manera  relacionar esta  con la Tabla "Hijo",  hasta el momento tengo lo siguiente:

    Imagen 1


    Image 2:


    Cual seria la mejor opcion o se podria hacer de una forma diferente?, saludos.




    • Editado Jose Alrey domingo, 26 de junio de 2016 8:56
    domingo, 26 de junio de 2016 8:51

Respuestas

  • Jose Alrey,

    Depende, desde mi punto de vista ambos acercamientos dan solución a dos casos distintos, te explico:

    El primer acercamiento implementa una relación N:M (muchos a muchos) donde la tabla intermedia [Tabla_Padres_Hijos] permite el registro de hijos con la posibilidad de más de una instancia de la tabla [Tabla_Padre] y cuando menciono "más de uno" no sólo me refiero al padre y a la madre, sino se abre la posibilidad de registrar -además de los padres biológicos- a un tutor o apoderado, si ese es el caso entonces éste acercamiento es el adecuado.

    El segundo acercamiento cierra la posibilidad a que el hijo sólo referencie a un padre y/o una madre (ya sea tutor, apoderado o padres biológicos) pero como máximo 2 referencias (podría ser ninguna, una o dos). Pero date cuenta que la tabla [Tabla_Padre] y [Tabla_Madre] replica columnas con el mismo significado, basta sólo una tabla, algo como:

    CREATE TABLE dbo.Padre
    (
          idPadre int PRIMARY KEY,
          DNI nvarchar(8) NOT NULL,
          ...
    )
    GO
    CREATE TABLE dbo.Hijo
    (
          idHijo int PRIMARY KEY,
          idPadre int NULL FOREIGN KEY FK_1 REFERENCES dbo.Padre (idPadre),
          idMadre int NULL FOREIGN KEY FK_2 REFERENCES dbo.Padre (idPadre),
          DNI nvarchar(8) NOT NULL,
          ...
    )
    GO

    Nota dos cosas:

    Primero, la columnas [idPadre] y [idMadre] hacen referencia a la tabla [dbo.Padre], no necesitas de dos tablas.

    Segundo, ambas columnas permiten NULL porque el hijo podría no tener referencia con ningún padre, sólo un padre o ambos.

    • Marcado como respuesta Jose Alrey lunes, 27 de junio de 2016 3:05
    domingo, 26 de junio de 2016 18:18

Todas las respuestas

  • Hola

    Formas existen muchas ...recuerda q la mayoria de los problemas poseen 1 o mas soluciones , todo dependera de la logica del desarrollador ...yo por ejemplo no crearia tres tablas sino dos solamente..

    FIJATE ...

    TablaPadre   con todos los campos que poseen relacion uno a uno

    TablaHijp      con todos los campos que poseen relacion uno a varios 

    y ambas tablas estarian relacionadas por  el identificador de registro de la TablaPadre...pero eso es cuestion de gusto tambien de diseño para pensar en las consultas que debes escribir etc etc etc


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    domingo, 26 de junio de 2016 10:58
  • Jose Alrey,

    Depende, desde mi punto de vista ambos acercamientos dan solución a dos casos distintos, te explico:

    El primer acercamiento implementa una relación N:M (muchos a muchos) donde la tabla intermedia [Tabla_Padres_Hijos] permite el registro de hijos con la posibilidad de más de una instancia de la tabla [Tabla_Padre] y cuando menciono "más de uno" no sólo me refiero al padre y a la madre, sino se abre la posibilidad de registrar -además de los padres biológicos- a un tutor o apoderado, si ese es el caso entonces éste acercamiento es el adecuado.

    El segundo acercamiento cierra la posibilidad a que el hijo sólo referencie a un padre y/o una madre (ya sea tutor, apoderado o padres biológicos) pero como máximo 2 referencias (podría ser ninguna, una o dos). Pero date cuenta que la tabla [Tabla_Padre] y [Tabla_Madre] replica columnas con el mismo significado, basta sólo una tabla, algo como:

    CREATE TABLE dbo.Padre
    (
          idPadre int PRIMARY KEY,
          DNI nvarchar(8) NOT NULL,
          ...
    )
    GO
    CREATE TABLE dbo.Hijo
    (
          idHijo int PRIMARY KEY,
          idPadre int NULL FOREIGN KEY FK_1 REFERENCES dbo.Padre (idPadre),
          idMadre int NULL FOREIGN KEY FK_2 REFERENCES dbo.Padre (idPadre),
          DNI nvarchar(8) NOT NULL,
          ...
    )
    GO

    Nota dos cosas:

    Primero, la columnas [idPadre] y [idMadre] hacen referencia a la tabla [dbo.Padre], no necesitas de dos tablas.

    Segundo, ambas columnas permiten NULL porque el hijo podría no tener referencia con ningún padre, sólo un padre o ambos.

    • Marcado como respuesta Jose Alrey lunes, 27 de junio de 2016 3:05
    domingo, 26 de junio de 2016 18:18
  • Muchas gracias por tus recomendaciones amigo Efrain Mejias Castillo, las tomare en cuenta.
    lunes, 27 de junio de 2016 3:06
  • Hola Willians todavia tengo la duda con  el idMadre  que mencionas?

    El Id_Padre de la tabla hijo va hacer FK del id_Padre de la Tabla Padre, pero  y ese IdMadre como se relaciona?

    no serviria trabajar la relacion de familia con una tabla aparte llamada parentesco?

    TablaParentesco

    Id_Parentesco int  notnull

    Nombre varchar(50)

    ---------------------------------

    TablaPadre

    Id_Padre  int  notnull

    IdParentesco int    (FK de la tabla parentesco)

    Nombre varchar(50)

    -------

    TablaHijo

    Id_Hijo  int  notnull

    IdPadre int    (FK de la tabla padre)

    Nombre varchar(50)

    -------

    Vista Datos

    Tabla Parentesco

    Id      Nombre

    1        Madre

    2        Padre

    como lo ves o es incorrecta esta forma?



    lunes, 27 de junio de 2016 5:16
  • Jose Alrey,

    Plasma en papel como estarían los datos en la tabla según tu propuesta.

    Tabla Hijo
    ------------------------------------------------------
    Id_Hijo      Nombre       idPadre      IdParentesco
    1            Juan Salas   1            2 
    2            Juan Salas   2            1

    Fíjate que tendrías que tener dos filas del mismo hijo para registrar al padre y a la madre. Nota como sería si tuvieses dos relaciones en la tabla:

    Tabla Hijo
    ------------------------------------------------------
    Id_Hijo      Nombre       idPadre      IdMadre
    1            Juan Salas   1            2
    

    En un sólo registro defines al padre y madre de un hijo. Recuerda que [idPadre] y [idMadre] provienen de una sola tabla.

    lunes, 27 de junio de 2016 5:29
  • Perfecto Willian gracias por tu ayuda y paciencia e inclusive asi con  la forma que dices no tendriamos duplicidad de la informaciòn,  Pero como relacionaria la informacion especificamentede  del Id_Madre porque tengo claro que Id_Padre de guardara como FK en la tabla Hijo, pero no me queda claro como se guardara los datos de la madre cual seria su PK?

    Tabla dbo.Padre

    IdPadre int PK

    DNI nvarchar

    Nombre

    Apellidos

    ...

    Tabla dbo.Hijo

    IdHijo int PK

    Id_Padre int

    Id_Madre int

    DNI nvarchar

    Nombre

    Apellidos

    ...

    Podria hacer esta query para jalar los datos del padre pero los de la madre no tendria idea,ejemplo

    SELECT TablaHijo.Id, TablaPadre.Id_Padre, TablaPadre.Nombre, TablaPadre.Apellidos,  TablaPadre.DNI
    
    FROM TablaHijo INNER JOIN TablaPadre
    
    ON TablaHijo.Id_Padre = TablaPadre.Id_Padre
    
    WHERE TablaHijo.Id = '1'    --(El ejemplo que pusiste: Juan Salas)--



    • Editado Jose Alrey lunes, 27 de junio de 2016 6:42
    lunes, 27 de junio de 2016 6:30
  • Jose Alrey,

    Quizá el nombre de la tabla [Padre] te suene a sólo papá, en realidad la tabla contiene a los padres de familia: padre y madre. Quizá el nombre de la tabla sea mas descriptivo si le llamas -por ejemplo- [Persona].

    Entonces, la tabla [Persona] registra padres y madres de familia y en el mundo real un hijo tiene -aunque podemos discrepar- un padre y una madre, por tanto la tabla [Hijos] debe materializar dicha realidad con dos relaciones que llegan de la tabla [Persona]. ¿No imaginabas que una tabla puede tener 1 o más relaciones con una misma tabla? pues si las hay e incluso consigo misma (tablas recursivas), la única salvedad es que no deben llamarse igual, es decir, ambas relaciones no deberían llamarse [IdPersona] e [IdPersona], suena descriptivo si le llamamos [IdPadre] e [IdMadre], ¿verdad?

    Espero ahora esté mas claro el tema y para matar toda duda dejo un pequeño diagrama:

    Imagina la UI, un objeto de tipo ComboBox para elegir al padre y otro para elegir a la madre, quizá la consulta a la base de datos sería:

    /*Para cargar el desplegable del padre*/
    SELECT * FROM Persona WHERE Sexo = 'M'
    
    /*Para cargar el desplegable de la madre*/
    SELECT * FROM Persona WHERE Sexo = 'F'

    lunes, 27 de junio de 2016 6:49
  • Acabo de leer la pregunta acerca de la consulta para obtener el nombre de los padres del alumno cuyo Id = 1

    Según el modelo adjunto sería:

    SELECT
            h.nombre [Nombre hijo]
            p.nombre [Nombre padre],
            m.nombre [Nombre madre],
            <...>
    FROM
            Hijos h
            INNER JOIN Persona p ON (h.idPadre = p.idPersona)
            INNER JOIN Persona m ON (h.idMadre = p.idPersona)

    lunes, 27 de junio de 2016 6:54
  • Muchas gracias Willians, y si estuviera el caso de que necesitara guardar los datos no solo del padre y madre si no que tambien por decir algo el Padrastro u otro encargado del hijo, se cambiaria la relacion a N:M cierto?

    Fijate en la siguiente UI:

    Imaginate que una pareja de padres tuvieran 6 niños y uno de ellos es de diferente papa y lo cuida el padrasto, ya se complica lo que recomiendas, la opcion de muchos a muchos que te mencione en un principio no aplica?

    Resumiendo lo que necesito es:

    Guardar datos del padre

    Guardar datos de la madre

    y si el niño estuviera con otro encargado (padrastro,abuelo,tio) guardar los datos de ese encargado

    ademas:

    Si una pareja de padres tiene de  1-n  hijos, asignar esos datos de los padres a cada hijo.

    asi ala hora de consultar  por cualquier Id de unniño, se le debe de traer los mismos datos de los padres o del encargado(en caso de que se registre la informacion del encargado).

    y de igual manera si se consulta por un Id de madre, padre o encargado, se  debe de traer todos los hijos sea 1 o n que estan relacionados.


    • Editado Jose Alrey martes, 28 de junio de 2016 2:04
    martes, 28 de junio de 2016 1:51
  • Jose Alrey,

    Nada impide que definas una relación N:M donde contengas los hijos y los tutores relacionados, ¿es incorrecto? no, ¿es innecesario? quizá. Fíjate que sólo tendrás como máximo 3 relaciones (idPadre, idMadre, idEncargado), eso aplica para tenerlo en una sola tabla. Recomendaría la relación N:M cuando un hijo puede definir "n" relaciones de dependencia y eso es lo que te comente en el primer aporte que te hice.

    martes, 28 de junio de 2016 2:29
  • Considera -en caso tengas las 3 relaciones sobre la tabla [Hijos]-, la relación definida para el encargado [idEncargado] debe ser opcional NULL.
    martes, 28 de junio de 2016 2:40
  • Saludos Williams, me sale el siguiente error ala hora de asignarle la PK de persona a cada FK en la tablaHijo, no sabras a que se debe?

    miércoles, 29 de junio de 2016 1:04
  • Jose Alrey,

    No muestras todo el error que obtienes, pero vamos, utiliza algo de código t-sql para crear las relaciones:

    ALTER TABLE tHijo ADD CONSTRAINT FK_tHijo_id_Padre FOREIGN KEY (id_Padre) REFERENCES dbo.tPersona (id_Persona);
    ALTER TABLE tHijo ADD CONSTRAINT FK_tHijo_id_Madre FOREIGN KEY (id_Madre) REFERENCES dbo.tPersona (id_Persona);

    Este hilo ya se ha vuelto extenso, te recomiendo que si tienes problemas adicionales crees un nuevo hilo, además por estar cerrado tienes menos posibilidades de que otros colaboradores puedan leer y apoyarte.

    miércoles, 29 de junio de 2016 18:17