{"id":21251967,"url":"https://github.com/estelav9/cubexdatabase","last_synced_at":"2025-03-15T05:27:22.884Z","repository":{"id":234679502,"uuid":"789381863","full_name":"estelaV9/CubexDatabase","owner":"estelaV9","description":"Base de datos de una aplicacion sobre cubos de Rubik. Con su modelo e/r, base de datos y consultas.","archived":false,"fork":false,"pushed_at":"2024-06-09T11:04:07.000Z","size":2192,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-21T20:49:25.553Z","etag":null,"topics":["cube","database","modelo-entidade-relacionamento","modelo-relacional","oracle-database","pl-sql","project"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/estelaV9.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-20T11:44:17.000Z","updated_at":"2024-06-09T11:04:10.000Z","dependencies_parsed_at":"2024-04-20T11:46:35.604Z","dependency_job_id":"410328cb-29e4-4cd9-ad28-e59969e88432","html_url":"https://github.com/estelaV9/CubexDatabase","commit_stats":null,"previous_names":["estelav9/cubexdatabase"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estelaV9%2FCubexDatabase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estelaV9%2FCubexDatabase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estelaV9%2FCubexDatabase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estelaV9%2FCubexDatabase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/estelaV9","download_url":"https://codeload.github.com/estelaV9/CubexDatabase/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243690089,"owners_count":20331725,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cube","database","modelo-entidade-relacionamento","modelo-relacional","oracle-database","pl-sql","project"],"created_at":"2024-11-21T03:45:40.990Z","updated_at":"2025-03-15T05:27:22.866Z","avatar_url":"https://github.com/estelaV9.png","language":null,"readme":"# CubexDatabase 🔷\nBase de datos de una aplicación sobre cubos de Rubik. Con su modelo e/r, base de datos, consultas y ejercicios PL/SQL.\n\n## Proyecto de Base de Datos - Primer Trimestre 📊\n### Introducción\nEste proyecto de base de datos fue desarrollado como parte del primer trimestre del curso de DAM. \u003cbr\u003e\nEl objetivo principal de mi proyecto fue diseñar y desarrollar una base de datos relacional basada en un modelo entidad-relación (ER) sobre una aplicación de cubos de Rubik. \u003cbr\u003e\n\n### Modelo Entidad-Relación (ER)\nAquí puedes encontrar el diagrama del modelo entidad-relación del proyecto : \u003cbr\u003e\n\n![Modelo Entidad-Relación](https://github.com/estelaV9/CubexDatabase/blob/main/modeloER_CubeX.png) \u003cbr\u003e\n\n## Proyecto de Base de Datos - Segundo Trimestre 🗃️\n### Introducción\nEste proyecto de base de datos es el paso a tablas del modelo entidad-relación del primer trimestre. \u003cbr\u003e\nSe reformó el modelo entidad-relación, quedando así : \u003cbr\u003e\n\n![Modelo Entidad-Relación](https://github.com/estelaV9/CubexDatabase/blob/main/modeloER_CubeX_Reformado.png) \u003cbr\u003e\n\n### Base de Datos\nLa [base de datos](https://github.com/estelaV9/CubexDatabase/blob/master/DF_deVega_Estela.sql) consta de varias tablas que representan las entidades y relaciones definidas en el modelo ER. \u003cbr\u003e\n\n### Consultas\nHe desarrollado varias [consultas SQL](https://github.com/estelaV9/CubexDatabase/blob/master/PP_consultas_deVega_Estela.sql) para el proyecto. Como por ejemplo: \u003cbr\u003e\n\n   ```sql\n   CONSULTA 1. OBTENER EL NOMBRE Y CALCULAR MANUALMENTE EL PROMEDIO DE TIEMPOS \n   DEL USUARIO ASOCIADO AL ID_AVERAGE 3. USAR DE LA TABLA AVERAGE : EL ID\n   Y EL NUMERO DE TIEMPOS DE ESA MEDIA.\n   LA MEDIA DE LOS CUBOS SE CALCULA SUMANDO TODOS LOS TIEMPOS, RESTANDO EL MENOR Y\n   MAYOR TIEMPO Y DIVIENDOLO ENTRE EL NUMERO TOTAL DE TIEMPOS MENOS EL MAYOR Y MENOR.\n\n   SELECT \n       -- SELECCIONAR EL NOMBRE ASOCIADO AL ID_AVERAGE 3\n       (SELECT NAME_USER FROM CUBE_USERS \n       WHERE ID_USER = (SELECT DISTINCT ID_USER FROM SCRAMBLE \n                       WHERE ID_AVERAGE = 3)) AS NOMBRE,\n       -- CALCULAR EL PROMEDIO MINUTOS\n       CASE \n           -- SI HAY MAS DE UNA ANOTACION DNF, EL PROMEDIO SE ESTABLECE EN 0\n           WHEN (SELECT COUNT(ID_SCRAMBLE) FROM SCRAMBLE \n                 WHERE ID_AVERAGE =  3\n                 AND COMMENTS1 LIKE 'DNF') \u003e 1 THEN 0\n           ELSE    \n           -- SI NO, SE SUMA TODOS LOS TIEMPOS, QUITANDO EL MAYOR Y MENOR TIEMPO,\n           -- DIVIDIENDOLO ENTRE LOS TIEMPOS QUE HA HECHO MENOS 2 (EL MAYOR Y MENOR)\n           -- Y DIVIDIENDO TODO ESO PARA OBTENER SOLO LOS MINUTOS\n               TRUNC((SUM(TIEMPO) - MIN(TIEMPO) - MAX(TIEMPO)) \n                   / (A.PERIOD_AVG - 2) / 60) \n       END AS AVG_MINUTOS,\n       \n       -- CALCULAR EL PROMEDIO DE MINUTOS\n       CASE \n           WHEN (SELECT COUNT(ID_SCRAMBLE) FROM SCRAMBLE \n                 WHERE ID_AVERAGE = 3 \n                 AND COMMENTS1 LIKE 'DNF') \u003e 1 THEN 0\n           ELSE \n           -- SE OBTIENE EL RESTO DEL PROMEDIO PARA OBTENER SOLO LOS SEGUNDOS\n               MOD(TRUNC((SUM(TIEMPO) - MIN(TIEMPO) - MAX(TIEMPO)) \n                   / (A.PERIOD_AVG - 2), 3), 60)\n       END AS AVG_SEGUNDOS\n   FROM \n   -- TABLA DERIVADA PARA CALCULAR LOS TIEMPOS \n       (SELECT ID_AVERAGE,   \n           CASE\n           -- LOS TIEMPOS SE CONVIERTEN EN SEGUNDOS PARA HACER MAS FACIL SU CALCULO\n               WHEN COMMENTS1 IS NULL THEN\n                   MINUTES1 * 60 + SECONDS1\n               WHEN COMMENTS1 LIKE '+2' THEN\n                   (MINUTES1 * 60 + SECONDS1) + 2\n               WHEN COMMENTS1 LIKE 'DNF' THEN\n                   0\n           END AS TIEMPO\n       FROM SCRAMBLE S\n       WHERE S.ID_AVERAGE = 3\n   ) TIEMPO\n   INNER JOIN AVERAGE A ON TIEMPO.ID_AVERAGE = A.ID_AVERAGE\n   WHERE A.ID_AVERAGE = 3\n   GROUP BY A.PERIOD_AVG;\n   ```\n\n## Proyecto de Base de Datos - Tercer Trimestre 📋\n### Introducción\nDesarrollé [ejercicios de PL/SQL](https://github.com/estelaV9/CubexDatabase/blob/main/PLSQL_deVega_Estela.sql) basado en la [base de datos](https://github.com/estelaV9/CubexDatabase/blob/master/DF_deVega_Estela.sql) del segundo trimestre, con los siguientes requisitos : \u003cbr\u003e\nRealizar al menos 2 funciones y 3 procedimientos utilizando : \n   - IF – CASE.\n   - Bucles.\n   - Cursores implícitos y explícitos.\n\nRealiza además un trigger para automatizar que se lance al menos alguno de los bloques de código anteriores. \u003cbr\u003e\nRealiza un trigger para automatizar la actualización de el/los atributo derivados que tiene tu base de datos. \u003cbr\u003e\n\n### Ejercicios\nSe desarrolló ejercicios como por ejemplo :\n\n   ```sql\n   EJERCICIO 4. CREAR UN PROCEDIMIENTO LLAMADO \"insertTimesChamp\" QUE PERMITA INSERTAR TIEMPOS\n   DE UN USUARIO EN UN CAMPEONATO Y, POSTERIORMENTE, MOSTRAR EL GANADOR DE ESE \n   CAMPEONATO. PARA OBTENER EL GANADOR SE LLAMARA A UNA FUNCION QUE RETORNE EL NOMBRE\n   DEL QUE HAYA HECHO LA MENOR MEDIA. EL GANADOR SE MOSTRARA PASADOS LOS CINCO \n   TIEMPOS DE CADA USUARIO.\n   /* CREAR UNA FUNCION QUE DEVUELVA EL NOMBRE DEL USUARIO QUE TENGA LA MENOR\n   MEDIA DE TIEMPOS DE UN CAMPEONATO DE UNA CATEGORIA */\n   CREATE OR REPLACE FUNCTION nomUserMinTime (P_ID_CHAMP CHAMPIONSHIP.ID_CHAMP%TYPE,\n       P_ID_CATEGORY CUBE_TYPE.ID_TYPE%TYPE)\n   RETURN VARCHAR2\n   IS \n       V_NAME CUBE_USERS.NAME_USER%TYPE;\n   BEGIN\n       SELECT NAME_USER INTO V_NAME FROM CUBE_USERS\n               WHERE ID_USER = (\n                   SELECT DISTINCT ID_USER\n                   FROM SCRAMBLE\n                   WHERE ID_AVERAGE = (\n                       SELECT DISTINCT ID_AVERAGE\n                       FROM AVERAGE\n                       WHERE AVG_MINUTES * 60 + AVG_SECONDS = (\n                           SELECT MIN(AVG_MINUTES * 60 + AVG_SECONDS)\n                           FROM AVERAGE\n                           WHERE ID_AVERAGE IN ( \n                               SELECT DISTINCT ID_AVERAGE\n                               FROM SCRAMBLE\n                               WHERE ID_TYPE = P_ID_CATEGORY\n                               AND ID_CHAMP = P_ID_CHAMP\n                           )\n                       )\n                   )\n               );\n       RETURN V_NAME;\n   END nomUserMinTime;\n   /\n   \n   CREATE OR REPLACE PROCEDURE insertTimesChamp (\n       P_ID_CHAMP CHAMPIONSHIP.ID_CHAMP%TYPE,\n       P_ID_USER USER_CHAMP_COMPETE.ID_USER%TYPE, \n       P_SCRAMBLE SCRAMBLE.DESCRIPTION_SCRAMBLE%TYPE,\n       P_NAME_CATEGORY CUBE_TYPE.NAME_TYPE%TYPE,\n       P_MINUTES SCRAMBLE.MINUTES1%TYPE,\n       P_SECONDS SCRAMBLE.SECONDS1%TYPE,\n       P_ID_AVERAGE SCRAMBLE.ID_AVERAGE%TYPE,\n       P_COMMENTS SCRAMBLE.COMMENTS1%TYPE DEFAULT null\n   ) \n   IS\n       V_ID_CATEGORY CUBE_TYPE.ID_TYPE%TYPE;\n       V_WINNER CUBE_USERS.NAME_USER%TYPE;\n       V_MIN_TIME NUMBER;\n       V_MAX_ID_SCRAMBLE SCRAMBLE.ID_SCRAMBLE%TYPE;\n       V_EXISTS AVERAGE.ID_AVERAGE%TYPE;\n       V_SCRAMBLE_COUNT SCRAMBLE.ID_SCRAMBLE%TYPE;\n       V_AVG_EXISTS SCRAMBLE.ID_AVERAGE%TYPE;\n       CURSOR C_CHECK_CHAMP IS\n           SELECT ID_CHAMP FROM CHAMPIONSHIP WHERE ID_CHAMP = P_ID_CHAMP;\n       V_CH_CHAMP C_CHECK_CHAMP%ROWTYPE;\n       \n       CURSOR C_CHECK_USER_CHAMP IS\n           SELECT ID_USER FROM USER_CHAMP_COMPETE WHERE ID_CHAMP = P_ID_CHAMP \n                                                   AND ID_USER = P_ID_USER;\n       V_CH_USERCHAMP C_CHECK_USER_CHAMP%ROWTYPE;\n       \n       CURSOR C_CHECK_CATEGORY IS\n           SELECT ID_TYPE FROM CUBE_CHAMP_PERTENECE WHERE ID_CHAMP = P_ID_CHAMP AND ID_TYPE = \n               (SELECT ID_TYPE FROM CUBE_TYPE WHERE NAME_TYPE = P_NAME_CATEGORY);\n       V_CH_CATEGORY C_CHECK_CATEGORY%ROWTYPE;\n       \n       CURSOR C_CHECK_IDAVERAGE IS\n           SELECT ID_AVERAGE FROM SCRAMBLE WHERE ID_CHAMP = P_ID_CHAMP \n                               AND ID_USER = P_ID_USER AND ID_TYPE = V_ID_CATEGORY;\n       V_CH_IDAVERAGE C_CHECK_IDAVERAGE%ROWTYPE;\n   BEGIN\n   \n      -- VERIFICAR SI EL ID DE CAMPEONATO EXISTE\n       OPEN C_CHECK_CHAMP;\n       FETCH C_CHECK_CHAMP INTO V_CH_CHAMP;\n       IF C_CHECK_CHAMP%NOTFOUND THEN\n           CLOSE C_CHECK_CHAMP;\n           RAISE_APPLICATION_ERROR(-20001, 'Error: El ID de campeonato no existe.');\n       END IF;\n       CLOSE C_CHECK_CHAMP;\n       \n       -- VERIFICAR SI EL ID DE USUARIO PERTENECE AL CAMPEONATO\n       OPEN C_CHECK_USER_CHAMP;\n       FETCH C_CHECK_USER_CHAMP INTO V_CH_USERCHAMP;\n       IF C_CHECK_USER_CHAMP%NOTFOUND THEN\n           CLOSE C_CHECK_USER_CHAMP;\n           RAISE_APPLICATION_ERROR(-20002, 'Error: El usuario no pertenece al campeonato especificado.');\n       END IF;\n       CLOSE C_CHECK_USER_CHAMP;\n       \n       -- VERIFICAR SI LA CATEGORÍA PERTENECE AL CAMPEONATO\n       OPEN C_CHECK_CATEGORY;\n       FETCH C_CHECK_CATEGORY INTO V_CH_CATEGORY;\n       IF C_CHECK_CATEGORY%NOTFOUND THEN\n           CLOSE C_CHECK_CATEGORY;\n           RAISE_APPLICATION_ERROR(-20003, 'Error: La categoría no pertenece al \n               campeonato especificado.');\n       END IF;\n       CLOSE C_CHECK_CATEGORY;\n       \n       -- OBTENER ID_TYPE PARA LA CATEGORÍA\n       SELECT ID_TYPE INTO V_ID_CATEGORY FROM CUBE_TYPE WHERE NAME_TYPE LIKE P_NAME_CATEGORY;\n       \n      -- VERIFICAR SI EL USUARIO YA TIENE UN ID_AVERAGE EN ESTA CATEGORÍA\n      OPEN C_CHECK_IDAVERAGE;\n       FETCH C_CHECK_IDAVERAGE INTO V_CH_IDAVERAGE;\n       IF V_CH_IDAVERAGE.ID_AVERAGE != P_ID_AVERAGE THEN\n           CLOSE C_CHECK_IDAVERAGE;\n           RAISE_APPLICATION_ERROR(-20004, 'Error: El usuario ya tiene un ID_AVERAGE \n               distinto en esta categoría para este campeonato.');\n       END IF;\n       CLOSE C_CHECK_IDAVERAGE;\n       \n       -- VERIFICAR SI EL USUARIO YA TIENE CINCO TIEMPOS EN ESTA CATEGORÍA\n       SELECT COUNT(ID_SCRAMBLE) INTO V_SCRAMBLE_COUNT \n       FROM SCRAMBLE \n       WHERE ID_CHAMP = P_ID_CHAMP AND ID_USER = P_ID_USER AND ID_TYPE = V_ID_CATEGORY;\n       \n       IF V_SCRAMBLE_COUNT \u003e= 5 THEN\n           RAISE_APPLICATION_ERROR(-20005, 'Error: El usuario ya tiene cinco tiempos \n               en esta categoría para este campeonato.');\n       ELSE IF V_SCRAMBLE_COUNT = 4 THEN \n           -- ACTUALIZAR EL GANADOR DEL CAMPEONATO\n           UPDATE CUBE_CHAMP_PERTENECE SET WINNER =\n               nomUserMinTime(P_ID_CHAMP, V_ID_CATEGORY) \n           WHERE ID_CHAMP = P_ID_CHAMP AND ID_TYPE = V_ID_CATEGORY;\n           \n           -- SELECCIONAR EL GANADOR\n           SELECT WINNER INTO V_WINNER  FROM CUBE_CHAMP_PERTENECE \n               WHERE ID_CHAMP = P_ID_CHAMP AND ID_TYPE = V_ID_CATEGORY;\n           -- MOSTRAR EL GANADOR DEL CAMPEONATO\n           DBMS_OUTPUT.PUT_LINE('El ganador del campeonato ' || P_ID_CHAMP || ' es el usuario ' || V_WINNER);\n           END IF;\n       END IF;\n       \n       -- SI NO EXISTE EL ID DEL AVERAGE, SE CREARA UNO\n       SELECT COUNT(ID_AVERAGE) INTO V_EXISTS FROM AVERAGE WHERE ID_AVERAGE = P_ID_AVERAGE;\n       IF V_EXISTS = 0 THEN\n           INSERT INTO AVERAGE (ID_AVERAGE, PERIOD_AVG) VALUES (P_ID_AVERAGE, 0);\n       END IF;\n   \n       -- INSERTAR EL TIEMPO EN LA TABLA SCRAMBLE\n       SELECT MAX(ID_SCRAMBLE) INTO V_MAX_ID_SCRAMBLE FROM SCRAMBLE; \n       INSERT INTO SCRAMBLE (ID_SCRAMBLE, ID_USER, ID_TYPE, DESCRIPTION_SCRAMBLE, \n           MINUTES1, SECONDS1, COMMENTS1, ID_AVERAGE, ID_CHAMP, REGISTRATION_DATE)\n       VALUES (V_MAX_ID_SCRAMBLE + 1, P_ID_USER, V_ID_CATEGORY, P_SCRAMBLE, P_MINUTES,\n           P_SECONDS, P_COMMENTS, P_ID_AVERAGE, P_ID_CHAMP, SYSDATE);\n       \n       EXCEPTION\n           WHEN NO_DATA_FOUND THEN\n               DBMS_OUTPUT.PUT_LINE('Error: No se encontraron datos.');\n           WHEN OTHERS THEN\n               DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);\n   END insertTimesChamp;\n   /\n   ```\n\n## Licencia 📜\nEste proyecto está bajo la [Licencia MIT](https://github.com/estelaV9/CubexDatabase/blob/master/license.txt).\u003cbr\u003e \n\n\u003e_IES Ribera de Castilla._\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festelav9%2Fcubexdatabase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Festelav9%2Fcubexdatabase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festelav9%2Fcubexdatabase/lists"}