en construction !
mes conventions de nommage des tables et des champs(fields) en mySql
Pourquoi?
Ces conventions ne sont ni meilleures ni pires que d'autres.
Elles sont certainement meilleures que pas de convention du tout.
Elles me permettent et permettent à mes collaborateurs de comprendre très rapidement le travail de chacun. Et de détecter, le plus rapidement possible dans le processus de développement, d'éventuelles incohérences.
Elles nous permettent certains traitements automatiques.
Exemple :
Si la table
tools_people
contient les champs:
la convention de nommage permet, par exemple, de générer automatiquement, pour un objet, lu depuis la DB, qui contiendrait $people->url_site et $people->sz_url_site un troisième attribut $people->html_link_site dont le contenu serait quelque chose comme
'<a href= . quote($people->url_site) . '>' . htmlEntities($people->sz_url_site) . '</a>'
∴
Domaines
Une même DB peut contenir des tables relatives à différentes applications ou sous-applications, par exemple:
- tools (tables du framework), exemple :
- tools_country_iso_pk : une table des pays (inutile de mettre
country
au pluriel: il y a bien sûr plusieurs entrées), appartenant au framework, dans la clef primaire n'est pas le traditionnel pid
mais bien a2_iso
.
- diverses tables utilisées par la plupart des applications
- mason : exemple :
- agenda : exemple :
- agenda_auditable_meeting : une table des réunions, appartenant à l'application
agenda
et qui contient un pointeur vers la table tools_audit
∴
Tables
Le nom d'une table commence toujours par le domaine.
Ceci est en outre utile pour ne pas se mélanger les pinceaux en cas d'hébergement prévoyant un nombre limité de DB, et où divers logiciels installeront, chacun, leurs tables respectives avec un préfixe différent.
∴
Tables particulières
Menu
Une table contenant des choix, par exemple pour un menu déroulant.
Exemple :
- agenda_menu_fr_type_activite : une liste de types d'activités pour laquelle le texte descriptif est en UTF8, écrit en français et traduisible dans d'autres langues. Typiquement, une telle table comprendrait les champs suivants :
- us_value_pk : une valeur entière(us_value_pk) positive ou nulle (us_value_pk) petite (us_value_pk) qui constitue la clef primaire pour cette table (us_value_pk)
- szm_legend : le texte correspondant, UTF8 (szm_legend), en français (agenda_menu_fr_type_activite), traduisible, correspondant à la version
middle
(szm_legend) dans la table tools_babel
.
- sz_comment : un commentaire à usage interne , un texte non traduisible en UTF8 (sz_comment).
∴
Doc
Exemple :
- agenda_doc_diffusion : une table à usage interne assez semblable à une table
menu
sauf qu'elle ne contient pas un champ du genre szm_legend
.
∴
Auditable
Une table dont les données sont
sensibles et qui contient un pointeur vers la table
tools_audit
.
Exemple :
- agenda_auditable_meeting : une table des réunions, appartenant à l'application
agenda
et qui contient un pointeur vers la table tools_audit
∴
N x N
Exemple :
∴
Pour les tables
particulières, le nom de la table est construit par le nom du domaine, suivi de :
- _menu_ lui même suivi du code ISO 3166 (non qualifié) de la langue en 2 ou 3 lettres. Exemple :
- _doc_
- _auditable_
- le noms (ou évocations) des tables liées séparés par _2_
∴
Champs (fields)
Préfixe et suffixe
Tous les champs sont nommés à l'aide d'un préfixe, parfois suivi d'un deuxième préfixe (e.g.
default,
url...).
Lorsqu'un champ constitue la clef primaire((primary key):
- soit, dans la plupart des cas, il s'agit d'une clef entière, un entier positif non nul, sur 11 caractères, toujours appellé pid
- soit c'est un autre champ et dans ce cas on mentionne le suffixe _pk (comme primary key)
∴
Premier Préfixes
Le premier préfixe indique le type du contenu.
Ce n'est pas nécessairement une indication suffisante du type défini en mySql. Exemple: html_signature peut être un VARCHAR(256) ou un TEXT.
Clefs et pointeurs
- pid
- pointeur avec valeur 0 admise :
- id_domaine_tabledunautredomaine
- id_tabledumemedomaine
pointeur vers un record qui DOIT exister :
∴
Numériques
- i_ : integer
- u_ : unsigned integer
- ul_ : unsigned long integer
- us_ : unsigned short integer
- o_ : offset (auusi l'initiale de
order
)
- time_ : unix time (nr of seconds since Unix epoch = 1/1/1970)
- latitude_ (double)
- longitude_ (double)
- f_ : float
- d_ : double
∴
Logiques
- z_ : 0 ou 1
- yn_ : 'Y' ou 'N'
- ynq_ : enum('Y','N','Q') yes, no, '?'
- ynx_ : enum('Y','N','X') yes, no, N/A (not applicable)
- ynqx_ : enum('Y','N','Q', 'X') yes, no, '?' , N/A
- fz_ : fuzzy, 0 ≤ float ≤ 1
- e7_ : enum avec 7 valeurs possibles (exemple !)
- e_amde_ : enum('A','M','D','E') (exemple!)
∴
Caractères
- ch_ : un caractère UTF8
- a2_ : code en 2 lettres (ex. country ISO 639 : it, be)
- a2_639_
- regex : /^[a-z]{2,2}$/
- a3_ : code en 2 ou 3 lettres (ex. language ISO 3166 : es, ast)
- a3_3166_destination_country
- a3_country_or_region
- 'fr', 'cu', 'lat' , 'eur' , 'bxl'...
a6_ : code jusqu'à 6 lettres ou chiffres : es-CU, fr, ...
- a6_3166_
- regex : /^[a-z]{2,3}(\-[A-Z]{2,2})?$/
- a16_3166_ ( zh-Hans )
- regex : /^[a-z]{2,3}(\-[A-Z][a-zA-Z]{1,11})?$/
∴
Textes Ascii
- asc_16_
- asc_32_
- asc_64_
- asc_128_
- asc_256_
∴
Texte UTF8
- sz_ : non traduisible
- szs_ : traduisible, correspond à un champ 'short' dans la table tools_babel
- szm_ : middle
- szl_ : long
- txt_ : non traduisible
∴
Textes particuliers
- date_ (exemple : 1789-07-14 ) correspond à DATE en mySql
- datehour_ (exemple : 1789-07-14 15:59:30) (à vérifier !!!!)
- dater_ (RFC ? ) utiliser plutôt time_ !
- datec_ (RFC ? ) utiliser plutôt time_ !
- url_ : y compris le protocole
- http_ : le protocole sera ajouté ( les 7 caractères : http:// )
- email_ (à préférer àurl_email_truc qui contiendrait mailto:truc@machin.org)
- html_ :
- isbn_ :
- sis_ :
- sql_ : query
- regex_ :
- shell_ :
- php_ :
- ip4_ : exemple : 164.15.233.25 : 3 points + 4x3 ⇒ {7,15}
- ip6_ :
- zip_ : (pays{1,3} + '-')? + 4 (be,ch), 5 (fr) or up to 7 chars (ca, uk : 3,space,3) {4,7} ⇒ pour être sûr {4,16}
∴
Valeurs multiples
- csv_ :
- csv_a3_3166_langues_interface (exemple : ,'it','es','fr', )
- first/last commas added to facilitate mySql LIKE's
- génération automatique de :
- $obj->o_2_a3_3166_langues_interface = array('it','es','fr') ;
- $obj->a3_3166_langues_interface_2_o = array('it'=>0,'es'=>1,'fr'=>2) ;
∴
Second Préfixes
Le second préfixe indique l'usage du contenu
ou la norme respectée.
mandatory
optional
- id_mandatory_audit : le pointeur doit pointer vers une valeur existante du pid dans la table tools_audit
par opposition à :
- id_lieu_villegiature : pointeur optionnel vers la table
lieu
. Une alertnative explicite (mais optional est compris par défaut):
- id_optional_lieu_villegiature
∴
default
La valeur n'est pas véritablement liée à l'objet décrit mais constitue la valeur par défaut qui sera utilisée dans une autre table.
Exemple :
- la table
monapplic_type_reponse
contient les champs :
- pid
- ynq_default_satisfait
- la table
monapplic_reponse
contient les champs :
- id_type_reponse
- ynq_satisfait
∴
url, email, http
Exemples :
- la table
tools_people
contient les champs:
- url_image
- sz_url_image
- url_site
- sz_url_site
∴
Pourquoi?
La convention de nommage permet par exemple de générer automatiquement, pour un objet, lu depuis la DB, qui contiendrait $people->url_site et $people->sz_url_site un troisième attribut $people->html_link_site dont le contenu serait quelque chose comme '<a href= . quote($people->url_site) . '>' . htmlEntities($people->sz_url_site) . '</a>'
∴
normes, etc
- a2_639_
- a3_3166_
- a6_3166_
- a16_3166_
pour un standard ISO
idem pour RFC (voir datec , dater !!!)
- date_???_ selon RFC ??? en PHP date($t,'r')
- date_r_ selon RFC ??? en PHP date($t,'r')
- date_???_ selon RFC ??? en PHP date($t,'c')
- date_c_ selon RFC ??? en PHP date($t,'c')
ou pour d'autres standards...
- ip4_ : on ne précise pas IANA, le 4 de ip4 est suffisant!
∴
Suffixe
Lorsqu'un champ constitue la clef primaire :
- soit, dans la plupart des cas, il s'agit d'une clef entière, un entier positif non nul, sur 11 caractères, toujours appellé pid
- soit c'est un autre champ et dans ce cas on mentionne le suffixe _pk (comme primary key)
∴