Partage
  • Partager sur Facebook
  • Partager sur Twitter

Base de données Relationnelle

Parcs de Vacances

Sujet résolu
    17 novembre 2011 à 18:56:30

    Bonsoir,

    je suis en train de développer une application de base de données sur un parc de vacances au Luxembourg dont l’énoncé est Enoncé exercice Page 52.


    J'ai déjà réaliser le schéma Merise , et le schéma logique que je vous ferais parvenir si besoin.
    Je dois également trouver des requêtes SQL et je n'ai pas trop d'idées de requête originales.

    Seulement quel bungalow est le plus fréquenté ?


    Je fais donc appel à votre aide et votre expertise .

    Je vous remercie d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2011 à 2:07:24

      N'étant pas expert en sql je poste rarement sur le forum base de données mais ayant quand même quelque base je me permet de te donner quelques infos

      d'abord merise c'est pas un schéma mais une méthode qui permet de définir des MCD (modèle conceptuel de données), MPD (modèle physique de données) et MLD.

      Ensuite une requête originales ne veut rien dire. Le but d'une requête est de retourné des informations utiles a un traitement ou d'effectuer une action précises (insert, upadte, delete). C'est originale de récupéré tout les champs de toutes les tables avec différentes conditions mais si il ni as pas de but précis cela ne sert a rien.
      Fautes de requêtes originales voici les requetes basique
      INSERT ...
      UPDATE ...
      DELETE ...
      SELECT * ...
      SELECT liste_de_champ ...
      SELECT liste_de_champ FROM nom_table WHERE liste_de condition
      

      Ensuite tu peut ajouter des jointure, AND, OR, RAND(), COUNT(), IF, requète imbriqué,... toute dépend du résultat que tu attends

      Dernier point si tu veut que l'on t'aide pour construire une requête qui te retourne les bungalows les plus fréquenté la strucure de ta db ou aux moin des tables concernées serait utile parce que l'on n'est pas devin
      • Partager sur Facebook
      • Partager sur Twitter
      "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
        18 novembre 2011 à 8:28:12

        Merci pour ta réponse.

        Excuse moi je voulais dire le schéma résultant de la méthode Merise enfin je vais avancer sur mon projet et je reviendrais si j'ai des problèmes sur les requêtes. :D
        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2011 à 11:52:39

          Bonjour
          Tu as un tutoriel sur MySQL (mais beaucoup de chose sont valables sur toutes les bases de données)
          http://www.siteduzero.com/tutoriel-3-4 [...] ec-mysql.html
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2011 à 15:00:07

            Toujours peu d'idées sur des requêtes originales enfin je continue ma réflexion ...

            Ci-dessous le schéma Merise et celui logique , normalement validé mais si jamais j'ai un soucis n'hésitez pas ^^
            schéma Logique

            Image utilisateur
            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2011 à 12:13:24

              Pas de suggestions , commentaires , remarques ?
              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2011 à 16:18:59

                Je crois aue tu inverses les cardinalitees parfois. Elles se lisent du cote de la table d'ou tu pars dans un MCD. Par exemple, une bungalo fait partie de "1,1" categorie, le "1,1" doit etre de l'autre cote, il me semble. (Dsl pour les accent je suis en Ecosse).
                • Partager sur Facebook
                • Partager sur Twitter
                  23 novembre 2011 à 17:19:06

                  oui , merci c'est corrigé.

                  J'essaye de savoir quelle zone est la plus fréquentée ?

                  Select z.nomZone as Zone_la_plus_convoitee
                  from ZONES z,BUNGALOW b, Appartient a et apres je suis coincé

                  l'idée c'est de faire un count(max) du nombre de réservations pour chaque zone mais j'ai du mal à l'exprimer en SQL.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 novembre 2011 à 17:30:51

                    Un truc du genre :
                    SELECT z.nomZone, COUNT(z.nomZone) AS Nombre de reservation dans la zone
                    FROM zone z
                    JOIN bungalo b ON b.numZone = z.numZone
                    JOIN reservation_bungalo rb ON rb.numBungalo = b.numBungalo
                    JOIN reservation r ON r.numRes = rb.numRes

                    Test et et dis moi si ça va je suis pas sur il doit manquer qqch je pense.

                    Edit : J'ai pas accès a ton MLD j’espère que ça va coller. :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 novembre 2011 à 15:09:13

                      Voici mon fichier de création

                      Et merci pour l'aide , je continue mes requêtes et je te fais signe si ça marche ou pas .
                      DROP TABLE Client CASCADE CONSTRAINTS;
                      DROP TABLE Supplement CASCADE CONSTRAINTS;
                      DROP TABLE Zones CASCADE CONSTRAINTS;
                      DROP TABLE Categorie CASCADE CONSTRAINTS;
                      DROP TABLE Reservation CASCADE CONSTRAINTS;
                      DROP TABLE Bungalow CASCADE CONSTRAINTS;
                      DROP TABLE portesur CASCADE CONSTRAINTS;
                      DROP TABLE possede CASCADE CONSTRAINTS;
                      DROP TABLE appartient CASCADE CONSTRAINTS;
                      
                      CREATE TABLE Client(
                      	numClient NUMBER NOT NULL,
                      	nomClient VARCHAR2(20) NOT NULL,
                      	prenomClient VARCHAR2(20) NOT NULL,
                      	adresseClient VARCHAR2(80) NOT NULL,
                        cpClient VARCHAR2(20) NOT NULL,
                      	localiteClient VARCHAR2(20),
                      	paysClient VARCHAR2(20),
                      	noPasseport NUMBER,
                      	noTel NUMBER,
                        numResa NUMBER NOT NULL,
                      	dateNaissance DATE NOT NULL,
                        
                      	PRIMARY KEY(numClient)
                      );
                      
                      CREATE TABLE Supplement(
                      	codeSup NUMBER,
                      	prixSup FLOAT NOT NULL,
                      	nbrPersonneSup NUMBER ,
                        descriptionSup VARCHAR2(60),
                      	PRIMARY KEY(codeSup)
                      );
                      
                      CREATE TABLE Zones(
                      	situationZone VARCHAR2(20),
                        zoneDescription VARCHAR2(200) NOT NULL,
                      	nomZone VARCHAR2(50) NOT NULL,
                        
                      	PRIMARY KEY(nomZone)
                      );
                      
                      CREATE TABLE Categorie(
                      	superficieBungalow NUMBER,
                      	nomCat CHAR(2) NOT NULL,
                        catDescription VARCHAR2(2000),
                      	prixBungalow FLOAT NOT NULL,
                      	capaBungalow NUMBER NOT NULL,
                      	PRIMARY KEY(nomCat)
                      );
                      
                      CREATE TABLE Reservation(
                      	numResa NUMBER NOT NULL,
                      	dateDepart DATE NOT NULL,
                      	dateArrivee DATE,
                      	nbrPersonne NUMBER,
                      	numClient NUMBER NOT NULL,
                      	PRIMARY KEY(numResa),
                      	FOREIGN KEY(numClient) REFERENCES Client(numClient)
                      );
                      
                      CREATE TABLE Bungalow(
                      	numBungalow NUMBER NOT NULL,
                      	libre NUMBER,
                      	nomCat CHAR(2) NOT NULL,
                      	PRIMARY KEY(numBungalow),
                      	FOREIGN KEY(nomCat) REFERENCES Categorie(nomCat)
                      );
                      
                      
                      CREATE TABLE portesur(
                      	numResa NUMBER NOT NULL,
                      	numBungalow NUMBER NOT NULL,
                      	FOREIGN KEY(numResa) REFERENCES Reservation(numResa),
                      	FOREIGN KEY(numBungalow) REFERENCES Bungalow(numBungalow)
                      );
                      
                      CREATE TABLE possede(
                        codeSup NUMBER NOT NULL,
                      	numResa NUMBER NOT NULL,
                      	FOREIGN KEY(codeSup) REFERENCES Supplement(codeSup),
                      	FOREIGN KEY(numResa) REFERENCES Reservation(numResa)
                      );
                      
                      CREATE TABLE appartient(
                      	nomZone VARCHAR2(50) NOT NULL,
                      	numBungalow NUMBER NOT NULL,
                      	FOREIGN KEY(nomZone) REFERENCES Zones(nomZone),
                      	FOREIGN KEY(numBungalow) REFERENCES Bungalow(numBungalow)
                      );
                      
                      
                      commit
                      


                      J'ai réécrit deux requetes malheureusement , la premiere ne fonctionne pas et la deuxieme me retourne des résultats incohérents ..

                      SELECT z.nomZone, MAX( COUNT(z.nomZone)) AS Zone_la_plus_coinvoitée
                      FROM Zones z , appartient a , reservation r, Bungalow b
                      WHERE a.nomzone = z.nomzone and b.numbungalow = a.numbungalow and r.numResa = b.numResa;
                      
                      SELECT c.nomClient, c.prenomclient, MAX(to_number(r.dateArrivee-r.dateDepart)*cat.prixbungalow)as Total
                      FROM CLIENT c , RESERVATION r , SUPPLEMENT s , BUNGALOW b , CATEGORIE cat
                      WHERE c.nomClient = 'Rupin' and c.prenomclient = 'Vianney'
                      and r.numclient = c.numclient 
                      and cat.nomcat = b.nomcat
                      and r.numresa = c.numresa;
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 novembre 2011 à 0:19:41

                        Je veux bien un peu d'aide s'il vous plait ^^ merci d'avance
                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 novembre 2011 à 12:41:14

                          OUlala malheureux, jamais plusieurs tables dans un FROM sauf cas exceptionnels. Remplace moi tous ca par des JOIN. :-°
                          Après ce serais plus simple de t'aider si tu savais exactement quel type de résultat tu veux obtenir. Demande si t'as des idées ou hésite pas a bidouiller tes requête, ca peut prendre du temps des fois de trouver LA requête qu'on cherche. Et puis c'est toujours bon pour l'entrainement. ^^
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 novembre 2011 à 16:31:02

                            Je souhaite savoir quelle zone est la plus convoitée ? donc pour cela tu dis que je n'aurais pas besoin de mettre plusieurs tables dans le from même si j'ai besoin d'y accéder ?

                            La difficulté est que j'ai du mal à voir comment faire autrement qu'avec les conditions du from sinon je n'accede pas à toute mes tables ...

                            et même pour avoir le montant total c'est difficile
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 novembre 2011 à 16:55:40

                              Certes il faut pas mettre plusieurs table dans le FROM, mais plutôt utiliser des JOIN :

                              SELECT z.nomZone, MAX( COUNT(z.nomZone)) AS Zone_la_plus_coinvoitée
                              FROM Zones z
                              JOIN appartient a ON a.nomZone = z.nomZone
                              JOIN Bungalow b ON a.numBungalo = b.numBungalo
                              JOIN reservation r ON b.numResa = r.numResa.

                              Mais la encore un fois il doit manquer qqch pour avoir ce que tu cherche. Mais test déjà ca et dis moi si il retourne une erreur.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 novembre 2011 à 17:55:48

                                SELECT z.nomZone, MAX( COUNT(z.nomZone)) AS Zone_la_plus_coinvoitée
                                FROM Zones z  
                                JOIN appartient a ON a.nomZone = z.nomZone
                                JOIN Bungalow b ON a.numBungalow = b.numBungalow
                                JOIN portesur p ON p.numBungalow=b.numBungalow
                                JOIN reservation r ON p.numResa = r.numResa ;
                                


                                J'ai essayé comme cela il manquait le porte sur car chaque réservation porte sur un bungalow et le numéro est dans cette table.
                                EN tout cas , merci pour les conseils , mon prof est nul et ça fait deux semaine que je pratique seulement lol
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 novembre 2011 à 18:45:42

                                  De rien. Les bases de données faut en manger pour que ca rentre ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 novembre 2011 à 19:08:50

                                    Je continue maitenant je souhaite savoir quelle est la catégorie la plus convoitée par les vacanciers j'ai essayé ceci pourtant ca ne marche pas :s

                                    SELECT cat.catDescription 
                                    FROM CATEGORIE cat ,CLIENT c , RESERVATION r , BUNGALOW b
                                    WHERE b.nomcat IN (SELECT nomCat 
                                                              FROM BUNGALOW 
                                                              GROUP BY nomCat;
                                                              HAVING (count(nomCat) = ( SELECT max(count(nomCat))
                                                                                              FROM BUNGALOW
                                                                                              GROUP BY nomCat )
                                                                        )
                                                             )
                                    AND r.numclient = c.numclient 
                                    AND r.numresa = c.numresa
                                    AND cat.nomcat = b.nomcat ;
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 novembre 2011 à 19:44:06

                                      Raaaaaaaaa des JOIN, arrête avec ces FROM multiple c'est le mal. ;)

                                      SELECT cat.catDescription, MAX(COUNT(cat.nomCat))
                                      FROM categorie cat
                                      JOIN bungalo b ON b.nomCat = cat.nomCat
                                      JOIN portesur p ON p.numBungalo = b.numBungalo
                                      JOIN reservation r ON p.numResa = r.numResa

                                      Je suis même pas sur que t'es besoin d'une sous requete comme ça.
                                      Mais encore une fois il doit manquer quelque chose.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Base de données Relationnelle

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown