Quelques questions pour une bonne conception de BDD

Quelques questions pour une bonne conception de BDD - SQL/NoSQL - Programmation

Marsh Posté le 02-07-2008 à 16:22:02    

Bonjour,
 
Je crée actuellement un site web qui s'appuie sur une base de données comprenant de nombreuses tables.
 
J'ai quelques questions parce que je veux faire les choses correctement.
 
1) Une clé primaire pour chaque table (hors tables de correspondance) qui est en fait un entier qui s'auto incrémente.
Est ce une bonne pratique ? Comment déclare-t-on qu'une colonne est la clé primaire d'une table ? et qu'elle doit s'autoincrémenter, dans le script de création de la table ?
 
2) Les clés primaire sont utilisées pour identifier de manière unique un tuple. Mais qu'est ce qu'une clé étrangère ? Comment doit-on s'en servir et comment doit-on les déclarer dans le script de création des tables ?
 
3) D'une manière générale, dans le script de création de base, quelles sont tous les paramèteres supplémentaires, non indispensables mais qui rendent les choses plus propres ? Je dis ça parce qu'une fois j'en ai vu un avec pas mal de chose que je connaissais pas à l'époque, comme par exemple des paramètres qui disaient "c'est la clé primaire", "ça s'autoincrémente", "ça comment à telle valeur" etc.
 
4) Les seuls types pour les données que je connais sont ceux proposés par la version de phpMyAdmin des pages perso de free.fr. Y'en existe-t-il d'autres ? Si oui, où puis-je trouver la liste complète ? Comment bien choisir ses types ?
 
5) Dans mon site, il y aura régulièrement des images qui vont être uploadées par les utilisateurs. Par quel mécanisme puis-je lié un fichier à l'entrée dans la base de données qui contient son nom ? C'est a dire que si le tuple qui contient un nom d'image vient à disparaitre, il faudrait aussi que le fichier correspondant disparaisse. J'aimerais qu'il n'y ait pas de désynchronisation entre fichiers et tuples des tables.
 
6) Avez vous des principes classiques qu'il convient d'appliquer pour bien créer son modèle de base de données ? Des erreurs à éviter ? (j'ai peu de connaissances et peu d'expériende en base de données)
 
7) Ca n'a rien a voir avec les bases de données mais je pose quand même la question. Mon site est un site qui va être hébergé chez free.fr, et on m'a dit qu'il était impossible de faire de l'AJAX à cause de ça. Or j'ai fait un peu d'AJAX et je ne vois absolument pas en quoi free.fr l'empêche puisqu'il s'agit simplement d'un javascript qui attaque un script PHP.
 
 
Merci pour vos réponses !

Message cité 1 fois
Message édité par cimourdain le 02-07-2008 à 16:22:20
Reply

Marsh Posté le 02-07-2008 à 16:22:02   

Reply

Marsh Posté le 02-07-2008 à 19:31:54    

cimourdain a écrit :

Bonjour,
 
Je crée actuellement un site web qui s'appuie sur une base de données comprenant de nombreuses tables.
 
J'ai quelques questions parce que je veux faire les choses correctement.
 
1) Une clé primaire pour chaque table (hors tables de correspondance) qui est en fait un entier qui s'auto incrémente.
Est ce une bonne pratique ? Comment déclare-t-on qu'une colonne est la clé primaire d'une table ? et qu'elle doit s'autoincrémenter, dans le script de création de la table ?

 
Oui c'est indispensable tout comme indexe..
Augemente la vitesse de recherche...
 
L'auto incrémentation est conseillé mais tu le trouveras pas sur toutes les SGBDR...comme oracle, Posgre, ect...
 
 
2) Les clés primaire sont utilisées pour identifier de manière unique un tuple. Mais qu'est ce qu'une clé étrangère ? Comment doit-on s'en servir et comment doit-on les déclarer dans le script de création des tables ?
 
 
Elle permet de faire la relation entre deux entités...
FOREING KEY = clé secondaire
 
 
3) D'une manière générale, dans le script de création de base, quelles sont tous les paramèteres supplémentaires, non indispensables mais qui rendent les choses plus propres ? Je dis ça parce qu'une fois j'en ai vu un avec pas mal de chose que je connaissais pas à l'époque, comme par exemple des  
paramètres qui disaient "c'est la clé primaire", "ça s'autoincrémente", "ça comment à telle valeur" etc.

 
Tout les paramètres sont indispensables, nom des champs, type des champs, valeur, ect...
 
 
4) Les seuls types pour les données que je connais sont ceux proposés par la version de phpMyAdmin des pages perso de free.fr. Y'en existe-t-il d'autres ? Si oui, où puis-je trouver la liste complète ? Comment bien choisir ses types ?
 
Tu peux la trouver sur le NET...
il en n'as des dizaines, toutes spécifiques en fonction de ce que tu veux rentrer comme valeur....
 
 
 
5) Dans mon site, il y aura régulièrement des images qui vont être uploadées par les utilisateurs. Par quel mécanisme puis-je lié un fichier à l'entrée dans la base de données qui contient son nom ? C'est a dire que si le tuple qui contient un nom d'image vient à disparaitre, il faudrait aussi que le fichier correspondant disparaisse. J'aimerais qu'il n'y ait pas de désynchronisation entre fichiers et tuples des tables.
 
 
Synchro ? non c'est à toi de gérer ça...en PHP par exemple ou dans le langage que t'auras choisi  !
 
 
6) Avez vous des principes classiques qu'il convient d'appliquer pour bien créer son modèle de base de données ? Des erreurs à éviter ? (j'ai peu de connaissances et peu d'expériende en base de données)
 
Avant de construire une base de donnée, une analyse s'impose, pour définir les champs, les entités, les valeurs, clé primaire, clé secondaire ect....En France la méthode MERISE est utilisé. Elle as + de 20 ans. Penche toi dessus et ca répondra à bon nombre de tes questions...
 
 
 
7) Ca n'a rien a voir avec les bases de données mais je pose quand même la question. Mon site est un site qui va être hébergé chez free.fr, et on m'a dit qu'il était impossible de faire de l'AJAX à cause de ça. Or j'ai fait un peu d'AJAX et je ne vois absolument pas en quoi free.fr l'empêche puisqu'il s'agit simplement d'un javascript qui attaque un script PHP.
 
Aucune idée...
 
 
Merci pour vos réponses !


 
Au vue des tes questions, t'as pas due en faire souvent ! Utilise la méthode d'analyse MERISE surtout si tu débute. Une fois que t'auras bien acquis ces concepts tu pourras créer ta base avec les tables, champs, ect...Il y a plein de spécificité à voir comme les cardinalités, ect....
 
Sans ça la conception risque d'être fausse et tu auras des soucis par la suite, quand tu vas coder...
C'est déjà arriver à bon nombre...
 
Bon courage
@ bientot

Reply

Marsh Posté le 03-07-2008 à 09:48:17    

cvb a écrit :


 
Au vue des tes questions, t'as pas due en faire souvent ! Utilise la méthode d'analyse MERISE surtout si tu débute. Une fois que t'auras bien acquis ces concepts tu pourras créer ta base avec les tables, champs, ect...Il y a plein de spécificité à voir comme les cardinalités, ect....
 
Sans ça la conception risque d'être fausse et tu auras des soucis par la suite, quand tu vas coder...
C'est déjà arriver à bon nombre...
 
Bon courage
@ bientot


 
Merci pour tes réponses.
Je n'arrive toutefois pas à comprendre l'intérêt d'une clé étrangère ni la manière dont concrètement on s'en sert.
 
Quand tu dit:

Citation :


Oui c'est indispensable tout comme indexe..  


ça veut dire que c'est la clé primaire qui sert aussi d'index, ça veut pas dire qu'il faut ajouter en plus une colonne indexe ?
 

Citation :


Tout les paramètres sont indispensables, nom des champs, type des champs, valeur, ect...  


non puisque j'ai déjà pu définir des tables sans clé primaire, j'avais un warning de phpMyAdmin. De même il me semble qu'en définissant une colonne indexe, il était capable de faire l'autoincrémentation tout seul, sans que je l'ai demandé.

Reply

Marsh Posté le 03-07-2008 à 12:33:33    

cimourdain a écrit :


 
Merci pour tes réponses.
Je n'arrive toutefois pas à comprendre l'intérêt d'une clé étrangère ni la manière dont concrètement on s'en sert.
 
Quand tu dit:

Citation :


Oui c'est indispensable tout comme indexe..  


ça veut dire que c'est la clé primaire qui sert aussi d'index, ça veut pas dire qu'il faut ajouter en plus une colonne indexe ?
 

Citation :


Tout les paramètres sont indispensables, nom des champs, type des champs, valeur, ect...  


non puisque j'ai déjà pu définir des tables sans clé primaire, j'avais un warning de phpMyAdmin. De même il me semble qu'en définissant une colonne indexe, il était capable de faire l'autoincrémentation tout seul, sans que je l'ai demandé.


 
Re,
 
Une clé primaire est affecter a un champs.  
Tout comme un index, qui peut être le même ou un autre...
C'est parce que tu définis une colone index, qu'elle est auto-incrementé...Tu dois le définir toi même...:)
 
Définir les tables sans clé primaire est une erreur notoire dans la conception d'une base. C'est obligatoire.
 
Il existe nombre de base de donnée, Access, MYSQL, PosGres, toutes sont différentes, mais le principe reste identique. Faut d'abord passer par l'étape de l'analyse en utilisant MERISE. Avant de conduire, tu apprends à conduire et tu passe ton permis, c'est la même chose...
 
 
 
 
 

Reply

Marsh Posté le 03-07-2008 à 16:26:33    

je ne comprends toujours pas l'utilité d'une clé étrangère ni comment on s'en sert en pratique !

Reply

Marsh Posté le 04-07-2008 à 09:23:07    

cimourdain a écrit :

je ne comprends toujours pas l'utilité d'une clé étrangère ni comment on s'en sert en pratique !


 
 
euh....je vais me répéter 50 fois ?  :heink:  
Commence par étudier la méthode d'analyse MERISE, tu auras la réponse à ta question...
 
http://fr.wikipedia.org/wiki/MERISE
http://www.commentcamarche.net/merise/concintro.php3
http://merise.developpez.com/
 
 
 
 
 

Reply

Marsh Posté le 04-07-2008 à 09:36:29    

Bon à part cet extrémiste de la méthode MERISE, personne peut me dire simplement ce qu'est une clé étrangère et comment on s'en sert ?
 
cvb, j'ai pas le temps de me taper tout un cours dont tu m'as dit toi même que cela occupait un partie de l'enseignement des informaticiens. J'attendais une réponse pratique et concrète en quelques lignes, comme par exemple dire qu'une clé primaire sert à identifier de manière unique un tuple, qu'elle peut aussi servir d'index parce que ça permet d'optimiser les temps d'accès et que concrètement ça s'implémente sous forme d'un entier autoincrémentable.
 
Tu vois c'est pas dur !

Reply

Marsh Posté le 04-07-2008 à 10:33:24    

une clé étrangère c'est un champ d'une table dans lequel tu stockes la valeur d'une clé primaire d'une autre table.
Par exemple, prenons une table "commande" et une table "produit". Dans produit tu as une clé primaire pour identifier les produits.
Dans commande tu auras un champs "id produit" qui pointera sur le produit concerné par la commande, ce champs est appelé "clé étrangère".


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 04-07-2008 à 10:42:11    

cimourdain a écrit :

Bon à part cet extrémiste de la méthode MERISE, personne peut me dire simplement ce qu'est une clé étrangère et comment on s'en sert ?
 
cvb, j'ai pas le temps de me taper tout un cours dont tu m'as dit toi même que cela occupait un partie de l'enseignement des informaticiens. J'attendais une réponse pratique et concrète en quelques lignes, comme par exemple dire qu'une clé primaire sert à identifier de manière unique un tuple, qu'elle peut aussi servir d'index parce que ça permet d'optimiser les temps d'accès et que concrètement ça s'implémente sous forme d'un entier autoincrémentable.
 
Tu vois c'est pas dur !


 
On peut pas t'epxliquer en 6 lignes les principes fondamentaux, le fonctionnement d'une base de donnée, ce n'est pas possible...C'est ça que j'essaye de t'epxliquer en vain depuis le départ... !  Y a des méthodes qui existent. Faut prendre le temps de les lires, de les étudier un mininum. Sans quoi ta base risque d'être archi fausse....  
 
On s'en rend compte quand on commence à dévelloper, lorsqu'on n'as du mal à récupérer des informations (ce n'est q'un exemple d'une base de donnée mal conçu. On peut être amené à la refaire entièrement à certains moment, ce qui engendre une perte de temps, ect...).
 
Avant de dévelloper une application,y a l'étape de l'analyse....
Faut pas mettre la charue avant les boeufs...
 
 
Pour la définition que tu veux, ça m'as pris  10 secondes...
http://fr.wikipedia.org/wiki/Cl%C3 [...] ng%C3%A8re
 
 
 
 
 

Reply

Marsh Posté le 04-07-2008 à 10:46:51    

anapajari a écrit :

une clé étrangère c'est un champ d'une table dans lequel tu stockes la valeur d'une clé primaire d'une autre table.
Par exemple, prenons une table "commande" et une table "produit". Dans produit tu as une clé primaire pour identifier les produits.
Dans commande tu auras un champs "id produit" qui pointera sur le produit concerné par la commande, ce champs est appelé "clé étrangère".


 
 
L'exemple que tu site c'est dans le cas d'une cardinalité 1,n => 1,1....
Si c'est du :
 

  • 1,n => 1,n
  • 0,n => 0,n
  • 1,1 => 1,1


L'exemple donné n'est pas bon... ;)

Reply

Marsh Posté le 04-07-2008 à 10:46:51   

Reply

Marsh Posté le 04-07-2008 à 11:07:43    

cvb a écrit :

On peut pas t'epxliquer en 6 lignes les principes fondamentaux, le fonctionnement d'une base de donnée, ce n'est pas possible...C'est ça que j'essaye de t'epxliquer en vain depuis le départ... !  Y a des méthodes qui existent. Faut prendre le temps de les lires, de les étudier un mininum. Sans quoi ta base risque d'être archi fausse....


Si l'idée de départ de le convaincre à l'utilisation de Merise est louable, elle est également complétement détachée de la réalité. Il est difficile d'aborder les concepts de merise tout seul dans son coin devant un site et surtout je pense qu'il en a rien à péter de savoir faire une 2FN avec des dépendances complètes.

 
cvb a écrit :

L'exemple que tu site c'est dans le cas d'une cardinalité 1,n => 1,1....
Si c'est du :

  • 1,n => 1,n
  • 0,n => 0,n
  • 1,1 => 1,1

L'exemple donné n'est pas bon... ;)


tu le fais exprès? c'est un exemple... Si un exemple couvre tous les cas on appele plus ça un exemple.
edit: d'ailleurs tu remarqueras que l'exemple donné par ton lien n'est pas bon dans tous les cas non plus.

 

Message cité 1 fois
Message édité par anapajari le 04-07-2008 à 11:08:48

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 04-07-2008 à 11:21:57    

anapajari a écrit :


Si l'idée de départ de le convaincre à l'utilisation de Merise est louable, elle est également complétement détachée de la réalité. Il est difficile d'aborder les concepts de merise tout seul dans son coin devant un site et surtout je pense qu'il en a rien à péter de savoir faire une 2FN avec des dépendances complètes.
 


 

anapajari a écrit :


tu le fais exprès? c'est un exemple... Si un exemple couvre tous les cas on appele plus ça un exemple.
edit: d'ailleurs tu remarqueras que l'exemple donné par ton lien n'est pas bon dans tous les cas non plus.
 


 
MERISE est pas une méthode facile, à appréhender je suis d'accord, mais il pas impossible d'aborder les concepts principaux (MCD, MPD, Cardinalités,...) tout seul. Rien ne l'empêche de poser des questions dessus, s'il comprends pas quelques chose.  
Se passer de cette méthode là pour concevoir une base, me parait léger....
 
Je suis d'accord pour le lien également.  
C'est ce que je reproche aux exemples, d'oublier la moitié des élèments....


Message édité par cvb le 04-07-2008 à 11:22:16
Reply

Marsh Posté le 04-07-2008 à 11:31:37    

Pour faire simple sur les clefs etrangeres.
Il arrivera que dans plusieurs tables tu doives representer la meme information
Exemple simplifié de ce que j'utilise en ce moment pour atribuer des droits a des utilisateurs

 

Table Users
champ1 clef primaire, int, userId
champ2 varchar, username

 

Table rights
champ1 clef primaire, int, rightId
champ2 varchar, rightDescription

 

Table user-rights (qui dit que tel user a tels droits)
champ1 clef primaire, int, userRightsId
champ2 cle etrangere, int, userId
champ3 cle etrangere, int, rightId

 

ce sont des clefs etrangeres car l'userId et le rightId doivent exister dans les autres tables pour qu'il y est un sens a la derniere table.

 

J'espere que c'est clair

Message cité 2 fois
Message édité par Toinou87 le 04-07-2008 à 11:32:43

---------------
Toinou87 ;-p May the force be with you!!
Reply

Marsh Posté le 04-07-2008 à 11:35:18    

Toinou87 a écrit :

Pour faire simple sur les clefs etrangeres.
Il arrivera que dans plusieurs tables tu doives representer la meme information
Exemple simplifié de ce que j'utilise en ce moment pour atribuer des droits a des utilisateurs
 
Table Users
champ1 clef primaire, int, userId
champ2 varchar, username
 
Table rights
champ1 clef primaire, int, rightId
champ2 varchar, rightDescription
 
Table user-rights (qui dit que tel user a tels droits)
champ1 clef primaire, int, userRightsId
champ2 cle etrangere, int, userId
champ3 cle etrangere, int, rightId
 
ce sont des clefs etrangeres car l'userId et le rightId doivent exister dans les autres tables pour qu'il y est un sens a la derniere table.
 
J'espere que c'est clair


 
 
Une précision ? Un utilisateur possède plusieurs droits, et un droits peut être affecter à plusieurs utilisateurs c'est bien ce que tu as mis ? Relation 1,n  - 0,n  ?


Message édité par cvb le 04-07-2008 à 11:36:56
Reply

Marsh Posté le 04-07-2008 à 12:32:41    

oui un utilisateur peut avoir plusieurs droits. et un meme droit peut etre affecter a plusieurs utilisateurs
mais c'est simplifier
en vrai j'ai
 
user
permission
role
role-permission
user-role
 
c'est la facon pour attribuer des droits qd on developpe pour de nombreux utilisateurs avec des roles differents dans l'applications (les permissions etant les droits atomiques sur l'application (consulter cette table, mettre a jour ce champ...))


---------------
Toinou87 ;-p May the force be with you!!
Reply

Marsh Posté le 04-07-2008 à 12:38:01    

ok, je comprends mieux, la relation 1,n => 1,n que je ne comprennais pas....:)

Reply

Marsh Posté le 04-07-2008 à 15:38:27    

anapajari a écrit :

une clé étrangère c'est un champ d'une table dans lequel tu stockes la valeur d'une clé primaire d'une autre table.
Par exemple, prenons une table "commande" et une table "produit". Dans produit tu as une clé primaire pour identifier les produits.
Dans commande tu auras un champs "id produit" qui pointera sur le produit concerné par la commande, ce champs est appelé "clé étrangère".


 
Merci c'est ce que j'avais besoin de savoir.
 
Tu vois cvb c'était pas dur ;)

Reply

Marsh Posté le 04-07-2008 à 15:43:01    

Toinou87 a écrit :

Pour faire simple sur les clefs etrangeres.
Il arrivera que dans plusieurs tables tu doives representer la meme information
Exemple simplifié de ce que j'utilise en ce moment pour atribuer des droits a des utilisateurs
 
Table Users
champ1 clef primaire, int, userId
champ2 varchar, username
 
Table rights
champ1 clef primaire, int, rightId
champ2 varchar, rightDescription
 
Table user-rights (qui dit que tel user a tels droits)
champ1 clef primaire, int, userRightsId
champ2 cle etrangere, int, userId
champ3 cle etrangere, int, rightId
 
ce sont des clefs etrangeres car l'userId et le rightId doivent exister dans les autres tables pour qu'il y est un sens a la derniere table.
 
J'espere que c'est clair


 
C'est parfaitement clair et ça se prette très bien à mon cas. Merci.
En fait j'avais dejà fait ce que t'as décrit (c'est ce que j'appelais les tables d'associations dans mon premier poste, sauf que je mettais pas de clé primaire de telles tables) je savais pas que ça s'appelait clé étrangère.
 
 
 
@cvb: merci à toi aussi, c'est louable de vouloir faire apprendre la théorie, je suis un peu comme toi aussi d'habitude, mais là j'ai vraiment pas le temps.

Reply

Marsh Posté le 04-09-2008 à 18:17:14    

Deux petits points:
 
- Est-il exact qu'on peut se passer d'une clé primaire pour les tables qui servent à mettre en correspondances des clés primaires d'autres tables lorsqu'on a des relation 1-n ou n-n ?
 
- Quel est l'intérêt de définir une colonne comme indexe si on a déjà une clé primaire ? Comment choisit-on un indexe ?

Reply

Marsh Posté le 04-09-2008 à 18:42:35    

cimourdain a écrit :

Deux petits points:
 
- Est-il exact qu'on peut se passer d'une clé primaire pour les tables qui servent à mettre en correspondances des clés primaires d'autres tables lorsqu'on a des relation 1-n ou n-n ?
 
- Quel est l'intérêt de définir une colonne comme indexe si on a déjà une clé primaire ? Comment choisit-on un indexe ?


 
 
Bonjour,
 
1 - Quand on n'as des relations 1,n => 1,n ou 0,n=>0,n, une entité supplémentaires est alors crée contenant les deux clés primaires des entités de part et d'autres. Il n'y  a pas de clé primaire dans la "nouvelle" entité.
 
2- C'est pour augmenter les recherches.
 
A Bientôt

Reply

Marsh Posté le 04-09-2008 à 22:37:45    

cvb a écrit :


 
2- C'est pour augmenter les recherches.
 


 
 
comprends pas ce que tu veux dire...
Et comment on choisit quelle colonne va être index ?

Reply

Marsh Posté le 05-09-2008 à 08:48:08    

cimourdain a écrit :


 
 
comprends pas ce que tu veux dire...
Et comment on choisit quelle colonne va être index ?


 
Ca augmente la vitesse de rercherche...et on choisi un élèment pertinant qu'est recherché "régulièrement" :)

Reply

Marsh Posté le 05-09-2008 à 13:53:26    

Ok merci.
 
Autre question:
 
Je connais SET NULL et CASCADE comme action pour ON DELETE. J'ai vu qu'il existait également NO ACTION et RESTRICT. A quoi ça correspond et quand doit-on les utiliser ?


Message édité par cimourdain le 05-09-2008 à 14:06:38
Reply

Marsh Posté le 09-09-2008 à 16:54:16    

up + une autre question:
 
Dans une table concernant un utilisateur j'ai choisi de mettre comme clé primaire son login soit un varchar(32), le problème c'est que le validateur de mon formulaire du framework que j'utilise (Symfony) considère que c'est invalide, alors que si je met le classique integer autoincrémenté ça fonctionne bien. Des idées ?

Reply

Marsh Posté le 09-09-2008 à 19:55:25    

Bonsoir,
 
Pour ta 1er question : http://forum.hardware.fr/hfr/Progr [...] 5672_1.htm Au sujet de la seconde, peut tu nous dire sur quelle base de donnée tu travaille ? Mysql ? (il faut savoir qu'il est judicieux de prendre des clés primaire de type numérique, la recherche est plus rapide...)
 
 
A Plutard
Cvb
 
Ps : Si c'est Mysql donne nous la structure de ton entité ! t'as due faire une erreur, comme mettre auto_increment, sur un champs texte...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed