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 :

Optimisation relation entre table


Sujet :

Schéma

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut Optimisation relation entre table
    Bonjour tous le monde,

    Avant de commencer, je vous joins le shema de 2 tables.

    Donc comme vous pouvez le voir sur ce schema, j'ai les tables suivantes :

    - User(Login,Nom..)
    - Liste(id,nom_liste,entreprise,...,Login)

    Vous pouvez remarquez que la table User et Liste sont reliées par le Login.

    Un utilisateur va pouvoir créer plusieur liste d'entreprise qui seront stocké dans Liste. On pourra retrouver les entreprises correspondantes à une de ses listes par son Login et par le nom de sa liste.

    Le problème c'est que la table peut prendre très vite de l'ampleur dans le cas ou beaucoup d'utilisateur créeraient plusieurs listes...

    Pourriez vous m'aidez à optimiser ces deux tables ?

    PS: La table liste contiendra plusieurs autres colonnes relatives à l'entreprise(telephone, adresse...)

    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par bobosh Voir le message
    Un utilisateur va pouvoir créer plusieur liste d'entreprise qui seront stocké dans Liste. On pourra retrouver les entreprises correspondantes à une de ses listes par son Login et par le nom de sa liste.
    Il manque quelque chose dans ton schéma !

    Si tu enregistres toutes les entreprises d'une liste dans la liste, tu as une propriété multi-valuée et ta base ne sera pas normalisée.

    Partons de la conception, donc du schéma MCD qui est l'objet principal de ce forum :
    Utilisateur -0,n----Creer----1,1- Liste -0,n----Contenir----0,n- Entreprise

    On voit qu'il y a trois entités, qui deviendrons 3 tables et deux associations dont une, de type (0,n - 0,n), entraînera la création d'une table supplementaire.

    Ensuite je te conseille d'utiliser une clé primaire anonyme de type entier non signé non nul et auto-incrémenté pour tes tables issues d'entités du MCD plutôt qu'un login par exemple.

    On aura alors les tables :
    User (U_Id, U_Login, U_Adrel, U_Nom, U_Prenom, U_Password)
    Liste (L_Id, L_NomListe, L_IdUser)
    Entreprise (E_Id, E_NomEntreprise, E_Adresse, E_Telephone...)
    ListesEntreprises (LE_IdEntreprise, LE_IdListe...)

    Les clés primaires sont soulignées et les clés étrangères sont en italique.

    Encore une petite chose tant qu'on y est :
    L'adresse est une propriété composée entre autre d'une commune, laquelle peut être externalisée dans une autre entité.
    Et une entreprise peut avoir plusieurs adresses et plusieurs téléphones donc l'adresse et le téléphone peuvent aussi être externalisés.

    Entreprise -0,n----Adresser----1,1- Adresse -1,1----Situer----0,n- Commune -1,1----Situer----0,n- Pays

    Entreprise -0,n----Avoir----1,1- Telephone
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    Bonjour et merci de ta réponse.

    J'ai joint le schema, pourrait tu me dire si c'est bien ce que tu m'expliqué?

    Au départ j'étais partis sur un truc du genre mais je me suis dit que cela diminuer le nombre de colonne par table et non le nombre de ligne.

    Car au final, il y aura toujours autant de lignes dans la table entreprise et j'ai peur que les requêtes sois longues au fur et à mesure que la table se remplisse.

    De plus quand j'étais partis sur ce schema, j'avais fusionné les table listeEntreprise et Entreprise. Pourrais tu m'expliquer pourquoi tu les sépare ici ?

    Encore merci
    Images attachées Images attachées  

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Car au final, il y aura toujours autant de lignes dans la table entreprise et j'ai peur que les requêtes sois longues au fur et à mesure que la table se remplisse.
    Avant que les performances s'en ressentent, tu vas pouvoir en enregistrer des entreprises !

    De plus quand j'étais partis sur ce schema, j'avais fusionné les table listeEntreprise et Entreprise. Pourrais tu m'expliquer pourquoi tu les sépare ici ?
    Ben à moins que tu ne fasses que des listes d'une seule entreprise, je ne vois pas comment tu vas enregistrer plusieurs entreprises pour une liste avec ta structure.

    Et si une entreprise apparaît dans plusieurs listes, avec ton modèle complété de l'adresse et du téléphone, tu vas répéter des informations avec un risque de données différentes pour une même entreprise... Bref, schéma pas normalisé donc pas bon.

    Venons-en à ton dernier schéma.
    Normalement, tu n'as pas besoin de LE_Id dans la table ListeEntreprise. La clé primaire de cette table devrait, comme je l'ai fait dans mon message, être composée des deux colonnes LE_IdEntreprise et LE_IdListe.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    ba je pensais juste dans ListeEntreprise organiser cela de la façon suivante :

    ListeEntreprise(id_entreprise,nom,adresse,..,id_liste).

    Et si deux utilisateur ajoute la même entreprise, je ne vois pas comment faire pour ne pas l'avoir en double vu qu'elle appartient à leur liste personnelle...

    De plus je ne savais pas que l'on pouvait avoir une clé primaire composée de 2 colonnes, je ne sais pas du tout comment cela fonctionne.

    Désolé du dérangement et encore merci.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    Je crois que je viens de comprendre, dis moi si je me trompe.

    J'ai ma table d'utilisateur relié à une table qui contient ma liste personnel, et cette liste personnel est unique si j'ai bien compris et est relié à une autre table liste_entreprise qui contient mes sous listes.
    J'ai ensuite ma table qui contient mes entreprise qui est relié à ma table liste_entreprise.

    Par contre le coup de la clé primaire qui utilise 2 colonnes je ne vois vraiment pas...

    Et si tu aurais une solution pour que les utilisateurs ne rentrent pas deux fois la même entreprise(une explication rapide je me débrouillerais pour la mettre en oeuvre)

    Merci beaucoup du temps que tu m'accorde.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par bobosh Voir le message
    J'ai ma table d'utilisateur relié à une table qui contient ma liste personnel,
    Jusque là, ça va !

    et cette liste personnel est unique si j'ai bien compris
    Ce n'est pas ce que dit mon schéma :
    Utilisateur -0,n----Creer----1,1- Liste -0,n----Contenir----0,n- Entreprise
    Ce schéma dit :
    "Un utilisateur peut créer plusieurs listes et une liste est créée par un seul utilisateur."

    et est relié à une autre table liste_entreprise qui contient mes sous listes.
    Il ne s'agit pas de sous listes mais du contenu des listes.

    J'ai ensuite ma table qui contient mes entreprise qui est relié à ma table liste_entreprise.
    Oui.

    Alors on va expliquer en détail et en étapes.

    Je m'inscris sur ton application et donc il se crée une ligne dans la table User :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO User (U_Login, U_Mail, U_Nom, U_Prenom, U_Password) VALUES('CinePhil', 'CinePhil31@Hotmail.fr', 'Leménager', 'Philippe', 'xxx')


    Je choisis l'option qui me permet de créer une liste d'entreprises. Il se crée donc une ligne dans la table Liste :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO Liste (L_NomListe, L_IdUser)
    VALUES('ListeCinePhil', (
      SELECT U_id
      FROM User
      WHERE U_Login = 'CinePhil'
      )
    )
    Le système me propose les entreprises déjà existantes dans la table des entreprise et j'en choisis une à insérer dans ma liste :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO ListesEntreprise(LE_IdEntreprise, LE_IdListe)
    VALUES (
      (SELECT E_Id
      FROM Entreprise
      WHERE E_Nom = 'developpez.com'
      ),
      (SELECT L_Id
      FROM Liste
      WHERE L_NomListe = 'ListeCinePhil'
      )
    )
    Je crée une nouvelle entreprise à insérer dans ma liste :
    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
    INSERT INTO Entreprises(E_Nom, E_Adresse)
    VALUES('ENFA', 'BP22687 - 31326 CASTANET TOLOSAN Cedex');
     
    INSERT INTO ListesEntreprise(LE_IdEntreprise, LE_IdListe)
    VALUES (
      (SELECT E_Id
      FROM Entreprise
      WHERE E_Nom = 'ENFA'
      ),
      (SELECT L_Id
      FROM Liste
      WHERE L_NomListe = 'ListeCinePhil'
      )
    )

    Quelles sont les entreprises sde ma liste ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT e.E_Nom
    FROM Entreprise AS e
    INNER JOIN ListesEntreprise AS le ON e.E_Id = le.LE_IdEntreprise
      INNER JOIN Liste AS l ON le.LE_IdListe = l.L_Id
    WHERE l.L_NomListe = 'ListeCinePhil'
    ORDER BY e.E_Nom

    Je crois que tu as grand besoin de te plonger assidûment dans le blog de SQLPro !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    A ok j'ai compris ta façon de procédé.

    Je vais me plonger dans ce blog car c'est vrai que je n'ai pas encore suivi de cours de modelisation mes seulement de requête sql et pl/sql donc ....

    Par contre ce qui n'est pas super pratique c'est si deux personnes ajoutent une entreprise qui est la même mais mal orthographié avec une erreur dans dans l'adresse cela va être dur pour les différencier...

    Enfin je verrais ça plus tard, je te remercie de ton aide.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    J'aurais une dernière question sans vouloir abuser de ta patience.

    Donc dans le schema que tu utilise, chaque utilisateur peut entrer une entreprise dans la base de donnée et l'ajouter à sa liste. Si l'entreprise est déjà présent dans la base de donnée, l'utilisateur peut alors l'ajouter directement à sa propre liste.

    Mais lorsqu'un utilisateur voudra ajouter une entreprise déjà dans la base de donnée à sa liste et qu'il s'apercevra par exemple que le numéro de téléphone de l'entreprise est erroné, il faudra bien que l'utilisateur modifie l'entrée de l'entreprise.

    Jusque la tout va bien, mais un utilisateur mal intentionné pourrait alors modifié toutes les données en rapport avec une entreprise.

    C'est pour cela que je voulais une liste personnalisé à l'utilisateur.

    Car le but n'est pas de faire un annuaire d'entreprise...

    Et je ne vais pas modifier les entrée moi même au fur et à mesure que la table se remplirait.

    Sinon il aurait fallu dès le départ avoir un annuaire d'entreprise, et là cela aurait été jouable...

    J'espère avoir bien expliquer mon problème et que tu voudra bien me répondre une dernière fois...

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quelle est la nature exacte de ce besoin qui justifie de te méfier des utilisateurs mal intentionnés ?

    La structure de la BDD est ce qu'elle est. Ce qu'on en fait, c'est ensuite le boulot du logiciel. Ce logiciel peut très bien prévoir qu'un utilisateur ne peut modifier que les données qu'il a créées. Auquel cas il faut que tu ajoutes une relation entre User et Entreprise :
    User -0,n----Enregistrer----1,1- Entreprise

    Si un autre utilisateur veut référencer une entreprise existante dans sa liste et qu'il possède des informations complémentaires à celles qui figurent déjà dans la table entreprise, le logiciel peut prévoir une demande de modification validée par l'utilisateur qui a enregistré l'entreprise et qui a seul le droit de modifier ces données. On peut imaginer d'autres modes de fonctionnement mais c'est à toi de connaître ton besoin réel et précis.

    Ceci dit, je maintiens qu'une liste est composée de plusieurs entreprises et qu'il faut donc différencier les entités Liste et Entreprise. Surtout si un utilisateur peut créer plusieurs listes, c'est la seule méthode efficace.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    Je me méfie car c'est pour mettre l'application sur le web.

    Et si le maintient des informations dépend des utilisateurs alors la base de donnée ne sera jamais à jour car ceux ci ne vont pas se donner la peine de le faire s'il n'utilise plus l'application...

Discussions similaires

  1. Access me change mes relations entre tables
    Par karimspace dans le forum Access
    Réponses: 14
    Dernier message: 29/03/2006, 09h57
  2. Relation entre tables dans bdd différentes
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/03/2006, 08h03
  3. Les relations entre tables
    Par sheira dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/03/2006, 15h03
  4. Récupération des relations entre tables
    Par Themacleod1980 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2006, 11h34
  5. relations entre tables
    Par ilyassou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/11/2005, 07h48

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