Estructura de Bases de Datos en PostgreSQL para Transporte
Toda jerarquía de base de datos se basa en los siguientes elementos:
Servidor de base de datos: Computador que tiene un motor de base de datos instalado y en ejecución.
Motor de base de datos: Software que provee un conjunto de servicios encargados de administrar una base de datos.
Base de datos: Grupo de datos que pertenecen a un mismo contexto.
Esquemas de base de datos en PostgreSQL: Grupo de objetos de base de datos que guarda relación entre sí (tablas, funciones, relaciones, secuencias).
Tablas de base de datos: Estructura que organiza los datos en filas y columnas formando una matriz.
PostgreSQL es un motor de base de datos.
La estructura de la base de datos diseñada para el reto corresponde a los siguientes
elementos:
La base de datos se llama transporte, usaremos su esquema predeterminado public.
El esquema public contiene las siguientes tablas:
Estación
Pasajero
Tren
Y las tablas de relaciones entre cada uno de los elementos anteriores son:
Trayecto
Viaje
El esquema relacional entre las tablas corresponde al siguiente diagrama:
Estación
Contiene la información de las estaciones de nuestro sistema, incluye datos de nombre con tipo de dato texto y dirección con tipo de dato texto, junto con un número de identificación único por estación.
Tren
Almacena la información de los trenes de nuestro sistema, cada tren tiene un modelo con tipo de dato texto y una capacidad con tipo de dato numérico que representa la cantidad de personas que puede llevar ese tren, también tiene un ID único por tren.
Trayecto
Relaciona los trenes con las estaciones, simula ser las rutas que cada uno de los trenes pueden desarrollar entre las estaciones
Pasajero
Es la tabla que contiene la información de las personas que viajan en nuestro sistema de transporte masivo, sus columnas son nombre tipo de dato texto con el nombre completo de la persona, direccion_residencia con tipo de dato texto que indica dónde vive la persona, fecha_nacimiento tipo de dato texto y un ID único tipo de dato numérico para identificar a cada persona.
Viaje
Relaciona Trayecto con Pasajero ilustrando la dinámica entre los viajes que realizan las personas, los cuales parten de una estación y se hacen usando un tren.
Pregunta: un trayecto no deberia tener la estacion de inicio y la estacion de fin?
Pienso lo mismo, tendría mas sentido.
Si debería tenerla tiene mas sentido a que solo contenga la estación de salida
Voy a hacer todo desde la consola de postgresql, acompañenme en esta aventura :)
jaja, esa es la actitud
Con todos los powers!
a esto se le llama normalizar verdad? al echo de dejar las entidades lo mas especifico posible aun utilizando mas tablas dejar la informacion lo mejor explicada posible
Así es, son las formas normales que toda base de datos debe tener, se aplican las formas normales 1,2,3,4. entre mas normalices tu base de datos, mejor administrado sera tu BD
No me queda del todo claro la diferencia entre esquema y base datos, es como un paso intermedio que no comprendo y que no esta en otros motores de bases de datos como mysql o mssql
Buenas:
Un esquema relacional sería la imagen que se muestra arriba en la que aparecen distintas tablas como son viaje, tren, pasajeros y sus relaciones, y funciones entre ellas. Una tabla de base de datos sería pasajeros solamente. En cuanto a la diferencia entre esquema y base de datos, es sólo una forma de llamarlo distinta, pero son realmente lo mismo con distinto nombre. Es como llamar a un perro, perro o canino, es lo mismo pero con distinto nombre.
Gracias
Hay algo que no me queda claro y es porque los trayectos solo pueden tener un tren y no al revés. Porque por ejemplo en mi ciudad el trayecto linea B tiene muchos trenes pero en diferentes estaciones en determinado momento.
Alguien me puede explicar por favor.
En este caso el profe se está basando en tomar un tren por cada tabla al igual que una sola persona al marcarlas como tangibles, quizá más adelante se modifique. Tu lógica también es válida y es lo que muchos pensamos. ¿Cómo te fue al terminar el curso?.
Yo creo que se hace por simplicidad al momento de crear la base de datos
Si a alguien le sirve hoy en dia les dejo el modelo que yo realice con su respectivo codigo de creacion.
CREATETABLE"Estaciones"("id" int PRIMARYKEY,"nombre" varchar,"direccion" varchar
);CREATETABLE"Trenes"("id" int PRIMARYKEY,"modelo" varchar,"capacidad" int
);CREATETABLE"Pasajeros"("id" int PRIMARYKEY,"nombre" varchar,"residencia" int,"fecha" datetime
);CREATETABLE"trayectos"("id" int PRIMARYKEY,"nombre_ruta" varchar,"id_estacion_inicio" int,"id_estacion_fin" int,"id_tren" int
);CREATETABLE"viajes"("id" int PRIMARYKEY,"id_pasajero" int,"id_trayecto" int,"inicio" datetime,"fin" datetime
);ALTERTABLE"trayectos"ADDFOREIGNKEY("id_estacion_inicio")REFERENCES"Estaciones"("id");ALTERTABLE"trayectos"ADDFOREIGNKEY("id_estacion_fin")REFERENCES"Estaciones"("id");ALTERTABLE"trayectos"ADDFOREIGNKEY("id_tren")REFERENCES"Trenes"("id");ALTERTABLE"viajes"ADDFOREIGNKEY("id_pasajero")REFERENCES"Pasajeros"("id");CREATETABLE"trayectos_viajes"("trayectos_id" int NOTNULL,"viajes_id_trayecto" int NOTNULL,PRIMARYKEY("trayectos_id","viajes_id_trayecto"));ALTERTABLE"trayectos_viajes"ADDFOREIGNKEY("trayectos_id")REFERENCES"trayectos"("id");ALTERTABLE"trayectos_viajes"ADDFOREIGNKEY("viajes_id_trayecto")REFERENCES"viajes"("id_trayecto");
BRUTAL!
Muy claro con esto y el video anterior. Veo que lo que siempre llega a ser más complicado es definir las cardinalidades (si es uno a muchos, muchos a muchos y así)
Bastante, y a partir de las cardinalidades puedes también definir si separar los datos para que no se repitan. Es un trabajo que se debe hacer con detenimiento.
buena la documentación de la base de datos detallada y precisa,
unos de los problemas que se comenten es no documentar lo cual es necesario para cuando se integran nuevas personas al proyecto.
cuando es una realcion de muchos a muchos es necesario siempre implementar una tabla intermedia que permita tener una comunicacion entre estas dos?
Según lo aprendido, siempre es recomendable solucionar las relaciones muchos a muchos, pero claro, dependerá de la situación y que tan normalizado quieras el diseño.
Hola Si, esto tiene impacto en la consistencia de la información que se almacena y a futuro un costo importante en el procesamiento de las consultas.....
En el curso de fundamentos de base se datos con el profesor Israel, resuelven la relación muchos a muchos con una tabla pivote, de esta manera cambian una relación de muchos a muchos, por una relación de uno a muchos de la primera entidad con la tabla pivote y otra relación de uno a muchos de la segunda entidad con la tabla pivote, ¿Cuál de las dos maneras sería más recomendable?
Me queda la duda de si la la tabla viaje con la tabla persona no debería ser muchos a muchos a muchos (N;N)
Lo anterior porque si es un tren el que hace el viaje, lleva mucha mas gente, entonces un viaje esta relacionado con mas de una persona y una persona esta relacionada con varios viajes.
En la tabla viaje le pondría una etiqueta o estado que sea, viaje finalizado o abierto.
Quede un poco confundido, aunque si se que depende de la lógica del negocio y que esto es mas ilustrativo para aprender a usar la BD, además la clase de fundamentos de base de datos me ayudo mucho. Probablemente esto tenga diferentes maneras de pensarse. 🙃🤯
Hola Wilmer, la relación muchos a muchos la tendría pasajero con trayecto, y por lo que entiendo, viaje es la tabla transitiva que rompe esa relación. La interpretación sería que en un momento determinado un pasajero sólo puede estar en un viaje con un determinado trayecto.
Pues tienes razón pero en este caso nos interesa llevar control de los viajes que hace un pasajero, no los pasajeros que lleva el tren. Todo varia de que necesitas
creación de tablas como la adición de claves foráneas en un solo bloque para facilitar su ejecución.
--Crear la tabla PasajeroCREATETABLEPasajero( id_pasajero SERIALPRIMARYKEY, nombre VARCHAR(100)NOTNULL, edad INT, correo VARCHAR(255));--Crear la tabla TrayectoCREATETABLETrayecto( id_trayecto SERIALPRIMARYKEY, origen VARCHAR(100)NOTNULL, destino VARCHAR(100)NOTNULL, distancia DECIMAL(10,2)NOTNULL);--Crear la tabla EstaciónCREATETABLEEstación( id_estacion SERIALPRIMARYKEY, nombre VARCHAR(100)NOTNULL, ubicacion VARCHAR(255));--Crear la tabla TrenCREATETABLETren( id_tren SERIALPRIMARYKEY, modelo VARCHAR(100)NOTNULL, capacidad INTNOTNULL, velocidad INTNOTNULL);--Crear la tabla ViajeCREATETABLEViaje( id_viaje SERIALPRIMARYKEY, fecha DATENOTNULL, hora_salida TIMENOTNULL, hora_llegada TIMENOTNULL, id_tren INTREFERENCESTren(id_tren), id_trayecto INTREFERENCESTrayecto(id_trayecto));--Crear la tabla Pasajero_ViajeCREATETABLEPasajero_Viaje( id_pasajero INTREFERENCESPasajero(id_pasajero), id_viaje INTREFERENCESViaje(id_viaje), asiento_numero INT, estado_pago VARCHAR(50),PRIMARYKEY(id_pasajero, id_viaje));--Crear la tabla Trayecto_EstaciónCREATETABLETrayecto_Estación( id_trayecto INTREFERENCESTrayecto(id_trayecto), id_estacion INTREFERENCESEstación(id_estacion), orden_en_trayecto INT,PRIMARYKEY(id_trayecto, id_estacion));--Agregar claves foráneas a la tabla Pasajero_ViajeALTERTABLEPasajero_ViajeADDCONSTRAINT fk_pasajero
FOREIGNKEY(id_pasajero)REFERENCESPasajero(id_pasajero);ALTERTABLEPasajero_ViajeADDCONSTRAINT fk_viaje_pasajero
FOREIGNKEY(id_viaje)REFERENCESViaje(id_viaje);--Agregar claves foráneas a la tabla Trayecto_EstaciónALTERTABLETrayecto_EstaciónADDCONSTRAINT fk_trayecto
FOREIGNKEY(id_trayecto)REFERENCESTrayecto(id_trayecto);ALTERTABLETrayecto_EstaciónADDCONSTRAINT fk_estacion
FOREIGNKEY(id_estacion)REFERENCESEstación(id_estacion);--Agregar claves foráneas a la tabla ViajeALTERTABLEViajeADDCONSTRAINT fk_tren
FOREIGNKEY(id_tren)REFERENCESTren(id_tren);```ALTERTABLEViajeADDCONSTRAINT fk_trayecto_viaje
FOREIGNKEY(id_trayecto)REFERENCESTrayecto(id_trayecto);--Agregar claves foráneas a la tabla Pasajero_ViajeALTERTABLEPasajero_ViajeADDCONSTRAINT fk_pasajero_viaje
FOREIGNKEY(id_pasajero, id_viaje)REFERENCESViaje(id_pasajero, id_viaje);
Por finn entiendo esto de los schemas usados en base de datos
Lo hicieron bastante sencillo, que bueno.
+1
Entendido.
como se añaden las llaves foraneas desde la interfaz grafica ?
Alguien sabe en que software o web hicieron el diagrama ERD?
Pueden utilizar el siguiente programa web https://www.drawio.com a mi parecer es muy eficiente y es practico de utilizar.
El esquema de base de datos es la base de datos persé con tablas y relaciones, en cambio base de datos son los datos agrupados sin tomar en cuenta las relaciones de las tablas. Estoy entendiendo bien o mal?
donde puedo encontrar mas ejercicios de estos con respuestas para ir validando lo que voy haciendo?