{"id":15187493,"url":"https://github.com/fredericdrnl/bdd-lfl-2022","last_synced_at":"2026-03-04T05:02:37.679Z","repository":{"id":148779112,"uuid":"587866232","full_name":"Fredericdrnl/BDD-LFL-2022","owner":"Fredericdrnl","description":"automatic leaderboard of Spring LFL 2022","archived":false,"fork":false,"pushed_at":"2023-02-14T12:20:14.000Z","size":5910,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T08:31:33.032Z","etag":null,"topics":["classement","francais","french","league-of-legends","lfl","plpgsql","postgresql","sql","trigger"],"latest_commit_sha":null,"homepage":"","language":"PLpgSQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fredericdrnl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2023-01-11T19:17:07.000Z","updated_at":"2023-02-27T14:13:01.000Z","dependencies_parsed_at":"2023-07-04T13:51:01.983Z","dependency_job_id":null,"html_url":"https://github.com/Fredericdrnl/BDD-LFL-2022","commit_stats":{"total_commits":122,"total_committers":3,"mean_commits":"40.666666666666664","dds":"0.33606557377049184","last_synced_commit":"e2ca9082529086721b92a4ff88d2daf08e954a4a"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Fredericdrnl/BDD-LFL-2022","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fredericdrnl%2FBDD-LFL-2022","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fredericdrnl%2FBDD-LFL-2022/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fredericdrnl%2FBDD-LFL-2022/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fredericdrnl%2FBDD-LFL-2022/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fredericdrnl","download_url":"https://codeload.github.com/Fredericdrnl/BDD-LFL-2022/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fredericdrnl%2FBDD-LFL-2022/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30071898,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T03:25:38.285Z","status":"ssl_error","status_checked_at":"2026-03-04T03:25:05.086Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["classement","francais","french","league-of-legends","lfl","plpgsql","postgresql","sql","trigger"],"created_at":"2024-09-27T18:23:13.716Z","updated_at":"2026-03-04T05:02:37.664Z","avatar_url":"https://github.com/Fredericdrnl.png","language":"PLpgSQL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **Base de donnée LFL 🗄**\n\n\u003e Auteurs : Anthony ELUECQUE, Benjamin FOURNIER, Frédéric DOURNEL\n\n# **Sommaire 📃**\n\n- **1 Introduction**\n    - 1.1 Le thème choisi\n        - 1.1.1 Pourquoi ce sujet\n        - 1.1.2 L'origine des données\n        - 1.1.3 Notre base de données en chiffres \n        - 1.1.4 Documentation à propos de ce sujet\n    - 1.2 Travail en groupe \n- **2 La base de données**\n    - 2.1 Structure du projet\n        - 2.1.1 Le MCD\n        - 2.1.2 Le MLD\n    - 2.2 La mise en pratique\n        - 2.2.1 Création des tables\n        - 2.2.2 Ajouts \u0026 Organisation des tuples\n        - 2.2.3 La méthodologie\n    - 2.3 La création des fonctions\n        - 2.3.1 Les fonctions utilitaires pour L'utilisation de la BDD\n        - 2.3.2 La gestion automatique du classement\n- **3 Le site web associé à la BDD**\n    - 3.1 Les outils\n        - 3.1.1 Vue JS | Frontend\n        - 3.1.2 Node JS | Backend\n- **4 Conclusion**\n    - 4.1 Les limites du projet\n    - 4.2 Conclusion\n- **5 Mode d'emploi**\n    - 5.1 Comment consulter la BDD\n    - 5.2 Comment consulter le site web associé à la BDD\n    - 5.3 Les différentes routes de l’API\n\n## **1 Introduction 📌**\n\nLors de notre 3ème Semestre de BUT, nous avions eu pour mission la réalisation d’une base de données sur un championnat par équipe ou individuel avec un classement automatique.   \nPour cela, Monsieur CAPITAINE nous a demandé l’utilisation de fonctions trigger sur le langage plpgsql.  \nCette SAÉ nous a permis de valider plusieurs apprentissages critiques : \n- Concevoir , gérer , administrer et exploiter les données de l'entreprise et mettre à disposition toutes les informations pour un bon pilotage de l’entreprise\n- Développer (c’est-à-dire concevoir, coder, test et intégrer) une solution informatique pour un client\n\n### **1.1 Le thème choisi**\n\n\u003e #### 1.1.1 Pourquoi ce sujet\n\nNous avons choisi comme sujet le championnat de la ligue Française de League Of Legends (LFL).   \nÉtant des joueurs de ce jeu, ils nous semblaient intéressant de créer une base de donnée sur celui-ci , afin de mettre en application nos connaissances en SQL sur un sujet qui parlait à tout le groupe.\n\n\u003e #### 1.1.2 L'oreigine des données\n\nBien qu’il existe des bases de données déjà complètes sur ce championnat, nous n’avions pas les droits sur celle-ci, nous avons donc dû partir de 0 et réfléchir à une solution efficace pour répondre à la problématique posée.  \nA travers les différents sites faisant référence à ce championnat, nous avons récupéré des informations, statistiques, …, tout ce qui semblait être exploitable.  \nCependant, se basant sur un jeu et voulant refléter parfaitement les matchs qui se sont réellement déroulés et toutes les mécaniques du jeu, nous vérifions chaque donnée pour s’en assurer.  \nNous avons notamment utilisé notre connaissance sur le jeu pour pouvoir apporter, compléter les informations trouvées sur les différents sites internet.\n\n\u003e #### 1.1.3 Notre base de données en chiffres \n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eJoueurs\u003cbr\u003e\n            \u003ctd\u003e50\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eEquipes\u003cbr\u003e\n            \u003ctd\u003e10\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eChampions\u003cbr\u003e\n            \u003ctd\u003e163\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eMatchs\n            \u003ctd\u003e90\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003e #### 1.1.4 Documentation à propos de ce sujet \n\nPour comprendre comment se déroule le championnat de la LFL nous avons rédigé une documentation \"explicationLFL\" pour avoir plus de connaissances concernant le championnat que nous avons choisi.   \nCe document donne des informations sur le nom des équipes, des joueurs et des coachs mais aussi sur le déroulement du championnat pour élire l'équipe championne de France.  \nPar ailleurs,  nous avons aussi rédigé une documentation \"explicationLoL\" qui explique le déroulement d'un match de League Of Legends. Ce document donne des explications sur les champions et leurs spécificités, les rôles jouables, la génération d'or et d'expérience.  \nCes 2 documents sont complémentaires mais permettent de comprendre plus en détail notre sujet.\n\n### **1.2 Travail en groupe**\n\nAfin de mettre en application ce que nous venons de voir en gestion de projet et l’élément moteur d’un groupe,    c'est-à-dire la communication, nous avons organisé les travaux pour que chaque membre du groupe ait un tâche à effectuer.  \nPour que chacun puisse accéder en temps réel au script de la base de données et voir les modifications de chacun, plusieurs outils existent comme Le Live Share de Visual Studio Code, il s'agit d'une extension qui permet de travailler en même temps sur un même fichier à la manière d'un Google Doc.  \nAfin d’améliorer la communication du groupe en utilisant les outils mis à nos dispositions, Discord nous a semblé opportun pour échanger sur le projet.  \nCependant, l’usage de Github nous a semblé indispensable afin de garder un historique de nos versions.\n\n\n## **2 La base de données 📦**\n\n### **2.1 Structure du projet**\n\n\u003e #### 2.1.1 Le MCD\n\nAfin de mieux visualiser la structure de la base de donnée. Nous avons modélisé un **Modèle Conceptuel de données**.  \nA partir de nos recherches et de nos connaissances, nous avons construit ce MCD afin qu’il soit évolutif , il serait possible de revenir dessus, et d’ajouter de nouvelles tables sans modifier celles-existantes. Ce principe fait référence aux principes SOLID , ou la modification de l’existant n’est pas nécessaire à l’ajout.  \nCette conceptualisation et la construction des liens a été réalisée en groupe avant l’insertion des tuples, afin de s’assurer que sa structure soit optimale.  \nUn avis à notre professeur référent, Monsieur CAPITAINE a notamment été demandé, et nous avons apporté des modifications par rapport aux remarques\n\nNous avons utilisé le logiciel Looping prévu pour cela :  https://www.looping-mcd.fr/\n\n```\n𝙇é𝙜𝙚𝙣𝙙𝙚 :\n\n𝙟𝙖𝙪𝙣𝙚 : Tables de la base de données\n𝙗𝙡𝙚𝙪 : associations entre les tables\n𝙡𝙞𝙚𝙣 : définit le type d'association entre les tables\n```\n\n**Le MCD (Modèle conceptuel de données)**\n\n\u003cimg src=\"./img/MCD.png\"\u003e\n\n\u003e #### 2.1.2 Le MLD\n\nUne fonctionnalité du logiciel Looping nous permet à partir d’un MCD de créer automatiquement par rapport à nous ajouts un **MLD**.  \nPar cet outil, nous pouvons voir le contenu de la table avec la mise en évidence des clés primaires (en gras et souligné) et étrangères (en gras avec une couleur bleu et soulignées).\n\n**MLD**\n\u003cimg src=\"./img/MLD.png\"\u003e\n\n### **2.2 La mise en pratique**\n\n\u003e #### 2.2.1 Création des tables\n\nNotre MLD nous a permis d’ajouter facilement les tables dans notre script SQL , puisque celui-ci permet de connaître chaque attributs de table, ainsi que les clés primaires et étranges.  \nEn prévention d’un classement automatique, nous avons en parallèle de cette création commencer à réfléchir sur les fonctions et les triggers associés.  \nEn effet, nos triggers permettant des vérifications avant et après ajout de tuple sur certaines tables, il était important de coordonnées ses 2 tâches.\n\n\n\u003e #### 2.2.2 Ajout \u0026 organisation des tuples\n\nComme dit auparavant , les BDD ne nous étaient pas accessibles.  \nNous avons inséré tous les tuples de notre base de données à la main (environ plus de 1200 insertions) . Cela nous a pris beaucoup de temps, si bien que les créneaux réservés à cette SAE ont été dépassé (plus de 15 heures d’insertions de tuples au lieu des 7H30 pour toute la SAE)  \nPour cela une méthodologie (sur laquelle nous nous attarderons juste après) a dû être mise en place. \n\n\n\n\u003e #### 2.2.3 La méthodologie\n\nUne méthode très stricte qui nous a permis de ne pas se perdre dans toutes ces données mais surtout pour ne pas faire d'erreur dans l'entrée de ces informations est l’utilisation de postman.  \nCette méthodologie a été appliquée plus particulièrement sur la table Historiques_matchs , ou un seul match possède 10 tuples (5 par équipes et donc 1 par joueur) sur les statistiques exploitable de celui-ci.  \nLes autres membres du groupe ont notamment vérifié tuple après tuple pour s’assurer de la concordance entre les ajouts et l’existant.  \nCette stratégie nous a permis de rentrer les tuples sans perdre de temps, et pouvoir passer à la partie du classement automatique.\n\n\n### **2.3 La création des fonctions**\n\nNous avons pour optimiser cette base de données et la rendre automatique, créer plusieurs fonctions.   \nPour répondre à la problématique posée, la création de triggers permettant la gestion automatique du classement a été une grande partie de notre projet.  \nCette gestion automatique nécessite des fonctions intermédiaires permettant d’exploiter plus facilement la base de données (GETTER, Calcul automatique, …)  \nPour notre championnat, nous avons décidé de créer plusieurs classements puisque celui-ci se déroule sur plusieurs semaines. Nous avons donc décidé de créer un classement\npar semaine, mais aussi sur la totalité du championnat (SPLIT)  \nUn trigger nous a semblé opportun sur les statistiques de chaque équipe du championnat après chaque ajout de match.\n\n\u003e #### 2.3.1 Les fonctions utilitaires pour l'utilisation de la BDD\n\n`- getNomChampion(id_champion integer) ▶️ varchar`   \nPermet de trouver le nom d'un champion à partie de son id \n\n`- AfficherChampionsBanMatch(id_match integer) ▶️ void`  \nPermet d'afficher les 10 champions banni d'un match avec l'id du match\n\n`- AfficherChampionsChoisiMatch(id_match integer) ▶️ void`  \nPermet d'afficher les 10 champions choisi d'un match avec l'id du match\n\n`- nbFoisChampBan(nom_champion varchar) ▶️ integer`  \nPermet de trouver le nombre de fois qu'un champion a été banni à partir du nom de ce champion\n\n`- rateBanChamp(id_champion integer) ▶️ real`\nPermet d'obtenir le pourcentage que le champion a été banni sur tous les matchs déjà joués à partir de l'id de ce champion\n\n`- nbFoisChampPick(nom_champion varchar) ▶️ integer`  \nPermet de trouver le nombre de fois qu'un champion a été choisi à partir du nom de ce champion \n\n`- calcul_winrate_champion(nom_champion varchar) ▶️ decimal`  \nPermet d'obtenir le taux de match gagné par champion à partir du nom de ce champion\n\n`- calcul_winrate_equipe(id_equipe integer) ▶️ decimal`  \nPermet d'obtenir le taux de match gagné par équipe à partir de l'id de cette équipe\n\n`- calcul_kda_equipe(id_equipe integer) ▶️ decimal`  \nPermet d'obtenir le kda par équipe à partir de l'id de cette équipe\n\n`- calcul_kda_joueur(id_joueur integer) ▶️ decimal`  \nPermet d'obtenir le kda par joueur à partir de l'id de ce joueur\n \n\u003e #### 2.3.2 La gestion automatique du classement\n\n## **3 Le site web associé à la BDD 🌐**\n\nBien que cette partie n’était pas obligatoire, il nous semblait essentiel que cette base de données soit utilisée pour un site web pour plusieurs raisons.\nLa première était d’apprendre à utiliser nos connaissances dans divers domaines et de les combiner en un seul projet : une application Web reprenant notre SAE Actuel : une base de données.\nLa seconde pour le seul membre du groupe en parcours développement et Application, ELUECQUE Anthony de réaliser un projet de fond lors des entretiens de Stage.\n\nCe site web pour communiquer avec une base de données se compose en 2 parties : le backend et frontend.\n\nLe Frontend est la partie que l’utilisateur du site voit , c’est le design, les boutons, …\nLe backend est la communication entre la base de données et le site web.\n\nIl permet de lier cette base de données à une API et de pouvoir, à partir du site web, envoyer des requêtes HTTP vers l’API.\nCette interface de programmation d’application est constamment mise à jour par rapport à notre base de données sur postgresql.\n\nL’intérêt de cette application web dans ce projet était à partir de notre base de donnée de pouvoir interagir avec celle-ci en étant un simple utilisateur et non un développeur postgresql sur ubuntu.\nPour cela, il est évident qu’une application web soit plus explicite qu’un terminal noir et blanc\n\n### **3.1 Les outils**\n\n\u003e #### 3.1.1 Vue JS | Frontend\n\nDoc : https://vuejs.org/guide/introduction.html\n\n\u003e #### 3.1.2 Node JS | Backend\n\nDoc : https://nodejs.org/docs/latest-v17.x/api/  \nFramework express : https://expressjs.com/\n\n## **4 Conclusion 📌**\n\n### **4.1 Les limites du projet**\n\nIl y a eu quelques problèmes à la réalisation de ce projet comme, une restriction au niveau du temps qui était infime comparé au projet qui était à réaliser, ce projet devait être réalisé en même temps que certain autre projet, il allait donc jongler entre plusieurs projets.    \nPuis pour notre base de données nous avons rempli à la main plus de 2000 tuples ce qui nous a pris un temps considérable et ce qui nous a ralenti à la finalisation de ce projet.\n\n### **4.2 Conclusion**\n\nA la fin de ce projet, nous avons réussi à réaliser un classement automatique fonctionnel de la LFL lors du Summer Split 2022. Ce classement, où une page web est associée à notre base de données, permet d'ajouter des équipes, des joueurs, des matchs et permet aussi de les supprimer. Nous avons aussi écrit des documents explicatifs concernant le jeu League Of Legends en lui même puis, un autre sur le fonctionnement du championnat de la LFL, ces documents permettent de comprendre facilement même pour un débutant.   \nCe projet qui s'est effectué en groupe, à permis une amélioration de la communication au sein d'un groupe informatique, ce qui est une compétence indispensable pour les années suivantes.  \nPour conclure que ce projet a été réalisé, malgré les problèmes rencontrés, en utilisant une bonne communication au sein du groupe et une bonne répartition des travaux en fonction des compétences de chacun.\n\n## **5 Mode d'emploi 📜**\n\n### **5.1 Comment Consulter la BDD**\n\nVous pouvez consulter la base de données en utilisant le site web, ou bien passer par un terminal ubuntu (version 20+) avec postgres.\n\tNous recommandons de passer par notre vidéo, qui explique en détail comment la consulter.\n\n### **5.2 Comment consulter le site web associé à la BDD**\n\n*Nous vous recommandons de suivre la vidéo, nous ne détaillerons pas les étapes ici mais les grandes lignes.*\n\n- Lancer sur deux fenêtres visuals studio codes les fichiers backend et frontend du site web.\n- Dans le fichier backend, taper dans un terminal npm run dev\n- Puis sur un navigateur, taper http://localhost:3000/ + la route de votre choix\n- Dans le fichier frontend , taper dans un terminal npm run serve\n- A nouveau dans un navigateur, taper http://localhost:8080 ou http://localhost:8081 (dépend des opérateurs) \n\n### **5.3 Les différentes routes de l’API**\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eRoutes  (Ajouter après http://localhost:3000/)\u003cbr\u003e\n            \u003ctd\u003eCommandes SQL derrière cette route\u003c/td\u003e\n            \u003ctd\u003eExplication de la commande SQL\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/matchs/\u003cbr\u003e\n            \u003ctd\u003eSELECT * FROM Matchs;\u003c/td\u003e\n            \u003ctd\u003eListe de tous les matchs\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/matchs/:id_match\u003cbr\u003e\n            \u003ctd\u003eSELECT * FROM Matchs WHERE id_match = :id_match;\u003c/td\u003e\n            \u003ctd\u003eInformation d’un match\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/champions\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM Champions;\u003c/td\u003e\n            \u003ctd\u003eChampions du jeu\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/equipes\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM Equipes;\u003c/td\u003e\n            \u003ctd\u003eListe de toutes les équipes de la LFL\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/equipes/:id_equipe\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM Equipes WHERE id_equipe = :id_equipe;\u003c/td\u003e\n            \u003ctd\u003eInformations d’une seule équipe à partir de son identifiant\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/equipes/:id_equipe/kda\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM calcul_kda_equipe(:id_equipe);\u003c/td\u003e\n            \u003ctd\u003eKDA de l’équipe\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/equipes/:id_equipe/coach\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM Coachs WHERE id_coach = (SELECT id_coach FROM Equipes WHERE id_equipe = :id_equipe);\u003c/td\u003e\n            \u003ctd\u003eCoach de l’équipe\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e/equipes/:id_equipe/stats\u003c/td\u003e\n            \u003ctd\u003eSELECT * FROM Statistique_lfl WHERE id_equipe = :id_equipe;\u003c/td\u003e\n            \u003ctd\u003eStatistiques des matchs d’une équipe à partir de son identifiant\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003c/tbody\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffredericdrnl%2Fbdd-lfl-2022","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffredericdrnl%2Fbdd-lfl-2022","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffredericdrnl%2Fbdd-lfl-2022/lists"}