31,029
edits
| Line 74: | Line 74: | ||
= Normes SQL = | = Normes SQL = | ||
== Structure des tables et champs == | |||
* Toutes les tables sont préfixées pour éviter les conflits de nommage. Aujourd'hui, le préfixe est déterminé et n'est pas modifiable. Sa valeur est <tt>llx_</tt>. Il est cependant envisagé, dans une version future, de pouvoir le modifier au moment de l'installation. | |||
* Structure des tables. | * Structure des tables. | ||
Lorsque vous créez une table, il est recommandé de prendre les même conventions de nommages de tables que les autres tables Dolibarr. Avec, à minima les champs suivant: | Lorsque vous créez une table, il est recommandé de prendre les même conventions de nommages de tables que les autres tables Dolibarr. Avec, à minima les champs suivant: | ||
| Line 84: | Line 88: | ||
- fk_user_modif integer qui est l'id du user de modif | - fk_user_modif integer qui est l'id du user de modif | ||
* Type des champs | |||
Dans la pratique, afin d'etre compatible avec toutes les précisions des pays, syntaxes des bases, on utilisera les types suivants: | |||
- double(24,8) pour tout montant | |||
- double(6,3) pour les taux de tva | |||
- real pour une quantité | |||
- varchar pour une chaine (y compris de longueur 1, le type char est de plus en plus déprécié) | |||
- timestamp pour un champ date+heure devant être mis a jour automatiquement | |||
- datetime pour un champ date+heure | |||
- date pour un champ date | |||
== Clé primaire == | |||
La clé primaire d'une table s'appelle <tt>rowid</tt>. | |||
Il y a quelques tables qui échappent à cette règle actuellement (ex [[Table llx_c_actioncomm]]), pour des raisons historiques. Une évolution pourra être étudiée pour une prochaine version. | |||
== Clés étrangères == | |||
Le nom d'une clé étrangère commence par le préfixe <tt>fk_</tt> suivi du nom de la table liée (requis pour éviter doublons globales à la base, problématiques sous certains SGBD comme postgresql) puis du champ lié (pour permettre plusieurs clés étrangères différentes sur une même table). | |||
Exemple: | |||
fk_facture_fourn_fk_soc | |||
Note: Si vous développez votre propre module externe, il ne doit pas y avoir de clé étrangère depuis vos tables qui pointent sur les tables standards de Dolibarr. Ceci casserait les fonctionnalités de mise à jour, de réparation, de sauvegardes et de restauration. | |||
== Clés alternatives == | |||
Parfois, il n'y a pas que la clé primaire qui doit être unique. On peut donc ajouter aussi un index clé alternative unique. Un tel index est nommé par un nom qui commence par le préfixe <tt>uk_</tt> suivi du nom de la table d'un underscore (requis pour éviter doublons d'index globals à la base, problématiques sous certains SGBD comme postgresql) puis d'un suffixe qui caractérise la clé (pour permettre plusieurs index uniques sur une même table). | |||
Exemple: | |||
uk_societe_code_client | |||
== Index performance == | |||
Certains champs sont souvent utilisés comme critère de recherche, de tri ou de jointure. Il convient dans ce cas, d'y mettre un index de performance. De tels indexes seront nommés avec un préfix <tt>idx_</tt> puis le nom de la table et le nom du champ sur lequel porte l'index. | |||
Exemple: | |||
idx_societe_user_creat | |||
== Format de fichier DDL == | |||
Les fichiers qui contiennent la définition de la structure de la base (DDL) doivent être au nombre de 2 par tables: | |||
Chaque table est définie dans son propre fichier dont le nom est <tt>llx_''matable''.sql</tt>. | |||
On mettra un commentaire à côté de chaque champ pour en expliquer la signification. | |||
Les clés étrangères et index de performance ou autres contraintes d'unicité sont définies dans un fichier séparé dont le nom est <tt>llx_''matable''.key.sql</tt> | |||
Ces fichiers sont placés dans le répertoire '''install/mysql/tables''' pour les fichiers standards ou '''monmodule/tables''' pour les tables amenées par un module. | |||
== Utilisation des alias/nommage de champs == | |||
Dans le cas des select on pourra utiliser les alias pour simplifier l'écriture des requêtes: | |||
<source lang="sql"> | |||
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy | |||
</source> | |||
Toutefois, il ne faut pas utiliser ces alias sur des requêtes update car non compatible avec mysql 3.1. | |||
== Exemples == | |||
=== Fichier table llx_matable.sql === | |||
<source lang="sql"> | |||
-- =========================================================================== | |||
-- Copyright (C) 2008 Author <email@author.com> | |||
-- | |||
-- This program is free software; you can redistribute it and/or modify | |||
-- it under the terms of the GNU General Public License as published by | |||
-- the Free Software Foundation; either version 2 of the License, or | |||
-- (at your option) any later version. | |||
-- | |||
-- This program is distributed in the hope that it will be useful, | |||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
-- GNU General Public License for more details. | |||
-- | |||
-- You should have received a copy of the GNU General Public License | |||
-- along with this program; if not, write to the Free Software | |||
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
-- | |||
-- $Id: llx_matable.sql,v 1.23 2005/10/08 15:59:49 eldy Exp $ | |||
-- =========================================================================== | |||
create table llx_matable | |||
( | |||
rowid integer AUTO_INCREMENT PRIMARY KEY, | |||
field_one integer, | |||
field_two integer NOT NULL, | |||
fk_field integer, | |||
field_date datetime, | |||
tms timestamp | |||
)type=innodb; | |||
</source> | |||
=== Fichier clés/index llx_matable.key.sql === | |||
<source lang="sql"> | |||
-- =========================================================================== | |||
-- Copyright (C) 2008 Author <email@author.com> | |||
-- | |||
-- This program is free software; you can redistribute it and/or modify | |||
-- it under the terms of the GNU General Public License as published by | |||
-- the Free Software Foundation; either version 2 of the License, or | |||
-- (at your option) any later version. | |||
-- | |||
-- This program is distributed in the hope that it will be useful, | |||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
-- GNU General Public License for more details. | |||
-- | |||
-- You should have received a copy of the GNU General Public License | |||
-- along with this program; if not, write to the Free Software | |||
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
-- | |||
-- $Id: llx_matable.sql,v 1.23 2005/10/08 15:59:49 eldy Exp $ | |||
-- =========================================================================== | |||
ALTER TABLE llx_matable ADD UNIQUE uk_matable_field(field_one, field_two); | |||
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid); | |||
</source> | |||
== Règles de codage == | |||
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple: | * Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple: | ||
<source lang="sql"> | <source lang="sql"> | ||
| Line 101: | Line 221: | ||
Voir aussi le chapitre "Les nombres réels, montants et calculs" plus bas. | Voir aussi le chapitre "Les nombres réels, montants et calculs" plus bas. | ||
* | * Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d'avoir une meilleure portabilité du code mais surtout d'avoir une gestion correcte des TimeZone. | ||
== Spécificités MySQL == | |||
* Les tables doivent être au format InnoDB. | |||
En effet, ce format gère les clés étrangères, les éventuelles restrictions qui y sont attachées et la notion d'intégrité de transactions requise pour avoir des données en base cohérente entre tables. | |||
* Dolibarr doit fonctionner même avec les options '''strict''' de Mysql active. | * Dolibarr doit fonctionner même avec les options '''strict''' de Mysql active. | ||
| Line 117: | Line 233: | ||
</source> | </source> | ||
== Spécificités PostgreSQL == | |||
Seuls les fichiers pour Mysql doivent être maintenus. | |||
Les fichiers pour les autres bases sont convertis "à la volée" par le driver Dolibarr de la base. | |||
= Normes HTML = | = Normes HTML = | ||