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

Schéma Discussion :

L'écriture de calcul relationnel


Sujet :

Schéma

  1. #1
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut L'écriture de calcul relationnel
    * Bonjour, *

    voilà un ptit exercice en algèbre relationnelle

    On a ces EA :
    Emprunt (Personne, Livre, DateEmprunt, DateRetourPrevue, DateRetourEective)
    Retard (Personne, Livre, DateEmprunt, PenalitéRetard)
    J'ai la question

    2. Quelles sont les personnes n'ayant jamais rendu de livre en retard ?

    En réponse en algèbre relationnelle : ΠPersonne(Emprunt) − ΠPersonne(Retard)

    tout est ok

    Mais en calcul relationnel :

    {t.Personne | Emprunt(t) ∧ ¬[∃ u Retard(u) ∧ (u.Personne = t.Personne) )]}
    J'y comprends rien du coup

    Quelqu'un peut-il m'éclairer sur l'écriture calcul relationnel ?

    Merci
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Ce n'est peut être pas le meilleur endroit pour obtenir une réponse (ici c'est SQL, donc assez concret).

    Ta formule ressemble à une description assez mathématique d'un ensemble.
    Je dirais (sans rien y connaître ) :

    {...} : c'est un ensemble

    {t.Personne : ton ensemble contient des éléments Personne de t.

    | : "tel que". Ce signe sépare le "typage" de ton ensemble, des prédicats que ces éléments doivent vérifier.

    Emprunt(t) ∧ ¬[∃ u Retard(u) ∧ (u.Personne = t.Personne) )] :
    C'est le prédicat que doit vérifier un élément t.Personne pour qu'il appartienne à l'ensemble que tu définis.

    Emprunt(t) : dans l'hypothèse où "t" désigne un tuple de la table Personne, je dirais que ce prédicat veut dire "il existe pour la personne t un tuple dans la table emprunt"

    : ça on dirait un caractère qui passe mal Je parierais sur le chapeau qui veut dire "et". Ce qui veut dire que le premier prédicat Emprunt(t) ainsi que le prédicat qui suit ce signe doivent être vérifié.

    ¬[∃ u Retard(u) ∧ (u.Personne = t.Personne) )] : ¬ veut dire "non", et donc la chose entre crochets juste après doit être fausse pour le tuple "t".
    ∃ désigne veut dire "il existe", et donc on "∃ u Retard(u) ∧ (u.Personne = t.Personne) )" veut dire qu'il y a un tuple pour dans la table retard dont le champ personne est égal à celui de t.Personne.

    Au final, ça se lit : l'ensemble des "t" que l'on retrouve dans Emprunt, pour le quel il n'existe pas de tuple dans Retard ayant le même champ "Personne".

    Là où la première écriture correspond à des manipulations d'ensemble (avec les opérateurs ensemblistes), la seconde définit les membres de l'ensemble en décrivant le prédicat qu'ils doivent respecter.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    Oui en effet les caractères ne passent plus bien du coup, peut être suite à la modification du message.

    Je pense que je comprends mieux, sauf :

    Emprunt(t) : dans l'hypothèse où "t" désigne un tuple de la table Personne, je dirais que ce prédicat veut dire "il existe pour la personne t un tuple dans la table emprunt"
    Ici la table est bien Emprunt, t désigne les tuples de cette table, pour Personne c'est juste un attribut des deux tables Emprunt et Retard.

    Pour être sûre que je comprends bien, la traduction en un langage SQL, devrait être soit :

    Select E.Personne From Emprunt E
    Except
    Select R.Personne from Retard R Where E.Personne=R.personne
    Ou bien :

    Select E.Personne From Emprunt
    where E.Personne not exists in ( Select D.Personne from Retard R
    Where D.Personne=R.Personne )
    Pas sûre surtout pour la deuxième requête si c'est correct.

    Dites moi.

    J'ai encore besoin d'aide sur un truc sur le cours, concernant les divisions, j'envoie une pièce en ci-joint

    Sur l'exemple en matrice, je ne comprends pas comment on a sorti les matrice V' et V" et les résultats R/V, R/V', R/V"

    Merci.


    Cdt
    Images attachées Images attachées  
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ouais, en fait, je dirais (toujours au pif) que la première partie :
    {t.Personne| ne dit rien de ce qu'est "t".

    Et donc le premier prédicat permet de définir le contexte : "t un tuple de Emprunt"

    Pour la requête, c'est presque ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select DISTINCT E.Personne From Emprunt
    where E.Personne not exists ( Select 1 from Retard R
    Where D.Personne=R.Personne )
    - DISTINCT parce que la projection SQL n'est pas "ensembliste" et donc non-relationnelle
    - NOT EXISTS, pas besoin du IN --par contre tu peux avoir la variante NOT IN
    - J'ai mis 1 dans le SELECT parce qu'on s'en fout de ce qu'il y a dans le SELECT (idéalement, faudrait rien mettre mais ça fait syntax error ). Certains préfèrenet "null", ou "*", ...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    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
    Bonjour Witch et Pacmann,


    C’est toujours un plaisir de croiser le valeureux et secourable Pacmann !

    Citation Envoyé par witch Voir le message
    J'ai encore besoin d'aide sur un truc sur le cours, concernant les divisions
    Je vous plains... Les profs ont une fâcheuse tendance à présenter les choses de façon hermétique, vieillotte, figée depuis trente ans, de quoi dégoûter définitivement l’étudiant. En plus la définition qu’on vous donne est incomplète : elle devrait faire mention de la division par ∅ : quel doit être le résultat si le diviseur est l’ensemble vide ? Au plan théorique, il se trouve qu’il y a plus d’une réponse...

    Il eut été préférable de présenter l’opération ainsi :

    Soit deux relations R et V de degrés respectifs r et v, telles que r > v et V ≠ ∅. Etc.


    Vous pourriez jeter un coup d’œil à l’échange que j’ai eu avec liamine :

    Détail des opérations (je n'y traite pas de la division par ∅, mais je vous laisse le soin de fournir le résultat correspondant).

    Différentes formulations de la division.

    Si cette lecture des réponses faites à liamine vous laisse sur votre faim, n’hésitez pas à poser vos questions.

    Bon courage.
    (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.

  6. #6
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par pacmann Voir le message
    - DISTINCT parce que la projection SQL n'est pas "ensembliste" et donc non-relationnelle
    Je suis peut être en retard par rapport aux cours mais je ne comprends pas ce que veut dire ensembliste, et non relationnelle, d'autant que je ne comprends pas le rôle du distinct dans cette requête, le distinct n'est pas représenté dans la formule que j'ai cité avant, si ?
    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Un grand plaisir pour moi également Fmsrel ! (même si au vu des conneries que j'ai pu raconter la dernière fois que j'ai répondu à l'un de vos postes, cela pourraît être un plaisir sarcastique de votre part )

    Bref, "la projection SQL" n'est pas ensembliste.
    Sur un exemple, les paires de nombres N x N :
    Code : 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
    17
    18
    19
    20
    SQL> CREATE TABLE N2 (i number, j number);
    
    Table crÚÚe.
    
    SQL> INSERT INTO N2 VALUES(1, 2);
    
    1 ligne crÚÚe.
    
    SQL> INSERT INTO N2 VALUES(1, 3);
    
    1 ligne crÚÚe.
    
    SQL> INSERT INTO N2 VALUES(1, 1);
    
    1 ligne crÚÚe.
    
    SQL> commit;
    
    Validation effectuÚe.
    Dans un ensemble, il n'existe pas de doublon. Et si je veux bien faire, je crée au minimum une contrainte d'unicité sur (i,j).
    Jusque là, pas de problème en SQL.

    Par contre, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> SELECT i FROM N2;
             I
    ----------
             1
             1
             1
    J'ai trois lignes !

    Alors que si tu transposes sur des ensembles, c'est comme si tu définis une fonction :

    f : N x N -> N
    (i, j) |-> i

    L'ensemble image de {(1,2); (1,3); (1, 1)}... c'est {1}
    Et bien sûr {1, 1, 1} n'a aucun sens. Dans un ensemble i = j, ça veut dire qu'il sont le même, il n'y a pas de notion de doublon !

    Donc sur ce point, la projection SQL (c'est à dire SELECT autre chose que tous les champs) ne respecte pas la théorie relationnelle.

    Par contre, quand tu ajoutes le DISTINCT, ça enlève les doublons, ça ne renvoie qu'une ligne...

    Et c'est pour ça que :
    le distinct n'est pas représenté dans la formule que j'ai cité avant, si ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #8
    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
    Bonsoir,


    Citation Envoyé par witch Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select E.Personne From Emprunt E
    Except 
    Select R.Personne from Retard R Where E.Personne=R.personne
    Que ce soit en SQL ou autre langage, WHERE n’a pas à figurer ici (il redonde et en plus syntaxiquement il provoque une erreur), EXCEPT suffit :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personne FROM EMPRUNT
    EXCEPT 
    SELECT Personne FROM RETARD ;


    Citation Envoyé par witch Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select E.Personne From Emprunt 
    where E.Personne not exists in ( Select D.Personne from Retard R
    Where D.Personne=R.Personne )
    La syntaxe exacte est la suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT Personne
    FROM   EMPRUNT 
    WHERE  NOT EXISTS (SELECT *
                       FROM   RETARD 
                       WHERE  EMPRUNT.Personne = RETARD.Personne) ;


    Citation Envoyé par witch Voir le message
    je ne comprends pas ce que veut dire ensembliste, et non relationnelle, d'autant que je ne comprends pas le rôle du distinct dans cette requête, le distinct n'est pas représenté dans la formule que j'ai cité avant, si ?
    Pacmann a parfaitement raison. Ce que j'écris doublonne (sic !) avec ce qu’il vous a exposé, mais parfois bis repetita placent...

    Par définition, les éléments appartenant à un ensemble n’y doublonnent pas. L’ensemble N des entiers naturels est le suivant :
    {0, 1, 2, 3, ...}
    mais ça n’est pas un sac à l'instar de cette chose bizarre :
    {0, 0, ..., 1, 1, 1, ..., 2, 2, ...}
    Selon la théorie relationnelle, EMPRUNT et RETARD sont des variables prenant des valeurs qui sont des relations. L’en-tête d’une variable ou d’une relation est un ensemble au sens de la théorie des ensembles. En SQL ça n’est pas le cas et vous avez le droit d’écrire quelque chose comme ceci (ce qui est interdit en relationnel) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT   Personne, Personne, Personne, ...
    FROM     EMPRUNT
    ...

    Par contre, l’en-tête de la variable EMPRUNT est valide :
    {Personne, Livre, DateEmprunt, DateRetourPrevue, DateRetourEffective}.
    Même chose pour l’en-tête de la relation EMPRUNT ci-dessous. De la même façon, le corps de cette relation (l’ensemble de ses n-uplets, ou lignes) est un ensemble et aucun n-uplet ne peut y figurer en double :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EMPRUNT   {Personne,   Livre,   DateEmprunt,   DateRetourPrevue,   DateRetourEffective}
               p1          l1       2011-03-11     2011-04-05          2011-09-05
               p1          l1       2011-10-11     2011-11-01          2011-10-21
               p1          l2       2011-10-11     2011-11-10          2011-11-10
               p2          l1       2011-11-03     2011-11-07          2011-11-07
               p2          l2       2011-11-05     2011-11-09          2011-11-09
    Comme l’a montré Pacmann, SQL permet pour sa part que le corps d’une table soit un sac au lieu d’être un ensemble. Si vous omettez la clause DISTINCT et écrivez :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Personne
    FROM   EMPRUNT 
    WHERE  NOT EXISTS (SELECT *
                       FROM   RETARD 
                       WHERE  EMPRUNT.Personne = RETARD.Personne) ;

    Et si la variable RETARD prend par exemple la valeur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RETARD    {Personne,   Livre,   DateEmprunt,   PenaliteRetard}
               p1          l1       2011-03-11     50
    alors le résultat de l’opération de projection (SELECT Personne) n’est pas un ensemble mais un sac :
    Si vous comptez les lignes du résultat, peut-être concluerez-vous que deux personnes ont rendu des livres en retard, vous pourriez effectuer des cumuls de pénalités erronés, etc.

    Remarque

    Avec les ensembles que sont les relations, le principe de fermeture est respecté, c'est-à-dire qu’on peut utiliser les yeux fermés le résultat d’une opération comme opérande pour une nouvelle opération :

    Le bébé, fruit du mariage de deux relations par UNION, DIFFÉRENCE, JOINTURE, etc., est une relation qui a son tour peut être mariée et avoir des bébés de même nature que ses parents. Le problème avec les sacs est qu’il y a un risque à les faire participer à des opérations ensemblistes : unpredictable results...
    (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.

  9. #9
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Bonsoir,

    Merci fsmrel, pacmann pour vos explications, corrections, c'était intéressant j'ai eu plus de réponses que ce que j'attendais

    Je n'hésiterai pas de poster si jamais j'ai besoin... après il faudra que je fasse plus d'effort pour réviser les cours, tuto ...etc

    If a pretty poster and a cute saying are all it takes to motivate you, you probably have a very easy job. The kind robots will be doing soon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Erreur de calcul causée par une erreur d'écriture
    Par glpx65 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 26/09/2014, 14h14
  2. Algèbre et calcul relationnel
    Par Sebsheep dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 06/02/2014, 03h04
  3. aide calcul relationnel
    Par gentelmand dans le forum SQL
    Réponses: 3
    Dernier message: 28/04/2010, 12h56
  4. [C#] écriture fichier .txt + calcul écart-type
    Par titaB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/05/2005, 13h09

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