Page 1 sur 1
Structure d'une base de donnée
Posté : 25 août 2006, 12:25
par stever
Bonjour je débute dans le PHP mysql
et souhaite realiser ma premiere application mais pour cela faut au départ bien structuré ses tables de BD
Je veux enregistré des noms de villes, leur code postal et leur nom de département.
Dois je faire une seule table VILLE, dans laquelle l'info département sera forcement répété plusieur fois.
Ou faut il aussi faire une table DEPARTEMENT
Posté : 25 août 2006, 12:48
par albat
Je t'encourage à créer une table département et une table commune disctinctes :
DEPARTEMENT
dpt_id (clé primaire)
dpt_nom
...
COMMUNE
com_id (clé primaire)
dpt_id (clé étrangère)
com_nom
com_codepostal
...
Posté : 25 août 2006, 12:55
par stever
peux tu m'expliquer pourquoi
est ec que c'est parceque je vais avoir plusieurs fois le meme nom de département dans la table COMMUNE.
Je sent que c'est pour cela, mais je sais pas m'expliquer pourquoi, quelles sont les conséquences ?
Pourquoi ???

Posté : 25 août 2006, 13:11
par albat
Les raisons sont multiples.
En voici deux, très simples :
- Espace mémoire :
Il y a 100 départements et 36000 communes en france (environ).
Considérons que le champ dpt_nom est un varchar(50).
Avec une seule table, tu vas devoir le répéter pour chaque commune :
50 * 36000 = 1,8 Mo
Si tu crées une table dpt, chaque nom de département ne sera inscrit qu'une fois:
50 * 100 = 5 Ko
- Il y a quelques années, le département 21 a changé de nom.
De "Côtes du Nord", il est devenu "Côtes d'armor".
Avec une seule table, tu vas devoir modifier le nom du départment
pour chaque commune du département (entre 300 et 500)
Rien que 300 copier/coller, ça soule vite !
Si tu crées une table dpt, tu n'auras à corriger qu'une ligne.
Mieux, non ?
Sans oublier que la première solution apporte aussi le risque d'erreurs.
Des communes situées dans les "Cotes d'Armor" et les "Côtes d'Armor"
ne seront pas considérées comme appartenant au même département.
espace mémoire, redondance des données,...
Posté : 25 août 2006, 13:17
par stever
Ok c'est tres clair je me régale de te lire 10/10
J'ai tout compris, merci.
Parcontre je vais pas faire un formulaire ou je vais taper chaque ville
Est il possible de faire un script en envoie tout a la table a partir d'un listing (word ou exel)
Posté : 25 août 2006, 14:25
par albat
si tu as la liste sous format CSV (s'obtient directement à partir d'excel),
tu peux faire un chargement global.
regarde aussi
load_data_infile
Posté : 25 août 2006, 15:31
par stever
Salut avec mes petit moyen voici ce que j'arrive a faire
Code : Tout sélectionner
create table codpostal
(
cp_codpos char(10) not null,
cp_ville char(30) not null,
cp_pays char(3),
cp_noinsee char(10) not null,
cp_bureaudist char(30) not null
);
create index cp_codpos on codpostal (cp_codpos);
create index cp_ville on codpostal (cp_ville);
create index cp_noinsee on codpostal (cp_noinsee);
create index cp_bureaudist on codpostal (cp_bureaudist);
INSERT INTO codpostal VALUES('01400', 'L ABERGEMENT CLEMENCIAT', '100', '01001', 'L ABERGEMENT CLEMENCIAT');
INSERT INTO codpostal VALUES('01640', 'L ABERGEMENT DE VAREY', '100', '01002', 'L ABERGEMENT DE VAREY');
INSERT INTO codpostal VALUES('01090', 'AMAREINS', '100', '01003', 'AMAREINS FRANCHELEINS');
INSERT INTO codpostal VALUES('01500', 'AMBERIEU EN BUGEY', '100', '01004', 'AMBERIEU EN BUGEY');
INSERT INTO codpostal VALUES('01330', 'AMBERIEUX EN DOMBES', '100', '01005', 'AMBERIEUX EN DOMBES');
INSERT INTO codpostal VALUES('01300', 'AMBLEON', '100', '01006', 'AMBLEON');
INSERT INTO codpostal VALUES('01500', 'AMBRONAY', '100', '01007', 'AMBRONAY');
INSERT INTO codpostal VALUES('01780', 'AMBUTRIX', '100', '01008', 'AMBUTRIX');
INSERT INTO codpostal VALUES('01300', 'ANDERT ET CONDON', '100', '01009', 'ANDERT ET CONDON');
Si je crée un fichier txt
ou sur chaque ligne une VILLE avec ces champs séparé par une virgule
comment faire pour automatiser l'envoie
'01500', 'AMBRONAY', '100', '01007', 'AMBRONAY'
'01780', 'AMBUTRIX', '100', '01008', 'AMBUTRIX'
'01300', 'ANDERT ET CONDON', '100', '01009', 'ANDERT ET CONDON'
Posté : 25 août 2006, 15:39
par albat
Tu te constitues un fichier international ?
Parce que, si c'est 100% France...
- pour cp_codpos, un char(5) suffit
- pour cp_ville, un varchar(50) serait plus sûr
Quant aux bureaux distributeurs, il me semblait que cela n'existait plus
(du moins, plus sous cette forme...)
Posté : 25 août 2006, 15:48
par stever
Ok merci pour les info
est en ce qui concerne l'envoie des donnée t'as pas une petite recette miracle sous la main lol
Posté : 25 août 2006, 15:52
par albat
Tu as regardé la fonction que je t'ai indiquée plus haut ?
Posté : 25 août 2006, 15:55
par stever
oui mais je debute depusi cette semaine et j'ai du mal
Code : Tout sélectionner
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
[IGNORE number LINES]
[(col_name,...)]
Posté : 25 août 2006, 16:26
par stever
Faut que je lance LOAD DATA INFILE "nomdufichier.txt" INTO TABLE nomdelatable;
cette commande lit le fichier texte et insère dabs la table.
Les champs doivent être séparés par des tabulations et entouré d'apostrophe chaque ligne étant séparé par une séquence de nouvelle ligne \n
et les caractère spéciaux doivent être échappés par \
C'est bien quand on a fait le fichier texte en connaissant cela
mais si on a un fichier texte ou les champs ne sont pas séparé par des tabulation mais par des virgules et que chaque ligne n'est pas séparé par \n mais juste par un retour chariot
On fait comment (vous voyer je fais plein déforts)
Posté : 25 août 2006, 18:32
par Shrell
\n = retour chariot, donc de ce coté là pas de probleme
pour les virgules au lieu des tabulations, un simple rechercher/remplacer (disponible dans n'importe quel editeur de texte) fera l'affaire
vala
