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

 Firebird Discussion :

Quelle clé primaire choisir?


Sujet :

Firebird

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut Quelle clé primaire choisir?
    Bonjour à tous,
    Je suis en train de modéliser une base de données et je me pose (soudainement) une question existentielle:

    Prenons l'exemple d'un commande et de lignes de commandes associées.

    Je souhaitais associer une clé primaire 'id' (générée par un générateur à chacune de ces tables) et lier les deux tables par une clé étrangère placée dans la tables lignes et comportant l'id de la commande associée.

    commandes (id)
    lignes(id, id_commande)

    Or je me demande si pour des raisons de performance il ne faudrait pas que je reprenne tout et que je crée une clé primaire double dans la table ligne composée de l'id de la commande + le numéro de la ligne. Auquel cas je ne fonctionne plus qu'avec un seul générateur. qu'en pensez-vous?

    commandes (id)
    lignes(id_commande, num_ligne)


    Merci de vos conseils.
    Michael

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par MickSou Voir le message
    Prenons l'exemple d'un commande et de lignes de commandes associées.

    Je souhaitais associer une clé primaire 'id' (générée par un générateur à chacune de ces tables) et lier les deux tables par une clé étrangère placée dans la tables lignes et comportant l'id de la commande associée.

    commandes (id)
    lignes(id, id_commande)
    Cette modélisation là me va...
    Une clé primaire, une clé étrangère, chacune étant la plus compacte possible.
    Rappelez vous qu'un SGBDR génère un index derrière chaque clé, et que tout index a un cout (stockage, parcours).
    Citation Envoyé par MickSou Voir le message
    Or je me demande si pour des raisons de performance il ne faudrait pas que je reprenne tout et que je crée une clé primaire double dans la table ligne composée de l'id de la commande + le numéro de la ligne. Auquel cas je ne fonctionne plus qu'avec un seul générateur. qu'en pensez-vous?

    commandes (id)
    lignes(id_commande, num_ligne)
    En quoi cela va être plus performant ?
    En rien, si j'en crois ce que j'ai dit précédemment. En outre, vous devrez gérer num_ligne vous même, donc rajouter quelque part du code pour contrôler et mettre à jour cette information (dans des déclencheurs, dans des traitements d'exceptions ou autres).
    Par contre, vous pouvez toujours générer à la volée un num_ligne pour les éditions ou autres affichages...

    Un peu de lecture pour finir sur le sujet des clés.
    Philippe.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Réponse de Normand :
    Contrairement a Philippe je suis plus dubitatif , d'un pur point de vue modélisation effectivement je penche sur la première . D'un point de vue pratique par contre je penche sur la deuxième .



    En fait , dans ma BDD cas j'ai plusieurs 'Carnet de commandes',répartis en Saisons (hé oui , même pas par année , vive la mode ) j'ai donc utilisé la technique citée de SQLPro (la table de Clés) pour les entêtes de Commandes
    et pour les lignes la deuxième solution , un numéro de ligne (tant pis s'il y a des trous ) une commande n'étant saisie que par un seul intervenant)
    Cependant pour des raisons de maintenance , j'ai quand même gardé mon générateur pour chacune de mes tables (en index secondaire plutôt que primaire) "Ceinture et bretelles" dira t'on a quoi je répondrai maintenance prévisible .

    Citation Envoyé par Ph.B.
    Une clé primaire, une clé étrangère, chacune étant la plus compacte possible.
    Rappelez vous qu'un SGBDR génère un index derrière chaque clé, et que tout index a un cout (stockage, parcours).
    Si au "siècle" dernier l'on était fort économe , ce temps semble (a mon grand dam) fortement révolu . De toute façon , ne serait-ce que pour optimiser les requêtes des clés "secondaires" seront certainement utiles .

    -l'utilisateur recherchera la commande 2013H-156 pas la numéro (id) 71521445

    pour ce qui est du N° de Ligne , en avoir un permet d'être sur que la commande sortira dans l'ordre voulu par l'utilisateur . Bien que j'ai toujours refusé la possibilité de changer l'ordre des lignes une fois saisie a mes utilisateurs , elle reste possible (peu demandée, mais reviens au fil du temps)
    cette possibilité serait bloquée dans le cas d'une id auto-générée a la volée
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    En fait , dans ma BDD cas j'ai plusieurs 'Carnet de commandes',répartis en Saisons (hé oui , même pas par année , vive la mode ) j'ai donc utilisé la technique citée de SQLPro (la table de Clés) pour les entêtes de Commandes
    et pour les lignes la deuxième solution , un numéro de ligne (tant pis s'il y a des trous ) une commande n'étant saisie que par un seul intervenant)
    Cependant pour des raisons de maintenance , j'ai quand même gardé mon générateur pour chacune de mes tables (en index secondaire plutôt que primaire) "Ceinture et bretelles" dira t'on a quoi je répondrai maintenance prévisible .
    On peut avoir une colonne n° de ligne avec ce que je préconise, dans la table ou générée à la volée (cf. ci-après).

    "Ceinture et bretelles" (qui sous-entend que la base peut être dans un état incohérent ?), par suite d'une conception de la base approximative ou une "podo-programmation" de l'application ?
    Citation Envoyé par SergioMaster Voir le message
    Si au "siècle" dernier l'on était fort économe , ce temps semble (a mon grand dam) fortement révolu .
    Je suis d'accord, mais ainsi, on voit mis en œuvre des clés primaires composées, à base de char, qui doivent se retrouver ultérieurement dans des clés étrangères, etc, etc.
    Citation Envoyé par SergioMaster Voir le message
    De toute façon , ne serait-ce que pour optimiser les requêtes des clés "secondaires" seront certainement utiles .

    -l'utilisateur recherchera la commande 2013H-156 pas la numéro (id) 71521445
    Ma clé primaire n'empêche pas d'avoir une colonne comme décrite pour laquelle on aura une contrainte d'unicité, et un index associé, car c'est l'index qui va permettre d'optimiser le temps de réponse de la requête (le terme clé secondaire me parait inapproprié)...
    (je sais, j'intégrise, mais bon... )

    Citation Envoyé par SergioMaster Voir le message
    pour ce qui est du N° de Ligne , en avoir un permet d'être sur que la commande sortira dans l'ordre voulu par l'utilisateur . Bien que j'ai toujours refusé la possibilité de changer l'ordre des lignes une fois saisie a mes utilisateurs , elle reste possible (peu demandée, mais reviens au fil du temps)
    cette possibilité serait bloquée dans le cas d'une id auto-générée a la volée
    Non, si cet ordre dépend de l'utilisateur, elle peut être placée dans un ensemble de données via une colonne dédiée initialement auto générée mais modifiable ultérieurement par l'utilisateur.
    Philippe.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    "Ceinture et bretelles" (qui sous-entend que la base peut être dans un état incohérent ?), par suite d'une conception de la base approximative ou une "podo-programmation" de l'application ?
    non , j'ai juste eu affaire a un processeur en sur-chauffe , provoquant des pannes totalement aléatoires , depuis j'essaie de prévoir

    Pour le reste , en fait , on dit pratiquement la même chose !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    Merci pour vos avis et conseils.
    je suis effectivement habitué à n'utiliser qu'un id autogénéré et ajouter les colonnes plus significatives après (N° de commande, N° de réceptions, etc...)
    Le doute m'est apparu en essayant de modéliser avec MySQLWorkbench (une bas de donnée firebird oui oui ;-) et que lorsque je voulais insérer des "Identifying Relationships"entre deux tables (excusez moi mais je ne trouve pas le terme en français) il insérait forcément la clé primaire de la table maitre pour l'insérer en tant que clé primaire de la tables dépendante.

    Ma technique de clé basé sur une identifiant unique autogénéré m'oblige donc à ne créer (selon MySQL Workbench) à ne créer que des relations "non-identifying" ce qui d'un pint de vue dus ens n'est pas pertinent. D'un point de vue logique je coriq qu'une ligne de commande est forcément reliée à une commande et n'a pas d'existence en dehors de cette commande).

    Encore un avis?
    Merci ;-)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Bonjour

    Oui encore un avis.
    Un jour ou l'autre on se retrouve en web (où l'on passe des paramètres pour trouver ce que l'on cherche) et là on remercie celui qui a choisi un identifiant unique et non une clé composée !

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Citation Envoyé par MickSou Voir le message
    Or je me demande si pour des raisons de performance il ne faudrait pas que je reprenne tout et que je crée une clé primaire double dans la table ligne composée de l'id de la commande + le numéro de la ligne. Auquel cas je ne fonctionne plus qu'avec un seul générateur. qu'en pensez-vous?
    Perso, je pense que la première approche n'est pas mal, elle vaut bien la seconde. Pour ce qui des générateurs, sachant qu'avec FB on a droit à des entiers 64 bits, rien ne t'interdit d'utiliser un seul générateur pour toutes tes tables sauf si la clé doit être nécessairement séquentielle pour une table donnée.

    Utiliser un seul générateur est logique dans le sens où on obtient un identifiant universel dans la base de données indépendant de l'objet représenté. C'est un choix de conception qui peut amener des simplifications dans le code de l'application, en écrivant du code générique pour tous les objets de ta base. Tu peux aussi créer des tables de service (par exemple une table de journal) qui font référence à la clé universelle sans risques de violation de clé.

    L'identifiant universel est abstrait et n'a aucun sens pour l'utilisateur pour lequel on peut créer des clés "fonctionnelles". Cette approche simplifie la base et réduit les efforts de maintenance, en effet, si la clé fonctionnelle varie (les utilisateurs ont parfois des idées "géniales"), l'impact sur tes données sera moindre (clé primaire universelle préservée, intégrité référentielle non remise en question...).

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par e-ric Voir le message
    ...rien ne t'interdit d'utiliser un seul générateur pour toutes tes tables sauf si la clé doit être nécessairement séquentielle pour une table donnée.
    En effet, rien ou presque....

    L'oubli systématique du développeur qu'il n'est pas tout seul au monde à utiliser le SGBDR... Quand vous aurez 1000 utilisateurs qui vont simultanément insérer dans des tables, bonjour la contention, les temps d'attente, voir les deadlock !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Débat : quelle distribution Linux choisir pour débuter ?
    Par Anonymous dans le forum Distributions
    Réponses: 227
    Dernier message: 18/02/2015, 10h09
  2. quelle clé primaire choisir
    Par saou85 dans le forum Modélisation
    Réponses: 7
    Dernier message: 13/09/2010, 04h28
  3. Quelle classe graphique choisir ?
    Par King_T dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/05/2006, 17h33
  4. Quelle carte graphique choisir
    Par VEILLE_Julien dans le forum Matériel
    Réponses: 6
    Dernier message: 12/05/2006, 17h20
  5. [Windows][Php] Quelle SGDB libre choisir ?
    Par wolfjeremy dans le forum Décisions SGBD
    Réponses: 14
    Dernier message: 12/01/2006, 15h20

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