Quelques questions pour une bonne conception de BDD - SQL/NoSQL - Programmation
Marsh Posté le 02-07-2008 à 19:31:54
cimourdain a écrit : Bonjour, |
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
Marsh Posté le 03-07-2008 à 09:48:17
cvb 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 : |
ç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 : |
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é.
Marsh Posté le 03-07-2008 à 12:33:33
cimourdain a écrit :
|
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...
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 !
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 ?
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/
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 !
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".
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 ? |
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
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. |
L'exemple que tu site c'est dans le cas d'une cardinalité 1,n => 1,1....
Si c'est du :
L'exemple donné n'est pas bon...
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....
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.
Marsh Posté le 04-07-2008 à 11:21:57
anapajari a écrit : |
anapajari a écrit : |
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....
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
Marsh Posté le 04-07-2008 à 11:35:18
Toinou87 a écrit : Pour faire simple sur les clefs etrangeres. |
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 ?
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...))
Marsh Posté le 04-07-2008 à 12:38:01
ok, je comprends mieux, la relation 1,n => 1,n que je ne comprennais pas....
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. |
Merci c'est ce que j'avais besoin de savoir.
Tu vois cvb c'était pas dur
Marsh Posté le 04-07-2008 à 15:43:01
Toinou87 a écrit : Pour faire simple sur les clefs etrangeres. |
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.
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 ?
Marsh Posté le 04-09-2008 à 18:42:35
cimourdain a écrit : Deux petits points: |
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
Marsh Posté le 04-09-2008 à 22:37:45
cvb a écrit : |
comprends pas ce que tu veux dire...
Et comment on choisit quelle colonne va être index ?
Marsh Posté le 05-09-2008 à 08:48:08
cimourdain a écrit : |
Ca augmente la vitesse de rercherche...et on choisi un élèment pertinant qu'est recherché "régulièrement"
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 ?
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 ?
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...
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 édité par cimourdain le 02-07-2008 à 16:22:20