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

SQLite Discussion :

Liste de Clés Primaires


Sujet :

SQLite

  1. #1
    Membre à l'essai
    Liste de Clés Primaires
    Bonjour,
    Hier j'ai posté une discussion sur une base de données pour un restaurant qui gère des commandes.
    J'ai une autre question qui me bloque et à laquelle je ne trouve aucune réponse sur Internet :
    Le restaurant dispose de 50 références qui ont tous un type : soit un hors-d'oeuvre, une salade, un plat principal, un accompagnement, un dessert, ou une boisson.
    Un client fait donc une commande composée d'1 à plusieurs références.
    J'ai donc ma table Commande avec :
    -Commande_ID
    -DateRec
    -HeureRec
    -PrixTotal
    Et la table Référence :
    -Ref_ID
    -Titre
    -Description
    -Type
    -PrixUnite

    J'aimerais créer une association Est_constitue_de qui contiendrait une liste de Ref_ID de sorte à pouvoir calculer PrixTotal en additionnant chaque PrixUnite des références dans la liste.
    Mais comment m'y prendre ?
    Merci d'avance

  2. #2
    Membre éclairé
    Bonjour,

    Sauf si tu veux modifier les prix de tes références sans que le prix de tes commandes ne soit impacté je ne ferai pas comme ceci.

    Je ferai :
    Une table commande avec identifiant, date et heure de réception.
    Une table référence (attention references est un mot réservé SQL et normalement on ne doit pas utiliser de caractères accentués dans les noms... je dirais Produits) avec identifiant, données de description et prix unitaire
    Une table Est_Constitue _de avec Référence de la commande, Référence du produit, Quantité car une commande (ce me semble) peut comporter plusieurs fois le même produit.

    Pour obtenir le prix par commande, je ferai alors une vue.
    Un peu comme ceci.
    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
    CREATE TABLE [Commandes] (
      [Commande_Id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
      [DateRec] DATE NOT NULL,
      [HeureRec] TIME NOT NULL);
    CREATE TABLE [Produits] (
      [Ref_Id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
      [Titre] TEXT NULL,
      [Description] TEXT NULL,
      [TypeRef] TEXT NOT NULL,
      [PrixUnite] NUMERIC NOT NULL);
    CREATE TABLE [Est_Constitue_De] (
      [Commande_Id] INTEGER NOT NULL references commandes(commande_id),
      [Ref_Id] INTEGER NOT NULL references Produits(Ref_Id),
      [Quantite] INTEGER NOT NULL,
     PRIMARY KEY ([Commande_Id], [Ref_Id]));
    CREATE VIEW [PrixParCommande] AS
      select c.commande_id, c.daterec, c.heurerec,
             sum(e.quantite * r.Prixunite) as Prix_Total
      from commandes c
           join est_constitue_de e on c.commande_id = e.commande_id
           join Produits r on r.ref_id = e.ref_id
      group by c.commande_id, c.daterec, c.heurerec;

  3. #3
    Modérateur

    Tu as déjà presque tout dit dans ta description

    La table d’association comportera les colonnes suivantes :

    Commande_ID qui fait référence à Commande.Commande_ID (contrainte d'intégrité référentielle)
    Ref_ID qui fait référence à Reference.Ref_ID (contrainte d'intégrité référentielle)
    Quantite si éventuellement on peut prendre plusieurs fois la même référence dans une commande

    La clé primaire de cette table sera composée des deux colonnes Commande_Id et Ref_Id
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Membre à l'essai
    Merci pour vos réponses. Mon problème est réglé.
    J'aurais cependant une 2ème question :
    Le restaurant a 5 livreurs, donc une commande est attribuée à l'un des 5. J'ai donc crée une association Doit_livrer avec comme clés primaires Commande_ID de Commande & Livreur_ID de Livreur.
    Or une clé primaire est unique, et comme le Livreur_ID des livreurs apparaît plusieurs fois dans la table car il y a 200 commandes pour 5 livreurs, cela ne fonctionne pas.
    Devrais-je garder seulement Commande_ID en clé primaire & pas Livreur_ID ? Je ne sais pas si avoir Livreur_ID en clé primaire est important ?

  5. #5
    Membre éclairé
    Bonjour,

    Citation Envoyé par DienF Voir le message

    Le restaurant a 5 livreurs, donc une commande est attribuée à l'un des 5. J'ai donc crée une association Doit_livrer avec comme clés primaires Commande_ID de Commande & Livreur_ID de Livreur.
    Or une clé primaire est unique, et comme le Livreur_ID des livreurs apparaît plusieurs fois dans la table car il y a 200 commandes pour 5 livreurs, cela ne fonctionne pas.
    Devrais-je garder seulement Commande_ID en clé primaire & pas Livreur_ID ? Je ne sais pas si avoir Livreur_ID en clé primaire est important ?
    Non ta clé primaire doit être Commande_Id + Livreur_Id . (la clé primaire doit être unique dans l'ensemble des lignes de ta base de données mais peut porter sur plusieurs colonnes) comme pour l'autre association (est constitue_de)

    Cordialement

  6. #6
    Modérateur

    S'il y a un seul livreur par commande, la clé primaire doit être Commande_Id.
    Le livreur est un attribut de la commande et devrait même être identifié directement dans la table Commande.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Membre à l'essai
    Très bien merci à vous.

###raw>template_hook.ano_emploi###