none
Como almacenar los movimientos realizados por una embarcación RRS feed

  • Pregunta

  • Hola Chicos!

    Estoy creando una bases de datos el cual me permita llevar un control de embarcaciones, dicha base de datos contendrá las siguientes tablas: Embarcación, Propietario, Capitán, Movimientos.

    1.- La tabla Embarcación contendrá los siguientes campos: idEmbarcación, Matricula, Nombre, Fecha_Entrada, Longitud, Bandera, tipo_de_requer y ubicación.. (Ubicación se refiere al lugar donde se encuentra estacionado la embarcación..., en este registro una embarcación puede estar en el PT: Patio de Trabajo (por motivos de trabajo de mantenimiento), M: Muelle (solo por estacionamiento en agua, este a su vez se divide en Muelle Interno, Muelle Principal, Muelle de Emergencia y Muelle de Fácil Acceso., o en PLE: (Patio larga estadía, este es para estacionamiento en tierra).

    2.- La tabla Propietario contendrá los siguientes campos: idPropietario, cédula_rif_pasaporte, nombre, apellido, teléfono, dirección, correo.

    3.- La tabla Capitán: idCapitán, cédula_pasaporte, nombre, apellido, dirección, teléfono, correo.

    4.- La Tabla Ubicación: idMovimiento, fecha_movimiento. 

    Mi duda es como almacenar los movimientos de las embarcaciones? ejemplo: La Embarcación "X" llegó al mueble interno de la empresa el día 13-12-2018, luego por motivos de mantenimiento solicitó un servicio de mantenimiento en el Patio de trabajo, luego de finalizar el trabajo x día deciden pasarlo nuevamente al muelle, ¿como puedo hacer para almacenar estos movimientos sin tener que recurrir a registrar la embarcación nuevamente.? 

    Otro ejemplo puede ser que la Embarcación "Y" ingresó directamente al Patio de Trabajo el día 12-10-2018 por motivos de mantenimiento, luego de finalizar el trabajo de mantenimiento es movilizado al muelle interno por x tiempo, luego la embarcación se retira del muelle interno por x tiempo pero mantiene su puesto en la empresa (es decir ninguna otra embarcación puede ingresar en ese puesto ya que este se encuentra reservado)y regresa nuevamente a su puesto.

    Otro ejemplo puede ser que la Embarcación "Z" ingresó directamente al PLE el día 14-09-2018, luego decide pasar al patio de trabajo por mantenimiento el día 06-12-2018 y se mantiene allí hasta el día 13-12-2018 que es cuando es movilizado al muelle x y luego el día 18-01-2018 se retira de las instalaciones.

    ¿Como puedo almacenar todos esos movimientos sin tener que registrar la embarcación cada vez que voy a actualizar los movimientos y la ubicación? ¿Y en caso de la embarcación se retire en definitiva de la instalaciones como puedo mantener una especie de historial? ¿Y en caso de que la embarcación se encuentre en la instalaciones y que actualice la ubicación por motivos del movimiento como actualizar también la ubicación en la tabla embarcación?

    ¿Se debe crear otra tabla, o  por medio de triggers?

    De antemano agradezco sus respuestas.

    Nota: una embarcación puede estar en las instalaciones por años, realizando innumerables movimientos.

    En la mayoría de los caso solo se mantienen por un tiempo especifico, (generalmente de 3 a 6 meses o hasta 1 año) luego se retiran de las instalaciones sin mantener un puesto y puede que regresen al pasar 1, 2, 3 años.

    jueves, 17 de enero de 2019 18:36

Respuestas

  • El error es que tienes en la misma tabla datos que pertenecen a dos entidades

    : idEmbarcación, Matricula, Nombre,Longitud, Bandera  tabla embarcaciones

    idembarcacion, Fecha_Entrada, , tipo_de_requer y ubicación.. tabla movimientos

    en donde idembarcación es clave ajena en la tabla embarcaciones.

    Si quieres además registrar la embarcación y aunque cambie de bandera que siga siendo la misma, yo añadiría un  campo idEmbarcacioninvariable (igual la matricula o algún dato de estos) y un fecha desde, fecha hasta, de esta forma puedes saber todo lo que se le ha hecho a una embarcación, independientemente de si ha cambiado de bandera o de matrícula.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 22 de enero de 2019 10:14
    Moderador

Todas las respuestas

  • Hola Rmasters16:

    Una idea simple de implementar y fácil de trabajar puede ser así:

    create table embarcacion( 
    idEmbarcacion int identity(1,1) primary key,
    Matricula varchar(20),
    nombre varchar(20),
    Longitud float,
    Bandera varchar(20),
    id_capitan int,
    id_propietario int)
    
    create table Capitan 
    (idCapitan int primary key,
    cedula varchar(20),
    pasaporte varchar(20),
    nombre varchar(20),
    apellido varchar(20),
    direccion varchar(20),
    telefono varchar(20),
    correo varchar(20)
    )
    /* propietario y capitan dado que tienen campos en común
    podrían heredar de persona */
    create table Propietario
    (idPropietario int,
    cedula varchar(20),
    rif_pasaporte varchar(20),
    nombre varchar(20),
    apellido varchar(20),
    direccion varchar(20),
    telefono varchar(20),
    correo varchar(20)
    )
    
    create Table movimiento
    (
    idMovimiento int identity(1,1) primary key,
    idEmbarcacion int, 
    ubicacion char(3),
    solicitadoPor varchar(20),
    Fecha_Entrada datetime,
    tipo_Requerimiento int,
    )
    create Table MovimientoDetalle
    (idMovimiento int,
    linea int,
    id_Ubicacion int,
    fecha_inicio datetime,
    fecha_Fin datetime
    (idMovimiento, linea) primary key
    )
    
    create table Ubicacion
    (idubicacion int identity(1,1) primary key,
    ubicacion varchar(3),
    descripcion varchar(20)
    )
    

    Dado que todo lo que comentas no son propiedades de embarcación, te las he separado en una tabla de movimientos, y su detalle. Por tanto cuando un barco entra por primera vez, generas un movimiento y una linea de movimiento detalle con la entrada. A posteriori, generas una linea con cualquier movimiento que tenga esa embarcación, hasta su siguiente movimiento, donde vas anotando lineas.

    Cuando la embarcación finaliza, das por finalizado el detalle de ese movimiento, y si vuelve otra vez ya sería otro movimiento diferente.

    Espero te ayude, esta opinión al vuelo sin conocer tu negocio.

    Además siempre es bueno seguir la normalización de la base de datos hasta tercera forma normal, a posteriori lo agradeces.

    Normalizar:

    https://platzi.com/blog/normalizar-una-base-de-datos-y-no-morir-en-el-intento/

    https://support.microsoft.com/es-es/help/283878/description-of-the-database-normalization-basics

    • Propuesto como respuesta Pedro Alfaro viernes, 18 de enero de 2019 16:03
    viernes, 18 de enero de 2019 5:29
  • Hola Pedro Alfaro,

    Agradecida por su respuesta, lo intentaré a ver que tal.

    viernes, 18 de enero de 2019 19:59
  • Hola Rmaster,

    Has considerado usar el tipo de datos "geography"?

    https://docs.microsoft.com/es-es/sql/t-sql/spatial-geography/spatial-types-geography?view=sql-server-2017

    Un saludo.

    lunes, 21 de enero de 2019 21:13
  • El error es que tienes en la misma tabla datos que pertenecen a dos entidades

    : idEmbarcación, Matricula, Nombre,Longitud, Bandera  tabla embarcaciones

    idembarcacion, Fecha_Entrada, , tipo_de_requer y ubicación.. tabla movimientos

    en donde idembarcación es clave ajena en la tabla embarcaciones.

    Si quieres además registrar la embarcación y aunque cambie de bandera que siga siendo la misma, yo añadiría un  campo idEmbarcacioninvariable (igual la matricula o algún dato de estos) y un fecha desde, fecha hasta, de esta forma puedes saber todo lo que se le ha hecho a una embarcación, independientemente de si ha cambiado de bandera o de matrícula.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 22 de enero de 2019 10:14
    Moderador