none
como hacer el registro de datos en una base de datos (sql) que tenga una tabla Intermedia? RRS feed

  • Pregunta

  • Hola amigos,

    Tengo este modelo E-R, con  las tablas descritas en la imagen, mi consulta basicamente seria como hacer el registro de datos en una  bd (sql)  en una tabla intermedia? por ejemplo: teniendo en cuenta que:

    "Un Empleado o varios Empleados puede ejecutar una o varias Tareas; y a su vez, una o varias Tareas pueden ser realizadas por uno o varios Empleados"

    se debe hacer estos pasos?

    1- Registrar primero una empresa en la tabla Empresa,

    2- luego registrar un empleado en la tabla Empleado,  capturando y añadiendo el id de la empresa

    3- luego se debe registrar una tarea en la tabla Tarea

    4-  y por ultimo, registrar el id del empleado junto con el id de la tarea en la tabla intermedia Emp_Tarea

    Es correcto esto?  es asi como debe de ultilizar la tabla intermedia?

    Agradeceria sus ayudas, saludos


    viernes, 24 de junio de 2016 23:26

Respuestas

  • Jose Alrey,

    Me parece perfecto, fíjate en la siguiente interface (winform)

    El usuario selecciona una tarea y luego marca o desmarca un empleado. Fíjate que la acción de marcar y desmarcar un empleado podría realizar la persistencia de la operación sobre la tabla sin necesidad de un botón [Guardar], no hay necesidad ¿verdad?. Cada vez que el usuario marca una fila se produce un INSERT, cuando desmarca una fila se produce un DELETE, claro, sobre la tabla intermedia.

    Espero que finalmente haya quedado despejado tus dudas, algo mas, puedes hacer la operación inversa, es decir, que el usuario seleccione un empleado y marque las tareas.


    • Editado Willams Morales sábado, 25 de junio de 2016 0:54
    • Marcado como respuesta Jose Alrey sábado, 25 de junio de 2016 3:04
    sábado, 25 de junio de 2016 0:52
  • Jose Alrey,

    Si elimino los ID 2 y 20 la propiedad IDENTITY no los volverá a considerar, IDENTITY toma la secuencia de forma incremental. Y no es que no se pueda, de que se puede se puede con algo de código, pero repito una vez más, ¿tiene algún sentido?

    • Marcado como respuesta Jose Alrey domingo, 26 de junio de 2016 8:07
    sábado, 25 de junio de 2016 3:53

Todas las respuestas

  • Jose Alrey,

    El registro en una tabla intermedia (N:M) no presenta nada especial respecto a persistir datos en cualquier otra tabla. De la misma manera que para registrar una instancia de Empleado necesitas una Empresa, pues para crear una instancia de EmpleadoTarea necesitas un Empleado y una Tarea, ¿vez algo de distinto? en realidad nada.

    Quizá la pega está en el diseño de UI, imagínate una interface donde registres un empleado y muestres una lista de tareas, el usuario luego de registrar un empleado puede marcar ninguna, una o varias tareas, o en el sentido contrario, si tienes una interface de de tareas entonces puedes permitir al usuario marcar uno o varios empleados que desarrollan las tareas, como vez "existe" una relación de 1:N en una dirección y si lo ves en ambas direcciones entonces notas la relación N:M, donde: un empleado puede tener asignado 0, 1 o varias tareas y una tarea puede estar asignado a 0, 1 o varios empleados.

    ¿Aún tienes dudas? Puedes comentarlas

    viernes, 24 de junio de 2016 23:36
  • Gracias por comentar Willians Morales, teniendo presente lo que comentas, que recomendarias para hacer el registro de manera correcta. `Puedo tener una interfaz en donde primero registre tanto empleados como tareas y empresas, para luego desde un boton llamado "Completar Registro" en donde se inserten los id tanto de empledos como tareas? por ejemplo

    Registro 2 Empresas en un formularioEmpresas

    Id_Empresa    Nombre

    1                     Dell

    2                     Bestbuy

    Registro 4 Empleados con su empresa    en un formularioEmpleados

    Id_Empleado   Nombre  IdEmpresa

    001                  Carlos      1

    002                   Manuel    2

    003                   Sara        2

    004                  Carmen     1

    Registro 3 Tareas en un formularioTareas

    Id_Tarea   Nombre

    0010         Respaldar bases de datos

    0011         Desarrollar Software

    0012         Realizar Auditorias Informaticas

    y luego en un formulario aparte selecciono tanto los empleados como las tareas que se desea, para que en el boton "Completar Registro"  se inserten los id respectivos,  por ejemplo si selecciono   los usuarios:

    001                  Carlos

    003                   Sara

    004                   Carmen     

      

    y les asigno la tareas:

    0011         Desarrollar Software

    0012         Realizar Auditorias Informaticas

    el boton me guardaria:

    Id_Empleado     Id_Tarea

    001                   0011

    003                   0011

    004                   0012 

    este seria el proceso correcto, manejandose con diferentes formularios?

    • Editado Jose Alrey sábado, 25 de junio de 2016 0:48
    sábado, 25 de junio de 2016 0:28
  • Jose Alrey,

    Me parece perfecto, fíjate en la siguiente interface (winform)

    El usuario selecciona una tarea y luego marca o desmarca un empleado. Fíjate que la acción de marcar y desmarcar un empleado podría realizar la persistencia de la operación sobre la tabla sin necesidad de un botón [Guardar], no hay necesidad ¿verdad?. Cada vez que el usuario marca una fila se produce un INSERT, cuando desmarca una fila se produce un DELETE, claro, sobre la tabla intermedia.

    Espero que finalmente haya quedado despejado tus dudas, algo mas, puedes hacer la operación inversa, es decir, que el usuario seleccione un empleado y marque las tareas.


    • Editado Willams Morales sábado, 25 de junio de 2016 0:54
    • Marcado como respuesta Jose Alrey sábado, 25 de junio de 2016 3:04
    sábado, 25 de junio de 2016 0:52
  • Excelente Willians esa forma esta muy comprensible de realizar, muchas gracias.

    La tabla intermedia no deber ser autonumerica verdad? esto para evitar perdida de identidad de valor?

    sábado, 25 de junio de 2016 2:11
  • Jose Alrey,

    ¿Pérdida de identidad de valor? No entiendo a lo que se refiere.

    Las tablas derivadas son las únicas donde -por su naturaleza- me permito implementar una clave primaria compuesta por las claves foráneas que llegan.

    sábado, 25 de junio de 2016 2:43
  • Si tienes razon willians,  por ejemplo me referia a que si tienes una tabla ejemplo Empleado de la sigueinte manera con sus valores autoincrementales:

    Id_Empleado    Nombre     Apellidos                Id_Puesto

    1                      Carlos        Solis Sanchez        1

    2                       Maria         Rivera Rojas          2

    3                       Luis           Castillo Ospina      2

    si llegas a eliminar el empleado con el Id 3, cuando se inserte un nuevo empleado su valor en el id no sera 3 sino 4.

    Pero como dices, en tablas intermedias no se necesitaria esto ya que simplemente reciben los id que ya han sido registrados, no lo habia notado.

    aunque como comentario de añadiciòn: este tema  con los Identity es un problema ala hora de eliminar registros.


    • Editado Jose Alrey sábado, 25 de junio de 2016 3:03
    sábado, 25 de junio de 2016 3:02
  • Jose Alrey,

    No, ¿por qué sería un problema? 

    A ver, la propiedad IDENTITY sobre una columna (este caso sobre una PK) permite generar una secuencia, un número auto-incrementable, que sirve para los propósitos de un "campo único con valores automáticos", pero no se garantiza bajo ningún escenario la secuencia  {nuevo valor = valor anterior + 1}, y no sólo por las filas eliminadas sino por transacciones truncas, etc. Considere que se trata de una columna cuyo objetivo es identificar unívocamente  a las filas de una tabla ¿por qué exigiría usted que deba tener una secuencia sin brechas? No hay necesidad, ¿verdad?.

    sábado, 25 de junio de 2016 3:11
  • Es correcto Williams no sabia esa informaciòn, eso quiere decir que si tengo ejemplo 100 empleados y elimino el empleado con el id 2  y el que tiene el id 20 , estos valores ya no formaran parte de la tabla nunca mas

    • Editado Jose Alrey sábado, 25 de junio de 2016 3:30
    sábado, 25 de junio de 2016 3:29
  • Jose Alrey,

    Si elimino los ID 2 y 20 la propiedad IDENTITY no los volverá a considerar, IDENTITY toma la secuencia de forma incremental. Y no es que no se pueda, de que se puede se puede con algo de código, pero repito una vez más, ¿tiene algún sentido?

    • Marcado como respuesta Jose Alrey domingo, 26 de junio de 2016 8:07
    sábado, 25 de junio de 2016 3:53