IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Plusieurs résultats de requête dans un seul champ


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 68
    Points : 58
    Points
    58
    Par défaut Plusieurs résultats de requête dans un seul champ
    Bonjour, j'espère que vous allez bien..
    Donc, je souhaite créer une requête sous sql server, cette dernière va me permettre de récupérer toutes ms chambres réservées(il s'agit d'une gestion de réservation alors :p) via une requête et les afficher dans un seul champ. J'explique:
    1 - J'ai une table chambres(chambre_id, chambre_nom)
    2 - une table resrvations(reservation_id, reservation_debut, reservation_fin)
    vu qu'une réservation peut concerner plusieurs chambres alors j'ai crée:
    3 - une troisième table intermédiaire concerne(reservation_id, chambre_id).
    Pour conclure, je veux créer la requête qui me permettra d'afficher le résultat suivant:
    "______________________________________________________
    | reservation_id | reservation_debut | Reservation_fin | Chambres |
    ---------------------------------------------------------------
    | #1 | 12-04-2013 | 16-04-2013 | 45V 36V |
    ---------------------------------------------------------------- "

    Comme vous le voyez dans le champ "Chambres", il y'a 45V et 36V, qui sont les noms de deux chambres réservées dans la réservation "#1"..J'espère que ma question est claire, et en attente de tout type de proposition, je vous remercie infiniment d'avance ..

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pouvez vous poster les DDL de vos tables? (les create tables)?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Ce que tu veux faire va à l’encontre du modèle relationnel ! Le résultat recherché ne respecte même pas la première forme normale !
    Normalement les noms des chambres doivent être présentés en lignes (une chambre par ligne ) et non pas regroupés dans la même colonne !
    Mais il est vrai, par ailleurs, qu’il s’agit, d’après mon expérience, d’une demande récurrente que de vouloir présenter des ensembles dans une colonne en l’occurrence la colonne "chambres" dans ton exemple.
    Une solution, parmi d’autres, serait la suivante :
    1 – Créer une fonction scalaire qui retourne la liste des chambres pour une réservation donnée
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE FUNCTION dbo.Fc_ListeChambres(
    @pi_Reservation_Id INT 
    )
    RETURNS varchar(8000)
    AS
    BEGIN 
     DECLARE @Resultat VARCHAR(8000); 
     SET @resultat = ''; 
     SELECT @Resultat = @Resultat + ' ' + ISNULL(C.chambre_nom,'') 
     FROM Concerne L 
     INNER JOIN chambres C 
       ON C.Chambre_Id = L.Chambre_Id
      WHERE L.Reservation_Id = @pi_Reservation_Id;   -- paramètre de la fonction : Reservation_Id    
     SET @resultat = SUBSTRING(@Resultat, 1, LEN(@Resultat)); -- pour supprimer le dernier espace séparateur 
     RETURN @Resultat; 
    END
    2 - Utiliser la fonction dans instruction SELECT comme le montre l'exemple ci-dessous :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT reservation_id, reservation_debut, Reservation_fin, dbo.Fc_ListeChambres(reservation_id) As Chambres 
    FROM reservations
    Exemple de résultat :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reservation_id	reservation_debut	Reservation_fin	Chambres
    1	      2013-05-01 	2013-05-08    45V 36V
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Citation Envoyé par hmira
    Ce que tu veux faire va à l’encontre du modèle relationnel ! Le résultat recherché ne respecte même pas la première forme normale !
    Normalement les noms des chambres doivent être présentés en lignes (une chambre par ligne ) et non pas regroupés dans la même colonne !
    Mais il est vrai, par ailleurs, qu’il s’agit, d’après mon expérience, d’une demande récurrente que de vouloir présenter des ensembles dans une colonne en l’occurrence la colonne "chambres" dans ton exemple.
    Ce que vous dites est vrai, mais il ne faut pas confondre la présentation, qui n'a pas de formes normales, et le modèle, ici correct.
    Effectivement on aurait pu faire cela côté applicatif puisqu'il s'agit de cosmétique; cela étant il existe des outils de reporting qui ne permettent pas de réaliser ce type d'implémentation.

    D'autre part les fonctions scalaires sont contre-performantes, surtout sur des volumes de données importants, comme je l'ai montré ici, parce qu'elles ne sont pas appelées de façon ensembliste.

    Enfin l'expression de cette requête, dès SQL Server 2005, ne requiert pas de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT		R.reservation_id
    		, R.reservation_debut
    		, R.reservation_fin
    		, LEFT(S.liste_chambre_nom, LEN(S.liste_chambre_nom) - 1) AS liste_chambre_nom
    FROM		dbo.concerne AS AS CN
    INNER JOIN	dbo.resrvations AS R
    			ON CN.reservation_id = R.reservation_id
    CROSS APPLY	(
    			SELECT	CH.chambre_nom + ', '
    			FROM	dbo.chambres AS CH
    			WHERE	CH.chambre_id = CN.chambre_id
    			FOR	XML PATH('')
    		) AS S (liste_chambre_nom)
    Ceci sera bien plus rapide, si tant est que le code est correct parce que je n'ai pas de jeu de données

    @++

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    ne respecte même pas la première forme normale
    Et même cette affirmation pourrait être âprement contestée...

    Si fsmRel passe par là... :-)
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    C’est vrai que la solution proposée par Elsuket est plus élégante puisqu’elle permet d’éviter l’utilisation de la fonction scalaire externe. Merci Elsuket !

    Ceci dit, et pour revenir au problème initial, personnellement, je suis très réticent pour ne pas dire contre ce genre de pratique qui consiste à concaténer les valeurs d’une colonne pour répondre à un souci de présentation. Pour moi, il n’est pas du rôle du SGBD d’effectuer ce travail ! cette tâche doit être dévolue à l’application (exemple Reporting Services Report Builder, Crystal Report etc..), la base de données se limitant à exposer de véritables relations.

    Ce qui me gêne c’est d’une part, le fait que le résultat (ie concaténation des champs) doit être calculé lors de chaque utilisation, d’autre part, la relation obtenue (ou l’ensemble résultat obtenu) n’est pas en première forme normale puisque la valeur obtenue par concaténation, est sur le plan sémantique, n’est pas une valeur atomique. Je maintiens donc mes propos à propos de la première forme normale.

    Je rappelle que l’algèbre relationnelle inventée par E Codd est une collection d’opérations formelles qui agissent sur les relations et produisent des relations en résultat. Et parmi ces opérations formelles il y a évidemment les opérations ensemblistes.

    Pour moi, nombre d’opérations ensemblistes (l’union, la différence, le produit cartésien, la projection, la restriction, la jointure etc.), appliquées à l’ensemble des relations, doivent être considérées et perçues comme des "loi de composition interne".

    PS : Si Monsieur fsmrel lit ce topic, je serais également ravi d’avoir son avis.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Je crois que nous sommes tous d'accord avec ce que tu viens d'écrire.

    Cela étant, que dire alors des données XML, spatiales, ou encore des types que l'on peut créer soi-même à partir d'une assembly ? Par exemple sous un type de données spatial, on peut aussi bien stocker des points que des segments, que des polygones; il peut être correct de stocker tout cela dans la même colonne pour un certain système, et totalement faux dans un autre.

    Je dirai donc que l’atomicité d'une valeur est propre à l'entité en fonction du système à modéliser : il peut être tout à fait incorrect de stocker un document XML dans une colonne pour résoudre un problème particulier, et correct dans un autre

    En espérant que fsmrel passera par là !

    @++

  8. #8
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Tu as raison de soulever ces interrogations. Elles méritent réflexion !

    Soulignons que la première forme normale est une question de définition de domaine, elle est donc intrinsèquement liée au type de données ; chaque valeur d’un domaine est en fait un "atome" du point du vue du modèle relationnel. Et donc, rien n’empêche de considérer une figure géométrique comme atomique si le domaine représente des figures géométriques (Exemple sous SQL Server : Polygon, CurvePolygon, etc.).

    La première forme normale est généralement justifiée par la simplicité et l’esthétique. Elle consiste simplement à éviter les domaines composés de plusieurs valeurs.

    Quant au XML il s’agit d’un très vaste sujet en soi. Toutefois, l’utilisation du type XML s’avère nécessaire et incontournable dans certaines situations (données représentant une hiérarchie d'imbrications, la structure des données est inconnue ou risque d’évoluer considérablement, etc.). En effet, même s’il a été démontré que tout document XML peut être représenté dans des tables relationnelles, cette solution est à exclure, du fait du nombre important de tables nécessaires à cette à cette représentation, et du fait que les méthodes d’interrogation ne peuvent être génériques, car elles imposent la connaissance de la sémantique des balises du document XML.

    L’utilisation du XML peut être inappropriés dans d’autres situation. Je suis d'accord avec ta citation
    "il peut être tout à fait incorrect de stocker un document XML dans une colonne pour résoudre un problème particulier, et correct dans un autre"
    A l’inverse, il est parfois nécessaire d’exposer des données relationnelles au format XML pour l'échange des données, les services Web.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut A propos de la 1NF
    Bonsoir à tous,


    Citation Envoyé par iberserk Voir le message
    Si fsmrel passe par là... :-)
    Il passe ! :-)

    Citation Envoyé par hmira Voir le message
    Si Monsieur fsmrel lit ce topic, je serais également ravi d’avoir son avis.
    Volontiers !

    Citation Envoyé par elsuket Voir le message
    En espérant que fsmrel passera par là !
    Da !


    De la 1NF (première forme normale)


    J'espère avoir répondu à quelques interrogations...
    Il va de soi que je me situe dans le cadre du Modèle Relationnel de Données de E.F. Codd (aka Relational Theory), modèle qui a harmonieusement évolué depuis maintenant 43 ans.

    Prenons la définition qui est donnée de la 1NF par C.J. Date — la référence mondiale incontestée sur ce sujet — dans Database Design & Relational Theory, je cite et traduis :
    Définition : Soit une relation r ayant pour attributs A1, ..., An, respectivement de type T1, ..., Tn. Alors r est en première forme normale (1NF) si et seulement si pour tous les tuples t appartenant à r, la valeur de l’attribut Ai dans t est du type Ti (i = 1, ..., n).

    En d’autres termes, par définition une relation quelle qu’elle soit est en 1NF ! Pour dire les choses autrement, la 1NF dit seulement que chaque tuple de la relation contient exactement une valeur du type approprié, pour chaque attribut.

    Maintenant, une valeur de table SQL n’est pas forcément une relation et pour l’être et donc respecter la 1NF, elle doit commencer par respecter les contraintes suivantes :
    1. Pas d’ordre de rangement quel qu’il soit pour les lignes de la table.
    2. Pas d’ordre de rangement quel qu’il soit pour les colonnes de la table.
    3. Pas de lignes en double.
    4. Chaque intersection d’une ligne et d’une colonne contient exactement une valeur du type applicable, et rien d’autre.
    5. Toutes les colonnes sont régulières.
    En particulier, le point 4 signifie qu’une colonne donnée ne peut pas contenir une liste ou un tableau de valeurs, c'est-à-dire un groupe répétitif de valeurs. De même, NULL n’est pas une valeur et provoque donc un viol de la 1NF.

    Pour sa part, le point 5 signifie que chaque colonne a un nom et ce nom est unique dans l’en-tête de la table (sont évidemment visés les résultats des requêtes SQL, au nom du principe de fermeture : le mariage d’une table et d’une table est aussi une table et pas un machin ne ressemblant ni à son père ni à sa mère). Par ailleurs, une table ne peut pas héberger de colonne cachée, du genre Object ID, timestamp, etc.


    Citation Envoyé par hmira Voir le message
    Ce que tu veux faire va à l’encontre du modèle relationnel ! Le résultat recherché ne respecte même pas la première forme normale !
    Normalement les noms des chambres doivent être présentés en lignes (une chambre par ligne ) et non pas regroupés dans la même colonne !
    Devant les tribunaux relationnels cette position peut être réfutée : tout dépend du type de la colonne Chambres.

    En effet, si on définit une table RESERVATION (1NF) ainsi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE RESERVATION
    (
            reservation_id      INT           NOT NULL
          , reservation_debut   DATE          NOT NULL
          , reservation_fin     DATE          NOT NULL
          , Chambres            VARCHAR(512)  NOT NULL
        , CONSTRAINT RESERVATION_PK PRIMARY KEY (reservation_id)
    ) ;

    Et si on effectue l’opération suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO RESERVATION (reservation_id, reservation_debut, reservation_fin, Chambres)
        VALUES (1, '2013-04-12', '2013-04-16', '45V,36V') ;
    Alors la valeur '45V,36V' est du type VARCHAR(512), elle est unique à l’intersection de la colonne Chambres et de la ligne qui vient d’être créée (il est vrai que VARCHAR est un grand encapsulateur, un grand tapis sous lequel on peut cacher de gros paquets de poussière !) : formellement la 1NF n'est pas enfreinte.


    En revanche, si on définit un tableau pour la colonne Chambres (PostgreSQL), alors selon la théorie relationnelle la 1NF est violée :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE RESERVATION
    (
            reservation_id      INT           NOT NULL
          , reservation_debut   DATE          NOT NULL
          , reservation_fin     DATE          NOT NULL
          , Chambres            TEXT[]        NOT NULL
        , CONSTRAINT RESERVATION_PK PRIMARY KEY (reservation_id)
    ) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO RESERVATION (reservation_id, reservation_debut, reservation_fin, Chambres)
        VALUES (1, '2013-04-12', '2013-04-16', ARRAY ['45V', '36V']) ;

    A noter que dans cette affaire, au nom du rasoir d’Ockham, le concept d’atomicité est évacué.

    Devinette :

    A quel niveau se situe l’atomicité ci-dessous ?




    On peut noter que dans le cadre de la théorie relationnelle, un attribut d’une relation peut accepter des relations comme valeurs (RVA).

    Quant à loger des polygones ou des documents XML dans une colonne tout en respectant la 1NF, pas de problème, du moment que le type correspondant soit défini, ainsi que les opérateurs associés à ce type.

    Exemple :

    Voici quelques définitions de types, repris de Databases, Types, and the Relational Model, The Third Manifesto, page 131 (Voyez aussi Tutorial D qui est téléchargeable) :

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TYPE LONGUEUR ORDINAL    -- domaine des longueurs (ORDINAL signifie que 2 longueurs peuvent être comparées).
        {X RATIONAL CONSTRAINT X >= 0.0} ;
    Où X est le composant du type qui me convient (rationnel en l’occurrence).

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TYPE ANGLE ORDINAL
        {RHO RATIONAL CONSTRAINT RHO >= 0.0 AND RHO < 3.14159} ;

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     TYPE POINT    -- points géométriques dans l’espace à 2 dimensions
        POSSREP CARTESIAN {X RATIONAL, Y RATIONAL}    -- POSSREP signifie : "une représentation possible"
        POSSREP POLAR {R LONGUEUR, THETA ANGLE} ;

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TYPE ELLIPSE 
        {A LONGUEUR, B LONGUEUR, CENTRE POINT CONSTRAINT A >= B} ;

    Code D : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TYPE POLYGONE 
        {SOMMETS RELATION {S# INTEGER, SOMMET POINT}} ;

    J'espère avoir répondu à quelques interrogations sans en susciter trop d'autres...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #10
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je m'attendais à cette conclusion
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  11. #11
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Merci fsmrel pour tes explications détaillées et précises.

    Le modèle tel qu’il décrit initialement (premier message émis par l'auteur de ce topic) respecte bien la première forme normale voir copie ci-dessous :
    1 - J'ai une table chambres(chambre_id, chambre_nom)
    2 - une table resrvations(reservation_id, reservation_debut, reservation_fin)
    vu qu'une réservation peut concerner plusieurs chambres alors j'ai crée:
    3 - une troisième table intermédiaire concerne(reservation_id, chambre_id).
    Comme on pourrait le deviner aisément, la relation "reservations" respecte bien la première forme normale. L'auteur de ce topic a bien pris soin d'effectuer une opération de décomposition de la relation "reservations" au travers la nouvelle relation "concerne".

    Ce que personnellement je conteste, c’est l’approche qui consiste à partir d’un modèle "propre", exemple en 3NF, représentant les entités et les associations canoniques du monde réel, dériver ou déduire une relation qui n’est pas en première forme normale ! Et ce, juste pour des considérations de présentation ! En effet, dans mon esprit la relation (ou la vue) déduite ressemble d’avantage à l’exemple que tu as donné sous PostgreSQL avec un tableau pour la colonne chambre. D’autant plus que pour parvenir à cette relation ou vue on fait le chemin inverse, c.à.d la "recomposition". Une opération de calcul qui surcharge inutilement le travail du Serveur sans apporter aucune information supplémentaire puisque l’information de base existe déjà dans la table chambres.

    Donc c’est une pratique que personnellement je déconseille. Je préférerais même dans ce contexte que l’utilisateur définisse dès le départ la colonne Chambres de type VARCHAR(512) dans laquelle il pourra insérer des valeurs comme '45V, 36V' et je suis entièrement d’accord avec toi que dans ce contexte la 1NF n’est pas enfreinte en effet je te cite :
    Citation Envoyé par fsmrel Voir le message
    ..VARCHAR est un grand encapsulateur, un grand tapis sous lequel on peut cacher de gros paquets de poussière !
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par hmira Voir le message
    Ce que personnellement je conteste, c’est l’approche qui consiste à partir d’un modèle "propre", exemple en 3NF, représentant les entités et les associations canoniques du monde réel, dériver ou déduire une relation qui n’est pas en première forme normale ! Et ce, juste pour des considérations de présentation !
    Si le but est de produire des relations pouvant à leur tour participer en tant qu’opérandes à des opérations relationnelles, c'est-à-dire se marier, copuler, accoucher de relations de même nature que leur parents (tant qu’à faire !) il est évident que la 1NF doit être respectée, sinon les fruits des mariages seront monstrueux.

    Mais :

    Citation Envoyé par Bakkach Voir le message
    Je veux créer la requête qui me permettra d'afficher le résultat [...]
    Ainsi, Bakkach cherche seulement à produire un résultat pour affichage. Relationnellement parlant, ce résultat n’est certes pas une relation, mais Bakkach n’a pas manifesté l’intention de marier ce résultat avec une relation ou un monstre, donc je ne vois pas ce qu’on peut lui reprocher...

    Quant à l’aspect performance, je ne vois pas de relation de cause à effet, il faut par EXPLAIN ou autre procédé mesurer le coût de la requête produisant le résultat, la prototyper. Avec un hôtel à 500 000 chambres (ça n’est pas encore l’hôtel de Hilbert !) la performance peut être excellente, même avec une jointure récursive : extraire une nomenclature dans une table de 500000 lignes en moins de 100 millisecondes, c’est jouable... Si en revanche, après prototypage de la performance, produire le résultat coûte trop cher aux yeux de la Production informatique, alors il faudra effectivement trouver un autre moyen pour parvenir à ses fins (j'ai connu ça avec des tables en 5NF, hébergées par une machine bases de données Teradata à 128 processeurs (1 MF le processeur...), on ne disposait pas de l'opérateur UNION et malgré tout c'était le bon temps ! )
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  13. #13
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Je te remercie beaucoup pour cette réponse bien étayée et qui de surcroît très instructive

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/01/2014, 18h45
  2. Réponses: 3
    Dernier message: 03/07/2010, 17h31
  3. Plusieurs résultats de requètes dans le datagridview
    Par abbd dans le forum Windows Forms
    Réponses: 15
    Dernier message: 20/05/2008, 18h19
  4. Réponses: 6
    Dernier message: 18/09/2007, 17h10
  5. Réponses: 7
    Dernier message: 26/09/2005, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo