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 :

Maintenance de camions


Sujet :

Schéma

  1. #41
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut
    Merci fsmrel :-) Vous m'êtes vraiment d'un grand secours. :-) Je vais concevoir un dessein de l'interface que je compte développer. Et je vais aussi faire l'autre partie de ma base de données. Ensuite je vous présentez ce que j'ai fais et je vous demanderez encore de l'aide pour la liaison avec la partie que vous avez développer. Je ne veux pas vous fassiez tout le travail pour moi car j'apprécie vraiment votre aide et je dois aussi m'aider moi-même. J'ai quand même de la difficulté à voir comment je vais relier votre partie avec la mienne mais nous verrons cela lorsque j'aurai fait ma part. Merci beaucoup fsmrel…






    Citation Envoyé par fsmrel Voir le message
    Bonsoir ordigil,

    Personne ne fermera cette discussion, donc on reste à l'écoute, autrement dit, personne ne viendra nous brouiller l'écoute...
      0  0

  2. #42
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Ave ordigil,

    Aide-toi, et le Ciel t'aidera !

    Le plus important tient dans la rédaction des règles de gestion des données, lesquelles doivent être le plus exhaustives possible, et non ambiguës (ce qu’elles sont pourtant bien souvent, mon constat depuis bien des décennies). Raconter le film aide énormément, tant le rédacteur que le lecteur, aussi je vous engage à lire lentement mais jusqu’au bout ce que j’ai écrit dans mon billet Modélisation des données : nécessité d’une présentation suffisante du sujet à traiter. On y voit que même les auteurs de référence peuvent avoir des absences qui transparaissent du reste dans leurs propres MCD, mais qui pourrait leur en vouloir quand ils ont cherché à faire au mieux ? Il n’y a que ceux qui ne font rien qui ne se trompent pas...

    C’est le moment de citer Boileau : « Ce qui se conçoit bien s’énonce clairement, et les mots pour le dire arrivent aisément ».

    Quoi qu’il en soit, votre propre défi sera de raconter le branchement de l’existant et de ce que nous avons vu par ailleurs : exposez quand même les problèmes que vous rencontrez à ce sujet, mais un par un ! tout petit bout par petit bout, et croisons les doigts, nous ne somme pas des magiciens...
    (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.
      2  0

  3. #43
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Hello ordigil,


    Alors nos camions, une affaire qui roule ?
    Les médailles sont bien arrivées

    En cas de problème, n'hésitez pas.
    (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.
      2  0

  4. #44
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    Heureux que vous avez reçu les médailles car vous les méritez bien. :-) Je vais encore avoir besoin de vous pour les relations entre mes tables Je sais que vous privilégiez les colonnes non null mais dans mon cas, je n'ai pas le choix car lors de l'achat d'un véhicule nous n'avons pas toutes les informations disponibles et certaines informations ne seront jamais disponibles…. Et je veux aussi des tables 1-1, je ne sais pas le vrai terme " lorsqu'on split une table en deux avec relation 1-1 " pour isoler ce que vous avez fait car ça sera plus facile pour moi de réutiliser votre partie dans d'autre projets.




    Citation Envoyé par fsmrel Voir le message
    Hello ordigil,


    Alors nos camions, une affaire qui roule ?
    Les médailles sont bien arrivées

    En cas de problème, n'hésitez pas.
      0  0

  5. #45
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Petit problème
    Bonjour fsmrel. Lorsque j'essaie d'inscrire un nouveau camion dans ma base de données et que je le fais avec un script le Camion id est automatiquement généré mais lorsque je passe par mon formulaire PHP il me demande d'insérer moi-même un Camion id, chose impossible puisque justement dans ma base de données cette clé est auto-générée… Même chose si j'édite un camion avec mon formulaire PHP, il refuse de se mettre à jours car il me dit que je ne peux pas éditer le Camion id...

    Pièce jointe 410169
      0  0

  6. #46
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel. Ah j'ai réussi LoL
    Cette partie fonctionne maintenant, j'avais fait une petite erreur de programmation.
    Mais j'ai besoin de votre précieuse aide pour terminer la base de donnée et encore vos précieux conseils
    Et en plus votre nom va apparaître à côté du mien sur les formulaires, même si cette base de donnée sera privée et demeurera accessible seulement par quelques personnes,
    car je suis vraiment reconnaissant de votre aide et je ne peux m'en attribuer le crédit.


    [QUOTE=ordigil;10461677]Bonjour fsmrel. Lorsque j'essaie d'inscrire un nouveau camion dans ma base de données et que je le fais avec un script le Camion id est automatiquement généré mais lorsque je passe par mon formulaire PHP il me demande d'insérer moi-même un Camion id, chose impossible puisque justement dans ma base de données cette clé est auto-générée… Même chose si j'édite un camion avec mon formulaire PHP, il refuse de se mettre à jours car il me dit que je ne peux pas éditer le Camion id...

    Pièce jointe 410180
      0  0

  7. #47
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,

    Citation Envoyé par ordigil Voir le message
    Lorsque j'essaie d'inscrire un nouveau camion dans ma base de données et que je le fais avec un script le Camion id est automatiquement généré mais lorsque je passe par mon formulaire PHP il me demande d'insérer moi-même un Camion id, chose impossible puisque justement dans ma base de données cette clé est auto-générée…
    Je ne connais absolument pas PHP. A mon sens, il devrait être un « utilisateur » comme un autre, à qui on expose tous les attributs, sauf ceux qui sont artificiels et utilisés pour les clés primaires (camionId en l’occurrence). Même principe pour le formulaire, lequel ne devrait donc pas comporter de champ Camion Id. C’est l’attribut camionImmat (clé alternative) qu’on doit leur proposer (ou un nouvel attribut à mettre en œuvre et jouant ce rôle). Seul le SGBD doit être au courant de l’existence de camionId, qui doit rester sous le capot (normal pour un camion...)

    Pourriez-vous montrer les requêtes SQL dans leur enveloppe PHP ?
    (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.
      2  0

  8. #48
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    C'est ok pour le CamionId, J'avais fait une petite erreur de programmation dans mon interface WEB. Maintenant il s'affiche et il s'incrémente seul et l'utilisateur n'a plus aucun contrôle sur celui-ci à l'exception d'effacer le camion de la base de donnée et ce CamionId ne sera jamais réutilisé pour aucun autre Camion. Donc si j'efface un Camion avec disons le CamionId #17, tout ce qui se rapporte à ce camion est effacé de la base de donné et le CamionId #17 n'apparait plus dans l'interface WEB et il ne sera plus jamais utilisé dans la base de donnée même s'il n'est plus associé à aucun Camion. J'aime bien qu'il apparaisse sur la page WEB puisque l'utilisateur n'a aucun contrôle sur celui-ci, il n'y a aucun problème à le voir apparaitre et c'est facile pour l'utilisateur d'associer dans sa tête ou de d'écrire sur un petit bout de papier ce numéro comme référence à un camion puisque ce numéro ne changera jamais.

    Maintenant il faut que je change le camionimmat pour utiliser le VIN du camion ( "Vehicle Identification Number", numéro de série que le fabricant appose sur le véhicule ) comme clé alternative car le numéro d'immatriculation du camion peut changer alors que le VIN est la seule référence unique à un camion qui ne changera jamais.


    Je ne sais pas comment l'achat d'un camion fonctionne en Europe mais ici en Amérique du Nord, je peux acheter un camion complet ou je peux acheter seulement le chassis d'un camion ou acheter le chassis avec moteur, différentiel, transmission sans la cabine ou je peux acheter le chassis du camion avec la cabine sans moteur, sans transmission et sans différentiel. Ça se nomme "Glider Kit". Dans la majorité des cas nous achetons un camion 100% fonctionnel mais il y a quand même cette possibilité d'où la façon dont la base de donnée fonctionne. La façon dont vous avez développé cette partie de la base de donnée fonctionne exactement de la façon appropriée

    Je ne connais rien du tout en programmation PHP mais vraiment facile à utiliser, sécuritaire, compatible avec tout tout tout et vraiment tout, Mac, IPhone, Android, Windows, Linux, OS2, UNIX puisque PHP est invisible au système d'exploitation de l'utilisateur, il fait la liaison entre mon interface WEB et ma base de donnée, c'est comme un esclave qui se charge de la sale besogne. C'est un petit plus pour la sécurité car l'utilisateur n'a jamais accès directement à la base de donnée, la base de donnée n'est pas exposée sur internet ni à l'utilisateur. L'utilisateur s'adresse à l'interface WEB uniquement et jamais à la base de donnée. PHP prend alors en charge les requêtes que l'utilisateur a adressées à l'interface WEB et c'est PHP qui s'adresse à la base de donnée. Ensuite PHP affiche sur l'interface WEB les réponses de la base de donnée. Je peux coder du PHP dans une page HTML et je peux coder du HTML dans une page PHP et je peux utiliser du java script en plus. Ça fonctionne dans les deux sens. C'est merveilleux je trouve. À partir d'une page HTML, je peux appeler un formulaire PHP et à partir d'un formulaire PHP, je peux appeler une page web. J'aurais pu utiliser Python qui aurait fait exactement la même chose mais actuellement c'est PHP qui est le plus utilisé et il faut bien faire un choix. En fait j'aurais pu utiliser HTML, PHP, JAVA, JAVA script, PYTHON, C# et Visual Basic.NET tous en même temps pour faire fonctionner tout ça mais….ça aurait simplement compliqué les choses .... PHP simplifie tellement les choses, j'adore…

    Je vous reviens plus tard pour vous redemander votre précieuse aide pour terminer la base de donnée. C'est un peu difficile à expliquer au clavier, ce n'est pas comme expliquer en personne face à face… Je fais des tests pour simplifier au maximum la base de donnée et aussi pour simplifier au maximum l'utilisation de la base de donnée pour l'utilisateur final avant de vous demander de l'aide. Est-ce possible de vous envoyer un courriel en privé pour vous donner un nom d'utilisateur et un mot de passe pour accéder en admin à la base de donnée et aussi en admin sur l'interface WEB ? Je ne veux pas écrire les login sur le Forum.






    Citation Envoyé par fsmrel Voir le message
    Bonsoir ordigil,



    Je ne connais absolument pas PHP. A mon sens, il devrait être un « utilisateur » comme un autre, à qui on expose tous les attributs, sauf ceux qui sont artificiels et utilisés pour les clés primaires (camionId en l’occurrence). Même principe pour le formulaire, lequel ne devrait donc pas comporter de champ Camion Id. C’est l’attribut camionImmat (clé alternative) qu’on doit leur proposer (ou un nouvel attribut à mettre en œuvre et jouant ce rôle). Seul le SGBD doit être au courant de l’existence de camionId, qui doit rester sous le capot (normal pour un camion...)

    Pourriez-vous montrer les requêtes SQL dans leur enveloppe PHP ?
      0  0

  9. #49
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,


    Citation Envoyé par ordigil Voir le message
    Maintenant il faut que je change le camionimmat pour utiliser le VIN du camion
    C’est effectivement une excellente clé alternative, tout à fait respectable.


    Citation Envoyé par ordigil Voir le message
    La façon dont vous avez développé cette partie de la base de donnée fonctionne exactement de la façon appropriée
    Ouf !

    Citation Envoyé par ordigil Voir le message
    PHP simplifie tellement les choses, j'adore…
    Vous voilà un homme heureux !
    (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.
      2  0

  10. #50
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Petit problème avec Merise
    Bonjour fsmrl,

    J'ai un petit problème de compréhension. Lorsque j'effectuerai une maintenance sur un camion et que lors de cette maintenance disons à tous les 40 000 km, je ferai un changement d'huile moteur. Bien que ce changement d'huile concerne le moteur, si je mets le changement d'huile dans la table moteur et que je retire le moteur du camion pour le remplacer par un autre, je veux que le moteur conserve le pedigree des changements d'huile et je veux aussi que le camion conserve le pedigree des changements d'huile sinon lors de la revente du camion, le camion n'afficherait pas tous les changements d'huile. Est-ce que j'énonce mon problème assez clairement ?

    Donc je choisis un camion dans la table Camion, de cette table je vais à la table Maintenance. Dans la table Maintenance il y a une colonne Changement d'huile. Je veux que le pedigree des changements demeure à la fois avec le Moteur et le Camion même si je retire ce Moteur du Camion. Donc lorsque je regarderai le Moteur qui n'est plus installé dans le Camion, j'aurai tous son pedigree des changements d'huile et lorsque je regarderai le Camion, j'aurai aussi tout son pedigree des changements d'huile même si dans les faits, les changements d'huile concernaient le Moteur. Désolé si je me répète....

    Et concernant la consommation de carburant. Miles par Gallon. Oui ici on utilise encore couramment Miles au gallon et non Nombre de litre au 100 kilomètres. Est-ce que je vais utiliser une Fonction d'agrégation (Transact-SQL) pour effectuer le calcul et l'enregistrer dans une colonne, bien que peu performante ou il existe une autre méthode ??? Disons qu'à chaque fin de mois, je met dans une colonne le millage parcouru et le nombre de gallons de carburant utilisé pour un camion, je voudrais que le millage au gallon soit calculé automatiquement et conservé dans une colonne de la base de donnée.

    J'ai fait quelques tables mais je n'ai encore relié aucune d'entre-elles car peut-être que mon approche est fausse… J'ai toujours eu quelques difficultés avec la méthode Merise À l'époque, j'étais autodidacte et j'ignorais tout des méthodes mais par automatisme, j'avais développé ma propre méthode et elle fonctionnait. Lorsque je me suis inscrit à un cours sur les bases de données, on m'a enseigné 2 méthodes pour ensuite me dire qu'elles n'étaient plus utilisées, voici donc Merise. Donc là ça ne sait pas très bien passé dans ma compréhension J'ai toujours dit : Cessez donc d'enseigner ce qui est archaïque et enseignez donc ce qui est utilisé dans l'industrie. Ça n'apporte rien à la compréhension, ça ne fait que mélanger les gens…

    Désolé si ma partie est en anglais, je vais plus tard tout réécrire en anglais car ici dans l'industrie, bien que le Québec soit une province française, l'industrie fonctionne en langue anglaise car notre plus gros client est les États-Unis et la langue anglaise domine dans toutes les autres provinces canadiennes… Bon, les tables CAMION et TRUCK_PARTIAL peuvent être réuni en une seule table finalement. Et ensuite utiliser le VIN du camion comme clé au lieu de camionimmat comme nous avons discuter.

    Je n'ai pas encore changé la clé camionimmat pour utiliser le VIN du camion car pour l'instant c'est secondaire et je le ferai plus tard… Je n'ai donc rien changé dans ce que vous avez développé pour ne pas mêler les choses à part quelques ajouts de colonnes dans vos tables. Je suis encore en période de développement de la base de donnée et non en période d'adaptation pour l'utilisateur finale… Je veux que plus tard que ce soit facile d'y ajouter d'autres tables sans tout recommencer… Donc, on peut mettre des tables à volonté pour que ce soit le plus modulaire possible. Il n'y a pas de problème côté performance dans ce cas précis car il y aura toujours qu'un nombre limité de camions et un nombre très limité d'utilisateurs, donc très peu de requêtes en parallèle...

    Pièce jointe 411766
      0  0

  11. #51
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Salve ordigil,


    Citation Envoyé par ordigil Voir le message
    je choisis un camion dans la table Camion, de cette table je vais à la table Maintenance.
    Je préfère continuer sur la lancée de la modélisation faite au cours de la discussion, donc compléter en faisant abstraction de cette table Maintenance (et autres que je ne connais pas), de toute façon illisible pour moi à l’écran, tant c’est écrit petit...

    De ce que je comprends, il faut que l’on puisse suivre les changements d’huile pour chaque moteur, et savoir quel camion était équipé de ce moteur à ce moment-là.

    C’est bien cela ?

    Supposons que oui...

    On définit un table HUILE_CHANGEMENT permettant de connaître les dates successives de changement d’huile pour les moteurs. Si on a besoin de se souvenir de la marque de l’huile nouvelle, on définit une table HUILE_MARQUE :




    Bien noter que la clé primaire de la table HUILE_CHANGEMENT est la paire {ComposantId, HuileDateChangement}.

    Table HUILE_MARQUE : présence d’une clé alternative à usage de l’utilisateur : {HuileMarqueCode}.


    Déclaration des tables :

    CREATE TABLE HUILE_MARQUE
    (
            HuileMarqueId                   INT  IDENTITY   NOT NULL
          , HuileMarqueCode                 CHAR(8)         NOT NULL
          , HuileMarqueNom                  VARCHAR(48)     NOT NULL
        , CONSTRAINT HUILE_MARQUE_PK PRIMARY KEY (HuileMarqueId)
        , CONSTRAINT HUILE_MARQUE_AK UNIQUE (HuileMarqueCode)
    ) ;
    
    CREATE TABLE HUILE_CHANGEMENT
    (
            ComposantId                     INT             NOT NULL
          , HuileDateChangement             DATE            NOT NULL
          , HuileMarqueId                   INT             NOT NULL
        , CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
        , CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
              REFERENCES MOTEUR (ComposantId)
        , CONSTRAINT HUILE_MOTEU_HUILE_MARQUE_FK FOREIGN KEY (HuileMarqueId)
              REFERENCES HUILE_MARQUE (HuileMarqueId)
    ) ;
    
    De mon côté, le diagramme complété est le suivant :



    Créer des marques d’huile :

    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000001', 'Marque 1, de chez fsmrel, c’est dire !') ;
    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000002', 'Marque 2, excellente aussi pour la salade') ;
    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000003', 'Marque 3, "La bizarre"') ;
    
    SELECT '' as HUILE_MARQUE, * FROM HUILE_MARQUE ;
    
    Changements d’huile pour un moteur :

    Le 2015-09-01, puis le 2017-09-17, le moteur de numéro de série 's01' change d’huile (et de marque d’huile), même chose le 2012-11-05 pour le moteur 's02' :

    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2015-09-01'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's01'
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000003'), '2012-11-05'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's02'
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2017-09-17'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's01'  
    ;
    
    Pour faciliter la vue qu’a l’utilisateur des choses (noter le WHERE !) :

     CREATE VIEW CAMION_HUILE_V (CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom)
     AS
     SELECT CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom 
     FROM   CAMION AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId  = y.LocalisationId
                        JOIN HUILE_CHANGEMENT AS z ON y.ComposantId = z.ComposantId
                        JOIN MOTEUR AS w ON z.ComposantId = w.ComposantId
                        JOIN HUILE_MARQUE AS t ON z.HuileMarqueId = t.HuileMarqueId
    WHERE  HuileDateChangement >= ComposantInstallationDate AND HuileDateChangement <= ComposantDesInstallationDate 
    ;
    
    Regardons :

    SELECT * FROM CAMION_HUILE_V
    ;
    
    =>

    CamionImmat    MoteurNumeroSerie    HuileDateChangement    HuileMarqueNom
    immat01        s01                  2015-09-01             Marque 1, de chez fsmrel, c’est dire !
    immat01        s02                  2012-11-05             Marque 3, "La bizarre"
    immat03        s01                  2017-09-17             Marque 1, de chez fsmrel, c’est dire !
    
    Le camion de « VIN » 'immat01' a changé de moteur : précédent = 's02', avec changement d’huile le 2012-11-05 ; suivant = 's01', avec changement d’huile le 2015-09-01.

    A vous de voir si nous sommes en phase...
    (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.
      2  0

  12. #52
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    hmmmm vous n'êtes pas très sage, il n'y a pas urgence. hehehe

    Ce qu'il faut, c'est :

    1- J'ai un Camion
    2- J'ai un Moteur

    Lorsque l'usagé fera la maintenance du Camion et qu'il fera le changement d'huile pour le Moteur, il dira comme tout le monde, "J'ai fais le changement d'huile du Camion" alors qu'en réalité il fera le changement d'huile du Moteur et non du Camion.

    Ce qu'il me faut :

    1- Conserver tous les changements d'huile effectué sur ce Camion. (Même si le changement d'huile concerne le Moteur et non le Camion)
    2- Conserver tous les changements d'huile effectué sur le Moteur.

    Il faut que:

    Si j'enlève ce Moteur du Camion pour le remplacer par un autre Moteur et que 2 ans plus tard l'usagé regarde les changements d'huile;

    1- Il faut que le Camion conserve la date et le kilométrage de tous les changements d'huile effectués sur ce Camion peut importe le Moteur
    2- Il faut que chaque Moteur conserve la date et le kilométrage de tous les changement d'huile qui on été effectué sur ce Moteur


    Donc j'ai :

    1- Un Camion "C1"
    2- Un Moteur "M1"
    3- Un Moteur "M2"
    4- Un Moteur "M3"

    Le 12 septembre 2010, j'installe dans le Camion"C1" le Moteur "M1"
    Le 12 septembre 2010, je fais un changement d'huile "C1M1"
    Le 15 décembre 2010, je fais un changement d'huile "C1M1"
    Le 11 mars 2011, je fais un changement d'huile "C1M1"
    Le 1 avril 2011, j'enlève du Camion "C1" le Moteur "M1"
    Le 1 avril 2011, j'installe dans le Camion "C1" le Moteur "M2"
    Le 1 avril 2011, je fais un changement d'huile "C1M2"
    Le 13 juillet 2011, je fais un changement d'huile "C1M2"
    Le 21 octobre 2011, je fais un changement d'huile "C1M2"
    Le 3 décembre 2011, j'enlève du Camion "C1" le Moteur "M2"
    Le 3 décembre 2011, j'installe dans le Camion "A" le Moteur "M3"
    Le 3 décembre 2011, je fais un changement d'huile "C1M3"
    Le 21 mars 2012, je fais un changement d'huile "C1M3"


    Le 31 mars 2012 je fais une recherche sur les Camions et sur les Moteurs

    Changements d'huile Camion C1 :

    Date------------------------------Kilométrage
    12 septembre 2010-------------80 000
    15 décembre 2010--------------120 000
    11 mars 2011--------------------161 234
    1 avril 2011----------------------165 122
    13 juillet 2011-------------------168 290
    21 octobre 2011----------------172 255
    3 décembre 2011---------------176 002
    21 mars 2012-------------------181 212


    Changements d'huile Moteur M1 :

    Date-----------------------------Kilométrage
    12 septembre 2010------------80 000
    15 décembre 2010-------------120 000
    11 mars 2011-------------------161 234


    Changements d'huile Moteur M2 :

    Date-----------------------------Kilométrage
    1 avril 2011---------------------165 122
    13 juillet 2011------------------168 290
    21 octobre 2011----------------172 255

    Changements d'huile Moteur M3 :

    Date-----------------------------Kilométrage
    3 décembre 2011--------------176 002
    21 mars 2012------------------181 212


    La marque d'huile n'est pas nécessaire puisqu'on utilise la même marque depuis 35 ans
    Ce sera la même chose pour tous les Camions, tous les Moteurs, toutes les Transmissions et tous les Différentiels. Lors des maintenances, il n'y aura pas seulement les changements d'huile d'effectuer, il y aura aussi le graissage des Camions, la vérification de la pression des Pneus, la vérification du jeu dans les roulements de roues (Bearing),
    la vérification du jeu dans la sellette d'attelage, la vérification des lumières, etc, etc, etc. C'est pour cette raison que je voulais une table "Maintenance" et aussi une table "Réparation" pour tout regrouper à partir de ces deux tables. Ce n'est pas une exigence mais une suggestion pour me simplifier la programmation de l'interface WEB. Mais on fait comme vous penser le mieux adapté pour la base de données…

    À noter que Différentiel Longitudinal et Différentiel Transversal n'ont aucune utilité dans la base de donnée et non utilisé dans le jargon des Camions. Un différentiel est un différentiel point hahaha

    Ce sont des Différentiels de Camions. Dites-moi où voyez-vous un différentiel longitudinal et un différentiel transversal ?


    Pièce jointe 412061Pièce jointe 412065Pièce jointe 412066


    Encore merci pour ce cours de base de données fsmrel, merci de tout détailler et d'expliquer comme vous le faites. Vous pouvez essayer de vous brancher à ma base de données pour voir le schéma et les tables, en fait vous devriez avoir toutes les autorisations pour ajouter des tables et des scripts. Ça me permettrais de savoir si je pourrai l'administrer à distance lorsque le tout sera installé sur le serveur de production dont je n'aurai pas d'accès physique… Aucune gène, si ça plante, je reformate le Laptop car il sert uniquement pour le développement de cette base de données et pour le développement de l'interface WEB.


    Citation Envoyé par fsmrel Voir le message
    Salve ordigil,



    Je préfère continuer sur la lancée de la modélisation faite au cours de la discussion, donc compléter en faisant abstraction de cette table Maintenance (et autres que je ne connais pas), de toute façon illisible pour moi à l’écran, tant c’est écrit petit...

    De ce que je comprends, il faut que l’on puisse suivre les changements d’huile pour chaque moteur, et savoir quel camion était équipé de ce moteur à ce moment-là.

    C’est bien cela ?

    Supposons que oui...

    On définit un table HUILE_CHANGEMENT permettant de connaître les dates successives de changement d’huile pour les moteurs. Si on a besoin de se souvenir de la marque de l’huile nouvelle, on définit une table HUILE_MARQUE :




    Bien noter que la clé primaire de la table HUILE_CHANGEMENT est la paire {ComposantId, HuileDateChangement}.

    Table HUILE_MARQUE : présence d’une clé alternative à usage de l’utilisateur : {HuileMarqueCode}.


    Déclaration des tables :

    CREATE TABLE HUILE_MARQUE
    (
            HuileMarqueId                   INT  IDENTITY   NOT NULL
          , HuileMarqueCode                 CHAR(8)         NOT NULL
          , HuileMarqueNom                  VARCHAR(48)     NOT NULL
        , CONSTRAINT HUILE_MARQUE_PK PRIMARY KEY (HuileMarqueId)
        , CONSTRAINT HUILE_MARQUE_AK UNIQUE (HuileMarqueCode)
    ) ;
    
    CREATE TABLE HUILE_CHANGEMENT
    (
            ComposantId                     INT             NOT NULL
          , HuileDateChangement             DATE            NOT NULL
          , HuileMarqueId                   INT             NOT NULL
        , CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
        , CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
              REFERENCES MOTEUR (ComposantId)
        , CONSTRAINT HUILE_MOTEU_HUILE_MARQUE_FK FOREIGN KEY (HuileMarqueId)
              REFERENCES HUILE_MARQUE (HuileMarqueId)
    ) ;
    
    De mon côté, le diagramme complété est le suivant :



    Créer des marques d’huile :

    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000001', 'Marque 1, de chez fsmrel, c’est dire !') ;
    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000002', 'Marque 2, excellente aussi pour la salade') ;
    INSERT INTO HUILE_MARQUE (HuileMarqueCode, HuileMarqueNom) VALUES ('H0000003', 'Marque 3, "La bizarre"') ;
    
    SELECT '' as HUILE_MARQUE, * FROM HUILE_MARQUE ;
    
    Changements d’huile pour un moteur :

    Le 2015-09-01, puis le 2017-09-17, le moteur de numéro de série 's01' change d’huile (et de marque d’huile), même chose le 2012-11-05 pour le moteur 's02' :

    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2015-09-01'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's01'
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000003'), '2012-11-05'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's02'
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileMarqueId, HuileDateChangement)
        SELECT ComposantId, (SELECT HuileMarqueId FROM HUILE_MARQUE WHERE HuileMarqueCode = 'H0000001'), '2017-09-17'
        FROM   MOTEUR 
        WHERE  MoteurNumeroSerie = 's01'  
    ;
    
    Pour faciliter la vue qu’a l’utilisateur des choses (noter le WHERE !) :

     CREATE VIEW CAMION_HUILE_V (CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom)
     AS
     SELECT CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileMarqueNom 
     FROM   CAMION AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId  = y.LocalisationId
                        JOIN HUILE_CHANGEMENT AS z ON y.ComposantId = z.ComposantId
                        JOIN MOTEUR AS w ON z.ComposantId = w.ComposantId
                        JOIN HUILE_MARQUE AS t ON z.HuileMarqueId = t.HuileMarqueId
    WHERE  HuileDateChangement >= ComposantInstallationDate AND HuileDateChangement <= ComposantDesInstallationDate 
    ;
    
    Regardons :

    SELECT * FROM CAMION_HUILE_V
    ;
    
    =>

    CamionImmat    MoteurNumeroSerie    HuileDateChangement    HuileMarqueNom
    immat01        s01                  2015-09-01             Marque 1, de chez fsmrel, c’est dire !
    immat01        s02                  2012-11-05             Marque 3, "La bizarre"
    immat03        s01                  2017-09-17             Marque 1, de chez fsmrel, c’est dire !
    
    Le camion de « VIN » 'immat01' a changé de moteur : précédent = 's02', avec changement d’huile le 2012-11-05 ; suivant = 's01', avec changement d’huile le 2015-09-01.

    A vous de voir si nous sommes en phase...
      0  0

  13. #53
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,


    Citation Envoyé par ordigil Voir le message
    Donc j'ai :

    1- Un Camion "C1"
    2- Un Moteur "M1"
    3- Un Moteur "M2"
    4- Un Moteur "M3"

    Le 12 septembre 2010, j'installe dans le Camion"C1" le Moteur "M1"
    Le 12 septembre 2010, je fais un changement d'huile "C1M1"
    Le 15 décembre 2010, je fais un changement d'huile "C1M1"
    Le 11 mars 2011, je fais un changement d'huile "C1M1"
    Le 1 avril 2011, j'enlève du Camion "C1" le Moteur "M1"
    Le 1 avril 2011, j'installe dans le Camion "C1" le Moteur "M2"
    Le 1 avril 2011, je fais un changement d'huile "C1M2"
    Le 13 juillet 2011, je fais un changement d'huile "C1M2"
    Le 21 octobre 2011, je fais un changement d'huile "C1M2"
    Le 3 décembre 2011, j'enlève du Camion "C1" le Moteur "M2"
    Le 3 décembre 2011, j'installe dans le Camion "A" le Moteur "M3"
    Le 3 décembre 2011, je fais un changement d'huile "C1M3"
    Le 21 mars 2012, je fais un changement d'huile "C1M3"

    Pour cette partie, la modélisation et le code que j’ai proposés précédemment répondent au besoin. Par contre, dans mon modèle, le kilométrage n’a pas été pris en compte : d’après vos exemples, c’est à l’occasion du changement d’huile qu’on le relève. Je vais faire comme s’il en était bien ainsi, et j’ajoute donc une colonne HuileKm dans l’en-tête de la table HUILE_CHANGEMENT (et je supprime au passage la table HUILE_MARQUE devenue sans emploi) :

    =>

    CREATE TABLE HUILE_CHANGEMENT
    (
            ComposantId                     INT             NOT NULL
          , HuileDateChangement             DATE            NOT NULL
          , HuileKm                         INT             NOT NULL
        , CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
        , CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
              REFERENCES MOTEUR (ComposantId)
    ) ;
    
    La déclaration de la vue CAMION_HUILE_V (cf. mon message précédent) devient :

     
     CREATE VIEW CAMION_HUILE_V (CamionImmat, MoteurNumeroSerie, HuileDateChangement, Kilométrage)
     AS
     SELECT CamionImmat, MoteurNumeroSerie, HuileDateChangement, HuileKm 
     FROM   CAMION AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId  = y.LocalisationId
                        JOIN HUILE_CHANGEMENT AS z ON y.ComposantId = z.ComposantId
                        JOIN MOTEUR AS w ON z.ComposantId = w.ComposantId
      WHERE  HuileDateChangement >= ComposantInstallationDate AND HuileDateChangement <= ComposantDesInstallationDate
    ;
    
    A noter :

    Dans mes exemples, j’ai (provisoirement) remplacé la date de désinstallation d’un moteur par le jour précédent cette opération, car il faudra que je vérifie que le trigger de contrôle autorise l’installation le même jour sur un autre camion et que je modifie au besoin ce trigger.

    Pour la désinstallation, je demande la date d’installation, car un camion, disons C1 peut être présent plusieurs fois dans la table COMPOSANT_AFFECTATION avec je suppose remontage possible du même moteur : C1 équipé de M1 à la date D1, de M2 à la date D2, à nouveau de M1 à la date D3, etc.

    Les affectations successives pour le camion C1 :

    -----------------------------------------------------------
    -- installation du moteur M1 sur le camion C1
    ----------------------------------------------------------
    
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2010-09-12', '9999-12-31'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'C1')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M1'
    ;
    ---------------------------------------------------------
    -- désinstallation du moteur M1 du camion C1
    ---------------------------------------------------------
    UPDATE COMPOSANT_AFFECTATION
        SET ComposantDesInstallationDate = '2011-03-31'
        WHERE LocalisationId = (SELECT localisationId FROM CAMION WHERE CamionImmat = 'C1')
    	AND ComposantInstallationDate = '2010-09-12'   
    ;
    -----------------------------------------------------------
    -- installation du moteur M2 sur le camion C1
    ----------------------------------------------------------
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2011-04-01', '9999-12-31'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'C1')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M2'
    ;
    
    ---------------------------------------------------------
    -- désinstallation du moteur M2 du camion C1
    ---------------------------------------------------------
    UPDATE COMPOSANT_AFFECTATION
        SET ComposantDesInstallationDate = '2011-12-02'
        WHERE LocalisationId = (SELECT localisationId FROM CAMION WHERE CamionImmat = 'C1')
    	AND ComposantInstallationDate = '2011-04-01'   
    ;
    -----------------------------------------------------------
    -- installation du moteur M3 sur le camion C1
    ----------------------------------------------------------
    INSERT INTO COMPOSANT_AFFECTATION (ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId) 
        SELECT ComposantId, '2011-12-03', '9999-12-31'
            , (SELECT LocalisationId 
               FROM CAMION WHERE CamionImmat = 'C1')
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M3'
    ;
    
    Pour voir les affectations :

    SELECT CamionImmat AS Camion, MoteurNumeroSerie AS Moteur, ComposantInstallationDate AS Installation, ComposantDesInstallationDate AS Désintallation
    FROM   MOTEUR AS x JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId
                       JOIN COMPOSANT_AFFECTATION AS z ON y.ComposantId = z.ComposantId
                       JOIN CAMION AS t ON z.LocalisationId = t.LocalisationId
    ;
    
    C1 est bien là, avec ses affectations successives :

    Camion      Moteur    Installation    Désintallation
    
    C1          M1        2010-09-12      2011-03-31
    C1          M2        2011-04-01      2011-12-02
    C1          M3        2011-12-03      9999-12-31
    
    Quant aux changements d’huile, les inserts :

    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2010-09-12', 80000
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M1'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2010-12-15', 120000
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M1'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2011-03-11', 161234
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M1'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2011-04-01', 165122
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M2'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2011-07-13', 168290
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M2'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2011-10-21', 172255
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M2'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2011-12-03', 176002
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M3'  
    ;
    INSERT INTO HUILE_CHANGEMENT (ComposantId, HuileDateChangement, HuileKm)
        SELECT ComposantId, '2012-03-21', 181212
        FROM   MOTEUR
        WHERE  MoteurNumeroSerie = 'M3'  
    ;
    
    Un coup d’œil en utilisant la vue CAMION_HUILE_V (cf. ci-dessus) :

    SELECT CamionImmat AS Camion, MoteurNumeroSerie AS Moteur,  HuileDateChangement, Kilométrage
    FROM   CAMION_HUILE_V  
    ORDER BY CamionImmat, HuileDateChangement ;   
    
    =>

    Camion    Moteur    HuileDateChangement    Kilométrage
    
    C1        M1        2010-09-12             80000
    C1        M1        2010-12-15             120000
    C1        M1        2011-03-11             161234
    C1        M2        2011-04-01             165122
    C1        M2        2011-07-13             168290
    C1        M2        2011-10-21             172255
    C1        M3        2011-12-03             176002
    C1        M3        2012-03-21             181212
    

    Citation Envoyé par ordigil Voir le message
    La marque d'huile n'est pas nécessaire puisqu'on utilise la même marque depuis 35 ans
    Ce sera la même chose pour tous les Camions, tous les Moteurs, toutes les Transmissions et tous les Différentiels.
    Donc, comme je viens de le préciser, j’ai fait le ménage en éliminant la table HUILE_MARQUE. Cela dit, si le changement d’huile vaut aussi pour les transmissions et les différentiels, on peut brancher la table HUILE_CHANGEMENT non pas spécifiquement sur MOTEUR, mais directement sur COMPOSANT :


    Du point de vue SQL, il n’y a qu’une référence à changer dans l’instruction CREATE TABLE HUILE_CHANGEMENT et c’est tout (REFERENCES COMPOSANT remplace REFERENCES MOTEUR) :

    CREATE TABLE HUILE_CHANGEMENT
    (
            ComposantId                     INT             NOT NULL
          , HuileDateChangement             DATE            NOT NULL
          , HuileKm                         INT             NOT NULL
        , CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
        , CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
              REFERENCES COMPOSANT (ComposantId)
    ) ;
    

    Comme le changement d’huile n’est manifestement qu’une opération parmi d’autres (graissage, vérification des pneus, etc.), on pourra voir comment effectuer une généralisation des opérations portant sur les composants (ou les camions) c’est-à-dire aboutir au principe de la maintenance en général que vous évoquez, mais selon les règles de la modélisation.


    Citation Envoyé par ordigil Voir le message
    À noter que Différentiel Longitudinal et Différentiel Transversal n'ont aucune utilité dans la base de données
    Etant donné que je ne sais pas ce qu’est un différentiel, je reste silencieux à ce sujet . A noter que dans vos échanges avec Escartefigue, les adjectifs « longitudinal » et « transversal » ne concernent pas les différentiels mais, si j’ai bien lu, les transmissions.
    (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.
      1  0

  14. #54
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut fsmrel, vous êtes vraiment une personne généreuse et patiente.
    Bonsoir fsmrel,

    Merci et encore merci. Je ne vous ai pas dit mais il y a 3 semaines j'ai eu gros problèmes de santé et là mais je suis encore malade. J'ai pris trop de retard dans ce projet et même si je suis malade, je m'attendais de terminer aujourd'hui mais ça ne sera pas possible. Alors de votre côté, svp, il n'y a pas urgence pour répondre à mes questions, vous m'avez parlé de votre situation. Chose est certaine, je ne terminerez pas ce soir de toute façon. Au jour le jour donc ou de semaine en semaine

    Ici 4 Tables que je vais insérer dans la base de données. la Table Camion aura déjà une colonne Kilométrage ce qui est tout à fait logique. Mais lorsque j'ouvrirai le formulaire de Maintenance ou le formulaire de Repairs, il faudra que tous les Kilométrages et les dates qui concerne le Camion choisi et ses Composants se mettre à jour. Je ne sais pas comment établir les clés et les relations entre les tables.

    La table "Truck_Equipments" doit être reliée à la table Camion, elle contiendra les numéros de pièces utilisées pour chaque Camion, Moteurs, Transmission, Différentiel. J'entend par numéro de pièces seulement les plus communes genre numéro des lumières pour les phares, numéro des filtreurs, etc. Disons que pour CabFilterNumber1. Un Camion peut en avoir 1 ou 2. Disons le Camions "C1" en a 2, le Camion "C2" en a 2 et le Camion "C3" en a 1 . Le Camion "A" a filterCab1 numéro "ABC1" et filterCab2 "CDE3". Le Camion "B" a filterCab1 numéro "ABC1" et filterCab2 "FGH5" et le Camion "C3" a filterCab1 "PPZ123" Ça va bien pour les "filterCab" et "filterCoolant" car ça concerne les Camions. Comment vais-je faire pour à partir de cette même table "Truck_Equipments" pour les filtreurs qui concernent les Moteurs, Transmissions et Différentiels ???
    Donc un Camion peut avoir 1 ou 2 "Truck_Equipment" du même type genre FilterCab1 et FilterCab2 mais seulement 1 "filterCoolant"
    Un "Truck_Equipment" portant le même numéro peut se retrouver dans plusieurs Camions.
    Disons le Camion "A" aura seulement 1 FilterCab numéro "ABC1 mais les FiltersCab numéro "ABC1" peuvent se retrouver dans tous les Camions. C'est évident que le même FilterCab ne se retrouvera pas dans tous les Camions en même temps mais le même numéro de FiltersCab oui. Ce n'est pas pour tenir un inventaire de pièces mais uniquement pour savoir quel numéro de pièce j'ai besoin pour un Camion lorsque je vais chez le concessionnaire pour en acheter. Chez le concessionnaire, j'aurai simplement besoin de consulter la base de donnée avec mon iPhone qui sera accessible par internet.

    Suis-je exigeant ???

    Pour la table "Fuel_Consumption" comment la relier à la table "Camion" ? Quel numéro de clé choisir ? Est-ce que j'utilise LocalisationId à nouveau ou est-ce que j'utilise le VIN du camion ? Pour les 2 colonnes calculées, je vais utiliser PHP, il sait très bien faire ce genre de chose.

    Désolé fsmrel, je n'arrive pas à me concentrer Il n'est pas urgent de répondre non plus… Encore merci pour votre aide même en différé, je vais vraiment apprécier.


    Pièce jointe 412411
      0  0

  15. #55
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Tables
    Pour l'instant, j'ai ça ( Sans les corrections de langue et le immatt


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    CREATE TABLE LOCALISATION 
    (
            LocalisationId         INT  IDENTITY   NOT NULL
          , LocalisationNote       VARCHAR(64)     NOT NULL DEFAULT ''
        , CONSTRAINT LOCALISATION_PK PRIMARY KEY (LocalisationId)
    );
     
    CREATE TABLE CAMION 
    (
            CamionId              INT             NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
     
    CREATE TABLE LOCAL 
    (
            LocalisationId        INT             NOT NULL
          , LocalCode             CHAR(5)         NOT NULL
          , LocalNom              VARCHAR(48)     NOT NULL
        , CONSTRAINT LOCAL_PK PRIMARY KEY (LocalisationId)
        , CONSTRAINT LOCAL_AK UNIQUE (LocalCode)
        , CONSTRAINT LOCAL_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
     
    CREATE TABLE COMPOSANT_TYPE 
    (
            ComposantTypeId          INT  IDENTITY   NOT NULL
          , ComposantTypeLibelle     VARCHAR(24)     NOT NULL
          , ComposantQteMax          INT             NOT NULL
          , CONSTRAINT COMPOSANT_TYPE_PK PRIMARY KEY (ComposantTypeId)
    );
     
    CREATE TABLE COMPOSANT 
    (
            ComposantId              INT  IDENTITY   NOT NULL
          , ComposantTypeId          INT             NOT NULL
          , ComposantDateAchat       DATE            NOT NULL      
          , Fabriquant               VARCHAR(48)     NOT NULL
          , Modele                   VARCHAR(48)     NOT NULL
        , CONSTRAINT COMPOSANT_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT COMPOSANT_TYPE_FK FOREIGN KEY (ComposantTypeId) REFERENCES COMPOSANT_TYPE (ComposantTypeId)
    );
     
    CREATE TABLE MOTEUR 
    (
            ComposantId              INT             NOT NULL
          , MoteurNumeroSerie        VARCHAR(25)     NOT NULL
          , MaxHorsePower            INT             NOT NULL
        , CONSTRAINT MOTEUR_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT MOTEUR_AK UNIQUE (MoteurNumeroSerie)
        , CONSTRAINT MOTEUR_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
     
    CREATE TABLE TRANSMISSION 
    (
            ComposantId              INT             NOT NULL
          , TransmissionNumeroSerie  VARCHAR(25)     NOT NULL
          , TransmissionVitesses     INT             NOT NULL
        , CONSTRAINT TRANSMISSION_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT TRANSMISSION_AK UNIQUE (TransmissionNumeroSerie)
        , CONSTRAINT TRANSMISSION_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
     
    CREATE TABLE DIFFERENTIEL 
    (
            ComposantId              INT             NOT NULL
          , DifferentielNumeroSerie  VARCHAR(25)     NOT NULL
          , DifferentielRatio        INT             NOT NULL
        , CONSTRAINT DIFFERENTIEL_PK PRIMARY KEY (ComposantId)
        , CONSTRAINT DIFFERENTIEL_AK UNIQUE (DifferentielNumeroSerie)
        , CONSTRAINT DIFFERENTIEL_COMPOSANT_FK FOREIGN KEY (ComposantId) REFERENCES COMPOSANT (ComposantId)	
    );
     
    CREATE TABLE COMPOSANT_AFFECTATION 
    (
            ComposantId                     INT             NOT NULL
          , ComposantAffectationId          INT  IDENTITY   NOT NULL
          , ComposantInstallationDate       DATE            NOT NULL
          , ComposantDesInstallationDate    DATE            NOT NULL  DEFAULT '9999-12-31'
          , LocalisationId                  INT             NOT NULL
        , CONSTRAINT COMPOSANT_AFFECTATION_PK PRIMARY KEY (ComposantId, ComposantAffectationId)
        , CONSTRAINT COMPOSANT_AFFECTATION_COMPOSANT_FK FOREIGN KEY (ComposantId) 
                     REFERENCES  COMPOSANT (ComposantId)
        , CONSTRAINT COMPOSANT_AFFECTATION_MOTEUR_LOCALISATION_FK FOREIGN KEY (LocalisationId) 
                     REFERENCES  LOCALISATION (LocalisationId)
        , CONSTRAINT COMPOSANT_AFFECTATION_CHECK01 CHECK (ComposantDesInstallationDate > ComposantInstallationDate)
    );
     
    CREATE TABLE HUILE_CHANGEMENT
    (
            ComposantId                     INT             NOT NULL
          , HuileDateChangement             DATE            NOT NULL
          , HuileKm                         INT             NOT NULL
          , HuileGrade                      VARCHAR(5)      NOT NULL
        , CONSTRAINT HUILE_CHANGEMENT_PK PRIMARY KEY (ComposantId, HuileDateChangement)
        , CONSTRAINT HUILE_CHANGEMENT_FK FOREIGN KEY (ComposantId)
                     REFERENCES COMPOSANT (ComposantId)
    );
      0  0

  16. #56
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Triggers
    Et ça (Sans les correction de la langue) :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    GO
    CREATE TRIGGER COMPOSANT_RECOUVREMENT_TR ON COMPOSANT_AFFECTATION INSTEAD OF INSERT
    AS
    BEGIN
    SELECT  ''   
     FROM    INSERTED AS x JOIN COMPOSANT_AFFECTATION AS y ON x.ComposantId = y.ComposantId 
             AND (x.ComposantInstallationDate < y.ComposantInstallationDate  AND x.ComposantDesInstallationDate >= y.ComposantInstallationDate 
              OR  x.ComposantInstallationDate >= y.ComposantInstallationDate AND x.ComposantInstallationDate <= y.ComposantDesInstallationDate)
    ;
     IF @@Rowcount > 0
          BEGIN 
             SELECT 'Affectation de composant(s) : recouvrement de période !' AS Engueulade, * FROM INSERTED
    --         RAISERROR ('Affectation de composant(s) : recouvrement de période !',16,1)  -- state = 16 pour bloquer  
             RAISERROR ('Affectation de composant(s) : recouvrement de période !',0,1)  -- state = 0 pour les tests 
             RETURN
          END
    
    -- Un camion, au plus un moteur, une transmission, 2 différentiels. Les entrepôts ne sont pas concernés 
    
    DECLARE @Engueulade AS VARCHAR(64) ;
    DECLARE @N  AS INT ;
    DECLARE @T  AS VARCHAR(16) ;
    
    DECLARE @Temp TABLE
    (
            ComposantQteMax INT 
          , ComposantNom  VARCHAR(16)
    );
    
    INSERT INTO @Temp 
    SELECT ComposantQteMax, ComposantTypeLibelle  
     FROM    INSERTED AS x JOIN COMPOSANT_AFFECTATION AS y ON x.LocalisationId = y.LocalisationId 
                           JOIN CAMION AS z ON  x.LocalisationId = z.LocalisationId
                           JOIN COMPOSANT AS t ON y.ComposantId = t.ComposantId
                           JOIN COMPOSANT_TYPE AS u ON t.ComposantTypeId = u.ComposantTypeId
             AND (x.ComposantInstallationDate < y.ComposantInstallationDate  AND x.ComposantDesInstallationDate >= y.ComposantInstallationDate 
              OR  x.ComposantInstallationDate >= y.ComposantInstallationDate AND x.ComposantInstallationDate <= y.ComposantDesInstallationDate)
    ;
    
    SET @N = (select ComposantQteMax from @Temp) ;
    SET @T = (select ComposantNom from @Temp) ;
    
    -- SELECT '@N = ', @N, '@@Rowcount = ', @@Rowcount, '@T = ', @T  ;
    
    IF @@Rowcount >= @N
          BEGIN
    	     SET @Engueulade = 'Un camion, un seul composant (' + @T + ') à la fois !' ;   
             SELECT @Engueulade AS Engueulade, * FROM INSERTED
    --         RAISERROR (@Engueulade,16,1)  -- state = 16 pour bloquer 
             RAISERROR (@Engueulade,0,1)  -- state = 0 pour les tests
             RETURN
          END
    
    -- Tout va bien
    
     INSERT INTO COMPOSANT_AFFECTATION 
                 SELECT   ComposantId, ComposantInstallationDate, ComposantDesInstallationDate, LocalisationId 
                 FROM    INSERTED
    END
    GO
      0  0

  17. #57
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir ordigil,

    J’ai modifié le trigger COMPOSANT_RECOUVREMENT_TR pour que le même jour on puisse désinstaller un moteur d’un camion et en installer un autre.

    Dans la table CAMION, pour un meilleur confort dans l’écriture des requêtes SQL, j’ai remplacé LocalisationId par CamionId :

    CREATE TABLE CAMION 
    (
            CamionId              INT             NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    

    Citation Envoyé par ordigil Voir le message
    Pour l'instant, j'ai ça ( Sans les corrections de langue et le immatt
    C’est d’accord !


    Citation Envoyé par ordigil Voir le message
    Et ça
    C’est ok aussi, mais j’ai modifié le trigger pour que le même jour on puisse désinstaller un moteur d’un camion et en installer un autre.


    Pour éviter de modifier mes scripts, j’ai créé une base de données « Temp ». Si cela vous gêne, je la supprimerai.


    Passons à la consommation de gasoil (en jargon francilien dans le texte ).

    Je suppose que pour un camion on a au moins et au plus une ligne FUEL_CONSUMPTION et réciproquement (c’est-à-dire une bijection). C’est bien ça ? (Même question concernant MAINTENANCE, REPAIR, TRUCK_EQUIPMENT).

    Pouvez-vous me donner la signification précise de chaque colonne de la table FUEL_CONSUMPTION ?

    Pour ce qu’il en est des clés, sous le « capot », c’est-à-dire pour les jointures, et autres opérations relationnelles, c’est forcément l’attribut artificiel (non significatif, etc.), CamionId (ex LocalisationId) qui est utilisé. Pour le reste, la clé naturelle (le VIN du camion) est la seule qui soit connue de l’utilisateur (non seulement humain, mais aussi des services non connus de la base de données (PHP par exemple)).

    La clé naturelle est aussi utilisée dans les requêtes SQL pour les opérations de mise à jour. Exemple, dans l’hypothèse d’une bijection :

    INSERT INTO FUEL_CONSUMPTION (CamionId, LitersFuel, MileAgeKm, LitersPer100Km, AverageMPG)
        SELECT CamionId, 1000, 100000, 150, 0
        FROM   CAMION WHERE CamionImmat = 'C1' 
    ;
    INSERT INTO FUEL_CONSUMPTION (CamionId, LitersFuel, MileAgeKm, LitersPer100Km, AverageMPG)
        SELECT CamionId, 2000, 200000, 220, 0
        FROM   CAMION WHERE CamionImmat = 'C2' 
    ;
    

    Citation Envoyé par ordigil Voir le message
    Pour les 2 colonnes calculées, je vais utiliser PHP, il sait très bien faire ce genre de chose.
    Evitez d’utiliser tout langage, outil hors du SGBD quand celui-ci fait parfaitement les choses ! Nombreux sont ceux qui ont pleuré en voulant changer d’outil ou maintenir leurs programmes, mais s’en étaient rendus prisonniers…
    (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.
      1  0

  18. #58
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    J'avais déjà une table FUEL_CONSUMPTION de créée alors j'ai seulement fait un petit script pour la modifier. Donc puisque SQL Server gère très bien les colonnes calculées, j'ai laissé ce boulot à SQL Server et non à PHP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE dbo.FUEL_CONSUMPTION DROP COLUMN LitersPer100Km ;
    ALTER TABLE dbo.FUEL_CONSUMPTION DROP COLUMN AverageMPG ;  
    GO  
    ALTER TABLE dbo.FUEL_CONSUMPTION ADD LitersPer100Km AS (LitersFuel / MileageKm * 100) PERSISTED ;
    ALTER TABLE dbo.FUEL_CONSUMPTION ADD AverageMPG AS (282.42445  /  ((LitersFuel  /  MileageKm)  *  100)) PERSISTED ;

    Donc première Colonne => "LitersFuel" ==>Nombre de litres de Carburant consommé
    deuxième Colonne => "MileageKm" ==>*Distance parcouru en KM
    troisième Colonne => "LitersPer100Km ==> Colonne calculée pour le nombre de litres au 100 km
    quatrième Colonne => "AverageMPG ==> Colonne calculée auquel j'ai ajouté une constante pour avoir la
    consommation en miles par gallon impérial

    Alors en dehors de ces 4 colonnes, vous pouvez faire ce que vous voulez de cette table afin de la joindre à la table Camion.
    Donc cette table sera calculée au 2 semaines je pense lors du relevé de la compagnie pétrolière et les kilomètres parcourus seront fourni par la compagnie de transport…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ------------------------------------------------------------------------
    -- One Two One Two Testing                                        --
    -- Oui les Américaines boivent plus que les Européennes  --
    ------------------------------------------------------------------------
    
    -- Insert values into the table.
    INSERT INTO dbo.FUEL_CONSUMPTION (LitersFuel, MileageKM)
        VALUES ('50', '400'), ('81.75', '925'),  ('133.37', '1467.5') ;
    
    -- Display the rows in the table.
    SELECT LitersFuel, MileageKM, LitersPer100Km, AverageMPG
        FROM dbo.FUEL_CONSUMPTION ;
    
    --Must Add KEY and CONTRAINT in this Table to join with Camion table not Maintenance table
    Citation Envoyé par fsmrel Voir le message
    Bonsoir ordigil,

    J’ai modifié le trigger COMPOSANT_RECOUVREMENT_TR pour que le même jour on puisse désinstaller un moteur d’un camion et en installer un autre.

    Dans la table CAMION, pour un meilleur confort dans l’écriture des requêtes SQL, j’ai remplacé LocalisationId par CamionId :

    CREATE TABLE CAMION 
    (
            CamionId              INT             NOT NULL
          , CamionImmat           VARCHAR(16)     NOT NULL
          , CamionDateAchat       DATE            NOT NULL
        , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
        , CONSTRAINT CAMION_AK UNIQUE (CamionImmat)
        , CONSTRAINT CAMION_LOCALISATION_FK FOREIGN KEY (CamionId) 
                     REFERENCES  LOCALISATION (LocalisationId)
    );
    


    C’est d’accord !



    C’est ok aussi, mais j’ai modifié le trigger pour que le même jour on puisse désinstaller un moteur d’un camion et en installer un autre.


    Pour éviter de modifier mes scripts, j’ai créé une base de données « Temp ». Si cela vous gêne, je la supprimerai.


    Passons à la consommation de gasoil (en jargon francilien dans le texte ).

    Je suppose que pour un camion on a au moins et au plus une ligne FUEL_CONSUMPTION et réciproquement (c’est-à-dire une bijection). C’est bien ça ? (Même question concernant MAINTENANCE, REPAIR, TRUCK_EQUIPMENT).

    Pouvez-vous me donner la signification précise de chaque colonne de la table FUEL_CONSUMPTION ?

    Pour ce qu’il en est des clés, sous le « capot », c’est-à-dire pour les jointures, et autres opérations relationnelles, c’est forcément l’attribut artificiel (non significatif, etc.), CamionId (ex LocalisationId) qui est utilisé. Pour le reste, la clé naturelle (le VIN du camion) est la seule qui soit connue de l’utilisateur (non seulement humain, mais aussi des services non connus de la base de données (PHP par exemple)).

    La clé naturelle est aussi utilisée dans les requêtes SQL pour les opérations de mise à jour. Exemple, dans l’hypothèse d’une bijection :

    INSERT INTO FUEL_CONSUMPTION (CamionId, LitersFuel, MileAgeKm, LitersPer100Km, AverageMPG)
        SELECT CamionId, 1000, 100000, 150, 0
        FROM   CAMION WHERE CamionImmat = 'C1' 
    ;
    INSERT INTO FUEL_CONSUMPTION (CamionId, LitersFuel, MileAgeKm, LitersPer100Km, AverageMPG)
        SELECT CamionId, 2000, 200000, 220, 0
        FROM   CAMION WHERE CamionImmat = 'C2' 
    ;
    


    Evitez d’utiliser tout langage, outil hors du SGBD quand celui-ci fait parfaitement les choses ! Nombreux sont ceux qui ont pleuré en voulant changer d’outil ou maintenir leurs programmes, mais s’en étaient rendus prisonniers…
      0  0

  19. #59
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Maintenant ça me donne ça pour la table FUEL_CONSUMPTION
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    USE [DZINDZIO_TRUCKS_MANAGEMENT]
    GO
     
    /****** Object:  Table [dbo].[FUEL_CONSUMPTION]    Script Date: 2018-09-18 00:01:16 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [dbo].[FUEL_CONSUMPTION](
        [CamionId] [int] NOT NULL,
    	[LitersFuel] [float] NOT NULL,
    	[MileageKm] [float] NOT NULL,
    	[LitersPer100Km]  AS (([LitersFuel]/[MileageKm])*(100)) PERSISTED NOT NULL,
    	[AverageMPG]  AS ((282.42445)/(([LitersFuel]/[MileageKm])*(100))) PERSISTED NOT NULL,
     CONSTRAINT [FUEL_CONSUMPTION_PK] PRIMARY KEY CLUSTERED 
    (
    	[CamionId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[FUEL_CONSUMPTION]  WITH CHECK ADD  CONSTRAINT [FUEL_CONSUMPTION_CAMION_FK] FOREIGN KEY([CamionId])
    REFERENCES [dbo].[CAMION] ([CamionId])
    GO
     
    ALTER TABLE [dbo].[FUEL_CONSUMPTION] CHECK CONSTRAINT [FUEL_CONSUMPTION_CAMION_FK]
    GO




    J'essaie d'adapter ce que vous faites avec ce que je veux
    J'utilise toujours la base de données DZINDZIO_TRUCKS_MANAGEMENT pour ne pas brouiller les choses

    En passant, comment je fais pour que la mise en page soit préservée lorsque je poste sur le forum ???
      0  0

  20. #60
    Membre averti Avatar de ordigil
    Homme Profil pro
    Recherche et développement sur la protection de la vie privée.
    Inscrit en
    Juillet 2018
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherche et développement sur la protection de la vie privée.
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2018
    Messages : 695
    Points : 379
    Points
    379
    Par défaut Bonjour fsmrel
    Il n'y a pas de problème à créer autant de bases de données que vous avez besoin puisque vous travaillez sur un serveur de développement et non sur un serveur de production. hehehe.

    Il faut qu'à la fin que j'aie tous les bons scripts pour créer les tables et les triggers…

    Petite question, quelles sont les tables que je cacherai à l'utilisateur final dans l'interface web ?

    Ça va être un peu difficile à gérer pour la personne qui n'y connait rien en informatique.

    Scénario #1 : L'utilisateur achète un nouveau camion qui a déjà 1 Moteur, 1 Transmission et 2 Différentiels

    Quelles sont toutes les étapes par ordres numériques pour l'ajouter à la base de données ?

    1-
    2-
    3-
    4-
    5-
    etc.


    Il faut vraiment que je rende les tâches dans l'interface WEB le plus facile possible.


    Est-ce que je peux ajouter une relation entre la table HUILE_CHANGEMENT et la table MAINTENANCE avec la colonne MaintenanceDate servant de clé commune entre les deux tables ??? Je ne sais pas exactement comment développer la table MAINTENANCE et la table REPAIRS. Dans la table MAINTENANCE, je voudrais pouvoir choisir HUILE_CHANGEMENT disons associé avec MaintenanceType1, MaintenanceType2 pourrait être Graissage, etc... puisque les changements d'huile font partie de la Maintenance des Camions. Est-ce que les Tables CAMION/REPAIRS ET CAMIONS/MAINTENANCE sont des relations Plusieurs à Plusieurs puisque 1 Camion peut avoir plusieurs Maintenances et les Maintenances concernent plusieurs CAMIONS ??? " Je mets des clés et des relations entre les tables afin de pouvoir plus facilement développer le code de mon interface WEB, il faut cependant corriger le tout avant la version finale.
      0  0

Discussions similaires

  1. Ajout dans une table et relation avec d'autres
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 16h32
  2. Création table et relations
    Par ptitdragon_eric dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/09/2005, 14h37
  3. table de relation
    Par tanjonaravelson dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/06/2005, 19h20
  4. Table de relation et sélection via jointure
    Par 73672 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 09/11/2004, 10h33
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 16h16

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