IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Au Pied Levé - À Main Levée

I-2.2.1. Règles de nommage

Noter ce billet
par , 01/04/2020 à 11h05 (265 Affichages)
APL-AML est une monographie fragmentée en plusieurs billets pour des raisons de volume.
Un billet SYNOPSIS et un billet SOMMAIRE agrègent tous les billets du blog via des liens hypertextes.

■ ■ ■ SOMMAIRE DU BILLET ■ ■ ■

  1. Noms des tables
    • Initiales de l’application
    • Nommage des tables
  2. Noms des données
    • Normalisation sémantique et syntaxique
    • Tables de références
    • Variables
    • Clés primaires et clés étrangères
    • Références croisées TABLES/ATTRIBUTS
    • Discussion « Modélisation des tables et des vues »
  3. Noms des programmes
    • Écrans, états, shells, sql, sed, files
1. Noms des tables

Initiales de l’application

Il est judicieux d’associer à l’application un ou deux caractères (initiale(s) de l’application) qui participerons au nommage de certaines tables. Quand on développe plusieurs BDD, cela permet de se créer des environnements distincts et de maitriser ses copier-coller d'une BDD vers l'autre.

Spécificité Informix : Concernant les noms de tables, une exception concerne la table « sysmenuitems » (12 caractères) qui est l’une des deux tables du system catalog que le SGBD Informix ajoute dès lors que l’on utilise le système de menus du SGBD. Les deux tables « sysmenuitems » et « sysmenus » sont manipulables comme les tables de données de la BDD.

APL-AML limite de préférence les noms de table entre deux et cinq caractères maximum. Autant faire court car on va les utiliser dans toute l’application (écrans, états, requêtes SQL). Autant faire court car on va les utiliser dans toute l’application (écrans, états, requêtes sql).

Il est ainsi facile de nommer la plupart de ses tables par la concaténation de l’initiale ou les initiales de l’entité avec l’initiale ou des initiales de l’application.

Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Application : « ec » pour examens-concours
Entité      : « p » pour personnes, « c » pour candidatures, etc.
Tables      : « pec », « cec », etc.
Les noms de views peuvent être plus longs sans toutefois dépasser 10 caractères.

Suffixer les noms de tables synonymes par « _bis », « _ter » afin de les distinguer des tables originales.

Nommage des tables

Examens-concours

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{------------------------------------------------------------------------------}

{ ac    (académies) -----------------------------------------------------------}
{ cea   (candidatures épreuves d'admission) -----------------------------------}
{ cea_n (candidatures épreuves d'admission) -----------------------------------}
{ cec   (candidatures examens-concours) ---------------------------------------}
{ cec_n (candidatures examens-concours) ---------------------------------------}
{ cm    (communes) ------------------------------------------------------------}
{ cnd   (candidatures OCEAN) --------------------------------------------------}
{ cp    (codes postaux) -------------------------------------------------------}
{ dg    (district géographique) -----------------------------------------------}
{ dec   (direction des examens-concours : Ministère) --------------------------}
{ dip   (diplômes - voir table eaq) -------------------------------------------}
{ ea    (épreuves d'admissibilités/admission) ---------------------------------}
{ ea_n  (épreuves d'admissibilités/admission) ---------------------------------}
{ eaq   (examen pour acquis OCEAN = diplômes) ---------------------------------}
{ ec    (examens-concours) ----------------------------------------------------}
{ ec_n  (examens-concours) ----------------------------------------------------}
{ epr   (épreuves OCEAN) ------------------------------------------------------}
{ et    (établissements) ------------------------------------------------------}
{ exa   (examens OCEAN) -------------------------------------------------------}
{ gr    (grades) --------------------------------------------------------------}
{ itrf  (ITRF) ----------------------------------------------------------------}
{ ln    (logname) -------------------------------------------------------------}
{ lv    (langues vivantes) ----------------------------------------------------}
{ mat   (matières) ------------------------------------------------------------}
{ mj    (membres du jury) -----------------------------------------------------}
{ mra   (motifs recul d'âge) --------------------------------------------------}
{ nat   (nationalités) --------------------------------------------------------}
{ ne    (natures établissements) ----------------------------------------------}
{ net   (candidatures internet issues d'INSCRINET OCEAN) ----------------------}
{ oc    (origine des candidats) -----------------------------------------------}
{ opt   (options) -------------------------------------------------------------}
{ oral  (ordre oral) ----------------------------------------------------------}
{ os    (origines statutaires) ------------------------------------------------}
{ pec   (personnels examens-concours) -----------------------------------------}
{ pec_n (personnels examens-concours) -----------------------------------------}
{ pic   (pré-inscriptions CONCOURS) -------------------------------------------}
{ pic_n (pré-inscriptions CONCOURS) -------------------------------------------}
{ pim   (pré-inscriptions MINITEL) --------------------------------------------}
{ pim_n (pré-inscriptions MINITEL) --------------------------------------------}
{ pj    (planning jury) -------------------------------------------------------}
{ pm    (pièces manquantes) ---------------------------------------------------}
{ prf   (professions OCEAN) ---------------------------------------------------}
{ qcm   (questionnaire à choix multiple : importation) ------------------------}
{ qjo   (questionnaire jury d'oral      : importation) ------------------------}
{ rc    (refus d'autorisation de concourir) -----------------------------------}
{ sa    (situations administratives -------------------------------------------}
{ sg    (services gestionnaires) ----------------------------------------------}
{ sh    (suivi historique) ----------------------------------------------------}
{ sh_n  (suivi historique) ----------------------------------------------------}
{ sp    (salles/places) -------------------------------------------------------}
{ spe   (spécialités) ---------------------------------------------------------}

{ sys_c (colonnes) ------------------------------------------------------------}
{ sys_d (documentation Ex&Co : views per, ace, shl, sql) ----------------------}
{ sys_t (tables) --------------------------------------------------------------}

{ sysmenus --------------------------------------------------------------------}
{ sysmenuitems ----------------------------------------------------------------}

{ t_cm  (typologie communes) --------------------------------------------------}
{ tec   (typologie examens-concours) ------------------------------------------}
{ tj    (travaux jury) --------------------------------------------------------}
{ tj_n  (travaux jury) --------------------------------------------------------}
{ tmp   (temporaire) ----------------------------------------------------------}
{ tmp_hf(temporaire hommes_femmes) --------------------------------------------}
{ tmp_nd(temporaire niveaux de diplôme) ---------------------------------------}
{ tmp_nh(temporaire niveaux hiérarchiques) ------------------------------------}
{ tmp_os(temporaire origines statutaires) -------------------------------------}
{ tmp_ta(temporaire tranches d'âge) -------------------------------------------}
{ uad   (unité administrative) ------------------------------------------------}
{ ut    (unités de traitement) ------------------------------------------------}

NB : Voir le Billet « AGL minimaliste » pour une liste des tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
┌────────────┬──────────┬──────────┬──────────┬──────────┬─────────────────────┐
│   TABLES   │ COLONNES │ RANGÉES  │SYNONYMES │   VUES   │        NOMS         │
└────────────┴──────────┴──────────┴──────────┴──────────┴─────────────────────┘
2. Noms des données

Normalisation sémantique et syntaxique

Pour le RAD, l’efficacité est assujettie à un vocabulaire réduit basé sur des mots clés courts mais significatifs. Le RAD abrège facilement les noms de données, chaque abréviation devant être rapidement compréhensible. Décrites avec souplesse, cinq règles codifient une normalisation sémantique et syntaxique :

  1. Prendre l’abréviation usuelle quand elle existe,
  2. Prendre les 3, 4 ou 5 premières lettres du mot,
  3. Si la dernière lettre du mot est une voyelle, prendre la première lettre du mot et la dernière syllabe,
  4. Si la dernière lettre du mot est une consonne, prendre la première syllabe et la dernière consonne,
  5. Utiliser des abréviations spécifiques.

Abréger les noms de données est un héritage de l'informatique à cartes perforées qui n'a plus lieu d'être compte tenu de la puissance des ordinateurs et de la sophistication des éditeurs. L'économie de caractères se traduit par un effort de mémorisation et d’interprétation.

Si toutefois il s'avère nécessaire d'abréger certains noms de données, les règles que propose le RAD et que l'on pratique le plus souvent sans le savoir peuvent convenir. Mais objectivement, quel avantage y a-t-il à définir des mots clés du genre "tx" pour "taux", "ab" pour "abrégé", "typ" pour "type", etc. Certainement pas celui de la lisibilité des programmes.

Informix limite les noms de données à 20 caractères. L’idéal, c’est qu’ils soient explicites tout en étant le plus courts possible en évitant les abréviations.

Dans l’exemple ci-dessous, extrait de la BDD Examens-Concours, on reconnaît dans quelques noms de données les deux caractères « ec » (initiale(s) de l’application) qui participent au nommage de certaines tables de la BDD.

Exemple de noms de données avec trois tables « jury ».

NB : L’annexe «Ex&Co Sql CREATE_BDD » recense l’intégralité des noms de données de la BDD.

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
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
104
105
106
107
108
109
110
{ mj    (membres du jury) -----------------------------------------------------}

create table mj
(
n_mj            serial   not null,
numen           char(13),
civilite        char(3)  not null,
nom             char(20) not null,
prenom          char(20),
adresse         char(38),
lieu_dit        char(38),
c_cp            char(5),
l_ld            char(30),
c_gr            char(8),
indice          char(3),
fonction        char(30),
memo            char(30),
mode_paiement   char(2),
se              char(2),
pb              char(2),
c_et            char(8)  not null,
envoi           char(1)  not null,
d_tj            date,
division        char(30),
tel_dom         char(20),
tel_bur         char(20),
e_mail          char(38)
) ;

grant  all   on mj to public;

{ pj    (planning jury) -------------------------------------------------------}

create table pj
(
cts_geo         char(12) not null,
cts             char(9)  not null,
geo             char(3)  not null,
c_ec            char(5)  not null,
t_ec            char(2)  not null,
s_ec            char(2)  not null,
groupe          char(1)  not null,
epreuve         char(1)  not null,
option          char(1)  not null,
partiel         char(1)  not null,
c_dp            char(2),
sexe            char(1),
n_pj            smallint,
c_et            char(8),
lieu            char(38),
hall            char(38),
salle           char(5),
jury            smallint,
passage         smallint,
d_epreuve       date,
hm_appel        datetime hour to minute,
hmd_epreuve     datetime hour to minute,
hmf_epreuve     datetime hour to minute,
h_appel         decimal(4,2),
hd_epreuve      decimal(4,2),
hf_epreuve      decimal(4,2)
) ;

grant  all   on pj to public;

{ tj    (travaux jury) --------------------------------------------------------}

create table tj
(
n_mj            integer  not null,
cts_geo         char(12) not null,
cts             char(9)  not null,
c_ec            char(5)  not null,
t_ec            char(2)  not null,
s_ec            char(2)  not null,
geo             char(3)  not null,
groupe          char(1)  not null,
epreuve         char(1)  not null,
option          char(1)  not null,
partiel         char(1)  not null,
c_tj            char(2)  not null,
ok              char(1),
edition         char(1),
d_debut         date,
h_debut         decimal(4,2),
d_fin           date,
date_1          char(38),
date_2          char(38),
date_3          char(38),
date_4          char(38),
date_5          char(38),
date_6          char(38),
journee         char(1),
c_et            char(8),
jury            smallint,
salle           char(5),
suppleance      char(1),
lieu            char(38),
d_convoc        date,
d_indemnites    date,
d_deplacement   date,
n_note          smallint,
d_maling        date,
t_mailing       datetime hour to second
) ;

grant  all   on tj to public;

{------------------------------------------------------------------------------}

Une autre forme de nommage

Les développeurs de l’application nationale ont fait le choix d’un nommage des tables et des données sous la forme « XXX_XXX ». Ce choix est sans doute original et pratique mais pas toujours très explicite. Confronté à l’utilisation de cette BDD, j’ai dû commenter chaque nom de donnée à partir du dictionnaire des données de l’application.

Cette forme de nommage qui satisfait sans doute un besoin irrépressible de tout maitriser ne se traduit pas hélas par une meilleure lisibilité des programmes et encore moins par une meilleure compréhension.

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
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
{ dec   (direction des examens-concours : Ministère) --------------------------}

create table dec
(
numen         char(13),          { NUMEN   : NUMÉRO ÉDUCATION  NAT.  }
num_can       char(10),          { NUM_CAN : NUMÉRO DU CANDIDAT      }
cod_exa       char(3),           { COD_EXA : EXAMEN                  }
cod_spe       char(5),           { COD_SPE : SPÉCIALITÉ/SÉRIE        }
dat_nai       date,              { DAT_NAI : DATE DE NAISSANCE       }
cpo_can       char(5),           { CPO_CAN : CODE POSTAL CANDIDAT    }
uad_ori       char(3),           { UAD_ORI : UAD D'ORIGINE           }
cod_sex       char(1),           { COD_SEX : SEXE                    }
cod_han       char(1),           { COD_HAN : CODE HANDICAP           }
cod_nat       char(1),           { COD_NAT : CODE NATIONALITÉ        }
cod_sml       char(1),           { COD_SML : SITUATION MILITAIRE     }
cod_fam       char(1),           { COD_FAM : SITUATION FAMILIALE     }
nbr_enf       char(3),           { NBR_ENF : NOMBRE D'ENFANTS        }
cod_prf       char(4),           { COD_PRF : PROFESSION DU CANDIDAT  }
dip_pos       char(3),           { DIP_POS : DIPLÔME POSSÉDÉ         }
cod_pst       char(2),           { COD_PST : POSITION STATUTAIRE     }
cod_mag       char(1),           { COD_MAG : MOTIF DE RECUL D'ÂGE    }
tot1          decimal(7,2),      { TOT1    : TOTAL POINTS GROUPE 1   }
dec1          char(1),           { DEC1    : DÉCISION ADMISSIBILITÉ  }
cof1          decimal(5,2),      { COF1    : TOTAL COEFFICIENT  1    }
pos1          char(1),           { POS1    : POSITION DU GROUPE 1    }
tot2          decimal(7,2),      { TOT2    : TOTAL POINTS GROUPE 2   }
dec2          char(1),           { DEC2    : DÉCISION ADMISSION      }
cof2          decimal(5,2),      { COF2    : TOTAL COEFFICIENT  2    }
pos2          char(1),           { POS2    : POSITION DU GROUPE 2    }
cod_epr1      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr1      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr1      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl1      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not1      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat1      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd1      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos1      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr1      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr1      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr1      char(2),           { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
cod_epr2      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr2      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr2      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl2      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not2      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat2      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd2      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos2      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr2      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr2      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr2      char(2),           { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
cod_epr3      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr3      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr3      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl3      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not3      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat3      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd3      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos3      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr3      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr3      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr3      char(2),           { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
cod_epr4      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr4      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr4      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl4      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not4      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat4      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd4      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos4      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr4      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr4      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr4      char(2),           { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
cod_epr5      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr5      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr5      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl5      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not5      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat5      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd5      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos5      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr5      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr5      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr5      char(2),           { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
cod_epr6      char(5),           { COD_EPR : CODE DE L'ÉPREUVE       }
sta_epr6      char(1),           { STA_EPR : STATUT DE L'ÉPREUVE     }
typ_epr6      char(1),           { TYP_EPR : TYPE D'ÉPREUVE          }
cod_mcl6      char(1),           { COD_MCL : MODE DE CALCUL          }
cod_not6      char(1),           { COD_NOT : TYPE DE NOTATION        }
cod_mat6      char(4),           { COD_MAT : MATIÈRE DE L'ÉPREUVE    }
cod_grd6      char(1),           { COD_GRD : GROUPE DE DÉCISION      }
cod_pos6      char(1),           { COD_POS : POSITION DE L'ÉPREUVE   }
cof_epr6      decimal(5,2),      { COF_EPR : COEFFICIENT ÉPREUVE     }
not_epr6      decimal(6,2),      { NOT_EPR : NOTE DE L'ÉPREUVE       }
vno_epr6      char(2)            { VNO_EPR : VALIDITÉ DE L'ÉPREUVE   }
) ;

grant  all    on dec to public;

{------------------------------------------------------------------------------}

Une autre table de cette même BDD nationale mais non commentée montre la difficulté à lire ce choix de nommage. L’effort de compréhension génère fatalement une fatigue mentale qui se traduit par une perte de temps.

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
{ cnd   (candidatures OCEAN ---------------------------------------------------}

create table cnd
(
n_pec            integer,
cts              char(9),
c_ec             char(5),
t_ec             char(2),
s_ec             char(2),
geo              char(3),
groupe           char(1),
epreuve          char(1),
option           char(1),
cod_exa          char(3),
cod_spe          char(5),
num_can          char(10),
num_mtr          char(10),
num_men          char(13),
uad_ges          char(3),
eta_can          char(1),
cod_tit          char(4),
nmn_can          char(25),
nom_can          char(25),
pre_can          char(25),
dat_nai          date,
cmn_nai          char(30),
adr_can          char(32),
ad2_can          char(32),
ldi_can          char(24),
cpo_can          char(5),
cmn_can          char(26),
cod_eta          char(8),
tel_can          char(13),
tel_pro          char(13),
nbr_enf          smallint,
cod_nat          char(3),
cod_fam          char(1),
cod_prf          char(4),
cod_sml          char(1),
cod_sag          char(1),
cod_mag          char(1),
cod_han          char(2),
cod_eaq          char(3),
num_ano          char(10),
dci_sai          char(1),
flag             char(1)
) ;

grant  all    on cnd to public;

{------------------------------------------------------------------------------}

NB : Durant toute ma carrière, le besoin de calibrer mes noms de données ne m’est jamais venu à l’esprit et si je n’ai pas ressenti ce besoin, c’est que la démarche ne s’imposait pas. Par contre, pour comprendre cette application nationale, j’ai nettement ressenti le besoin de créer un Dictionnaire des Données « papier », lequel a révélé des noms de données identiques référencés dans plusieurs tables avec un type et/ou une longueur différente(s).

Tables de références

Toutes les tables de références (Communes, Départements, Nomenclature, etc.) possèdent une clé primaire (un code ou un numéro), parfois un type et toujours un libellé. APL-AML privilégie donc les attributs les plus courants en les codifiant par leur initiale suivie du nom de leur table référente.

Les attributs retenus et leurs initiales sont les suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
┌────────────┬────┬────────────────────────────────────────────────────────────┐
│ Numéro     │ n_ │ l'attribut "n_cec" se lit "Numéro de la table cec",        │
│ Code       │ c_ │ l'attribut "c_ec"  se lit "Code   de la table ec", etc.    │
│ Type       │ t_ │                                                            │
│ Session    │ s_ │ ─> (exception concours)                                    │
│ Libellé    │ l_ │                                                            │
│ Date       │ d_ │                                                            │
│ Mnémonique │ m_ │                                                            │
└────────────┴────┴────────────────────────────────────────────────────────────┘
Les noms de données sont donc constitués très simplement du nom de leur table référente préfixé par la lettre mnémonique, "C" pour Code, "N" pour Numéro, "T" pour Type, "L" pour Libellé et "M" pour Mnémonique.

Ainsi, une table des communes nommée "cm" aura entre autre pour noms de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
cm.c_cm, (code commune de la table cm)
cm.t_cm, (type commune d la table cm)
cm.l_cm, (libellé commune de la table cm
Comme pour toute règle, il peut y avoir des exceptions, la table des codes postaux par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
cp.n_cp, (numéro de code postal de la table cp)
cp.c_cm, (code commune de la table cm)
cp.l_ld, (libellé lieu distribué de la table cp)
Sans en abuser, rien n'interdit d'étendre le principe. (exemple : « s_ » pour session)

À signaler que dans les programmes, les noms de données gagnent à être renommés de la façon suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
select cm.c_cm cm_c_cm,
       cm.t_cm cm_t_cm,
       cm.l_cm cm_l_cm,
       cp.n_cp cp_n_cp,
       cp.l_ld cp_l_ld
from   cm,
       cp
where  cm.c_cm = cp.c_cm
Dans les programmes, les noms de données sont impérativement préfixés du nom de la table à laquelle ils appartiennent (règle SQL). Cela se pratique depuis que le COBOL existe, les données de chaque fichier en « FILE SECTION » étaient préfixées de l’étiquette logique associée à leur fichier.

À tout endroit d'un programme on sait quelles données l'on manipule. Les erreurs éventuelles sur les noms de données sont essentiellement des erreurs de saisie facilement repérables.

Variables

Les variables d'un programme gagnent également à être préfixées, les préfixes classiques étant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
« P_ »  	pour Paramètre
« V_ »  	pour Variable
« CTR_ » 	pour Compteur
« NBR_ » 	pour Nombre
Pour une table « TA_ » :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
« I_TA »	pour Indice courant
« J_TA »	pour Indice borne des items renseignés
« K_TA » 	pour indice borne de la table
Clés primaires et clés étrangères

Dans les modèles de données relationnels, la clé primaire est un attribut dont le contenu est différent pour chaque enregistrement de la table, ce qui permet de retrouver un et un seul enregistrement (exemple : cm.c_cm).

Une clé étrangère est un attribut qui contient une référence à une donnée connexe - dans les faits la valeur de la clé primaire de la donnée connexe. Le nom d’une clé étrangère (exemple : cp.c_cm) doit être rigoureusement identique à celui de la clé primaire de la donnée connexe (exemple : cm.c_cm). Leurs caractéristiques (typologie, longueur) se doivent d’être également identiques.

Pédagogiquement et/ou conceptuellement, on préfixe ou on suffixe souvent dans les entités d’un MCD, une clé primaire (un attribut de l’entité) par « id_ » ou « _id », pour identifiant. Dans le monde réel, ce préfixe « id_ » ou ce suffixe « _id » n’a pas d’intérêt pour trois raisons :

  • Les clés primaires font l’objet de créations d’index, indépendamment de la création des tables.
  • Une clé primaire est un attribut comme un autre et son nom n’a pas à être pollué par un préfixe indiquant sa fonction. Les développements se réalisent parfaitement sans qu’il soit nécessaire de surajouter de l’information inutile.
  • Une clé primaire pour une table peut souvent être une clé étrangère pour une autre. Les deux clés, primaire et étrangère sont sensées avoir le même nom et forment ce que l’on appelle le domaine pivot qui permet le rapprochement des deux tables. Il s’en suit que la clé étrangère préfixée « id_ » prête à confusion en laissant supposer qu’il s’agit d’une clé primaire de la table connexe.

Index

Pour indexer les tables, il n’existe pas seulement des attributs faisant office de clés primaires, on peut avoir besoin de créer d’autres types d’index :

  • pour permettre d’accéder aux informations de la table dans un certain ordre,
  • ou pour garantir une unicité des items, différente de celle garantie par la clé primaire.

La règle de nommage des index adoptée est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Les noms d'index sont constitués du nom de leur table suivi d'un suffixe qui
dépend de leur fonction :

┌────────────────────────────────────────────┬──────────────────┬──────────────┐
│Fonctions                                   │Règle             │Exemple       │
├────────────────────────────────────────────┼──────────────────┼──────────────┤
│Accès aux informations dans un certain ordre│nom─table_tri     │cea_tri       │
│Garantie de l'unicité des items             │nom─table_cle     │cea_cle       │
│Accès direct aux items                      │nom─table_attribut│cea_n_cec     │
└────────────────────────────────────────────┴──────────────────┴──────────────┘
EXEMPLE :

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
{ cea   (candidatures épreuves d'amission) ------------------------------------}

lock table cea in exclusive mode;
{
drop index cea_tri;
drop index cea_cle;
drop index cea_cts;
drop index cea_geo;
drop index cea_n_cec;
}
create        cluster index cea_tri     on cea (cts_geo,
                                                partiel,
                                                jury,
                                                passage,
                                                ordre_oral,
                                                n_cec);
alter                 index cea_tri     to cluster;

create unique         index cea_cle     on cea (cts_geo,
                                                partiel,
                                                ordre_oral,
                                                n_cec);

create index                cea_cts     on cea (cts);
create index                cea_geo     on cea (geo);
create index                cea_n_cec   on cea (n_cec);

unlock table cea;

Mais il faut parfois s’arranger avec les exceptions... ea_cle et ea_cts_geo sont deux index garantissant chacun leur unicité :

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
{ ea    (épreuves d'admissibilités/admission) ---------------------------------}

lock table ea in exclusive mode;
{
drop index ea_cle;
drop index ea_cts_geo;
drop index ea_cts;
drop index ea_geo;
drop index ea_c_ec;
drop index ea_t_ec;
}
create unique cluster index ea_cle     on ea (c_ec,
                                              t_ec,
                                              s_ec,
                                              groupe,
                                              epreuve,
                                              option,
                                              partiel);
create unique         index ea_cts_geo on ea (cts_geo,
                                              partiel);
create                index ea_cts     on ea (cts);
create                index ea_geo     on ea (geo);
create                index ea_c_ec    on ea (c_ec);
create                index ea_t_ec    on ea (t_ec);

unlock table ea;

Références croisées TABLES/ATTRIBUTS

Les tables système complétées par une table des noms d’attributs en clair permettent de réaliser un tableau avec pour chaque table ses attributs recensés dans les autres tables. Le même attribut pouvant être référencé dans plusieurs tables avec un type et/ou une longueur différente(s), un "!" repère ces incohérences.

L’extrait d’un tel document pour une table « a_nex » d’une BDD nationale est proposé dans le Billet « Environnement de Développement Intégré (EDI) ».

Discussion « Modélisation des tables et des vues »

De cette discussion à laquelle j’ai participé je retiens l’exemple de view proposé par Cinephil que j’ai adapté à mon univers :
(discussion « normalisation du concepteur et du développeur : nommage , entre nécessité et dogmatisme »)

Exemple de view proposée par CinePhil :

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
CREATE OR REPLACE VIEW v_candidature AS SELECT 
      -- Candidat
      cd.cdt_id_candidat cdtIdCandidat,
      c.canPrenomUsuel cdtPrenomUsuel,
      c.canNomUsuel cdtNomUsuel,
      c.canIdSexe cdtIdSexe,
      -- Parcours
      cd.cdt_id_diplome_ensfea cdtIdDiplomeEnsfea,
      d.dpl_code cdtCodeDiplomeEnsfea,
      d.dpl_libelle_court cdtDiplomeEnsfea,
      cd.cdt_numero_mention cdtNumeroMention,
      m.men_code cdtCodeMention,
      m.men_libelle cdtLibelleMention,
      cd.cdt_id_specialisation cdtIdSpecialisation,
      s.spe_code cdtCodeSpecialisation,
      s.spe_libelle cdtLibelleSpecialisation,
      cd.cdt_id_option cdtIdOption,
      o.opt_code cdtCodeOption,
      o.opt_libelle cdtLibelleOption,
      -- te_candidature_cdt
      cd.cdt_id cdtId,
      cd.cdt_id_etat cdtIdEtat,
      e.eti_code cdtCodeEtat,
      e.eti_libelle cdtLibelleEtat,
      cd.cdt_id_session,
      se.ses_code cdtCodeSession,
      se.ses_libelle cdtLibelleSession,
      cd.cdt_date cdtDate,
      cd.cdt_annee_universitaire cdtAnneeUniv,
      cd.cdt_annee_dans_diplome cdtAnneeDansDiplome
FROM te_candidature_cdt cd
INNER JOIN v_candidat c ON c.canId = cd.cdt_id_candidat
INNER JOIN te_parcours_pcr p 
      ON p.pcr_id_diplome_ensfea = cd.cdt_id_diplome_ensfea
      AND p.pcr_numero_mention = cd.cdt_numero_mention
      AND p.pcr_id_specialisation = cd.cdt_id_specialisation
      AND p.pcr_id_option = cd.cdt_id_option
      INNER JOIN te_diplome_dpl d ON d.dpl_id = cd.cdt_id_diplome_ensfea
      INNER JOIN te_mention_men m 
            ON m.men_id_diplome_ensfea = p.pcr_id_diplome_ensfea
            AND m.men_numero = p.pcr_numero_mention
      INNER JOIN te_specialisation_spe s ON s.spe_id = p.pcr_id_specialisation
      INNER JOIN te_option_opt o ON o.opt_id = p.pcr_id_option
INNER JOIN tr_etat_inscription_eti e ON e.eti_id = cd.cdt_id_etat
INNER JOIN tr_session_ses se ON se.ses_id = cd.cdt_id_session

L’exemple de view de CinéPhil adapté à mon univers, ça donne ça :

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Tables :

pf  : personnes formation      (v_candidat)
cf  : candidature formation    (te_candidature_cdt)
pcr : parcours                 (te_parcours_pcr)
dip : diplôme                  (te_diplome_dpl)
men : mention                  (te_mention_men)
spe : spécialité               (te_specialisation_spe)
opt : option                   (te_option_opt)
eti : état inscription         (tr_etat_inscription_et)
ses : session                  (tr_session_ses)
                         
CREATE OR REPLACE VIEW v_cf AS SELECT 
          --- Candidat
           pf.n_pf              pf_n_pf,
           pf.nom               pf_nom,
           pf.prenom            pf_prenom,
           pf.sexe              pf_sexe,

           --- Candidature
           cf.n_cf              cf_n_cf,
           cf.etat              cf_etat,
           cf.d_cf              cf_d_cf,
           cf.annee_univ        cf_annee_univ,
           cf.annee_dans_dip    cf_annee_dans_dip

           --- etat
           eti.c_eti           eti_c_eti,
           eti.l_eti           eti_l_eti,

           --- Session
           ses.c_ses           ses_c_ses,
           ses.l_ses           ses_l_ses,

           --- Parcours

               Diplôme
           dip.c_dip           dip_c_dip,
           dip.l_dip_court     dip_l_dip_court,

               Mention
           men.c_men           men_c_men,
           men.l_men           men_l_men,

               Spécialité
           spe.c_spe           spe_c_spe,
           spe.l_spe           spe_l_spe,

               Option
           opt.c_opt           opt_c_opt,
           opt.l_opt           opt_l_opt,

FROM        pf

INNER JOIN  cf 
ON          pf.n_pf  =  cf.n_pf

INNER JOIN eti 
ON          cf.c_eti = eti.c_eti

INNER JOIN ses  
ON          cf.c_ses = ses.c_ses

INNER JOIN pcr  
ON          cf.c_dip = pcr.c_dip
AND         cf.c_men = pcr.c_men
AND         cf.c_spe = pcr.c_spe
AND 	      cf.c_opt = pcr.c_opt
	
           INNER JOIN dip  
           ON         pcr.c.dip = dip.c_dip

           INNER JOIN men  
           ON         pcr.c_dip = men.c_dip
           AND        pcr.c_men = men.c_men

           INNER JOIN spe  
           ON         pcr.c_spe = spe.c_spe

           INNER JOIN opt  
           ON         pcr.c_opt = opt.c_opt

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
┌─────────────────────┬──────────┬────────────────────────────────┐
│    Statistiques     │ CinéPhil │            IFA2377             │
├─────────────────────┼──────────┼──────────┬──────────┬──────────┤
│                Mots │      147 │      137 │    -  10 │          │
│ Espaces non compris │     1528 │      869 │    - 659 │  56,87 % │
│      Espace compris │     1677 │     1736 │    +  59 │          │
│              Lignes │       46 │       70 │    +  24 │          │
└─────────────────────┴──────────┴──────────┴──────────┴──────────┘
Ces petites statistiques (Word) révèlent que ma façon de travailler réduit de presque la moitié le nombre de caractères saisis. Mais le plus important - difficilement quantifiable - c’est l’absence de charge mentale liée à ma méthode de nommage.

Saisie deux fois plus importante, préfixes, renommage de noms concaténés mais avec initiales majuscules pour réduire le nombre de caractères (cd.cdt_id_diplome_ensfea cdtIdDiplomeEnsfea) et parfois différents de l’original (d.dpl_code cdtCodeDiplomeEnsfea), suffixes, alias, sont autant de sollicitations insidieuses qui se traduisent par une charge mentale réductrice de performance.

3. Noms des programmes (éditions, écrans), des shells, des sql

Écrans, états, shells, sql, sed, files

Afin de standardiser les outils « AGL » (éditions et écrans listant le contenu des dossiers), le nom de chaque composant d’une fonctionnalité est limité à 10 caractères maximum.

Tout ce qui participe à la réalisation d’une fonctionnalité (Unité de Traitement) porte le même nom. Seuls changent les suffixes qui identifient la nature de chaque composant en même temps que son dossier d’hébergement.

Fonctionnalité Suffixe Dossier Nature du composant
Nom_UT .per
.frm
.ace
.shell
.sql
.sed
.file
../per
../frm
../ace
../shell
../sql
../sql
../file
Écran (source)
Écran (exécutable)
Édition
Shell
Requête
Éditeur batch
Formulaire

NB :
  • Les shells ne nécessitent pas de suffixes mais sont bien hébergés dans un dossier qui leur est propre : ../shell
  • sql et sed sont hébergés dans le même dossier « ../sql »
  • Il peut être nécessaire de diviser certains dossiers par grandes fonctionnalités afin d’en mieux maitriser la gestion. Ces dossiers sont alors suffixés par un code mnémonique pertinent. Les composants ne sont pas eux-mêmes suffixés par ce code mnémonique.

    Exemple Ex&Co :

    ../ace_1 (Dossier des éditions concernant l’admissibilité)
    ../ace_2 (Dossier des éditions concernant l’admission)
    ../ace_mj (Dossier des éditions concernant les membres du jury)

    Exemple OSMOSE :

    ../per_A (Dossier des écrans sources personnels Administratifs)
    ../per_E (Dossier des écrans sources personnels Enseignants)
    ../shell_0 (Dossier des shells concernant l’année scolaire en cours)
    ../shell_1 (Dossier des shells concernant l’année scolaire - 1)
    ../shell_9 (Dossier des shells concernant l’année scolaire + 1, lire neuf comme nouveau)


NB : Le Billet "AGL minimaliste" propose une arborescence des développements, une liste d'écrans et une liste d'états.
Les bonnes pratiques de programmation

▲ I-2.1.5. L’espace de travail improvisé du développeur APL-AML
► I-2.2.1. Règles de nommage
▼ I-2.2.2. Règles de développement

Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Viadeo Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Twitter Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Google Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Facebook Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Digg Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Delicious Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog MySpace Envoyer le billet « I-2.2.1. Règles de nommage » dans le blog Yahoo

Mis à jour 25/02/2024 à 11h48 par APL-AML

Catégories
■ APL-AML , I- L’ART , I-2. Règles de réalisation