Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2991 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Clés primaires/étrangères obligatoires?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Clés primaires/étrangères obligatoires?

n°1985389
ganguill
Posté le 19-04-2010 à 10:17:51  profilanswer
 

Bonjour,
 
j'ai quelques questions au sujet d'une base de données très particulière que je dois traiter... Quelques tables sont assez volumineuses (plusieurs millions de lignes), voilà pourquoi je voulais créer des clés primaires/étrangères afin d'accélerer la recherche lors de futures jointures.
 
J'ai donc une table T1 avec plusieurs informations, dont une clé primaire (numéro de téléphone).  
Je possède également une autre table T2 avec un champ numéro de téléphone également, mais ici de temps en temps certaines occurences sont en double (donc pas de clé étrangère possible de T1 vers T2)
 
1ère question: les clés primaires et étrangères sont-elles forcément obligatoires dans une base de données?  
2ème question: si quelques tables n'ont pas de relations primaires/étrangères (mais possèdent pourtant des infos communes afin de les jointer), mais que d'autres dans la base sont elles reliées par des clés primaires/étrangères, est-ce grave?
 
ps: je suis sous Oracle10g via Sql*Plus, bien que ce ne soit pas important ici  ;)  
 
Merci à tous  :D

mood
Publicité
Posté le 19-04-2010 à 10:17:51  profilanswer
 

n°1985401
olivthill
Posté le 19-04-2010 à 10:42:36  profilanswer
 

La théorie des bases de données relationnelles a été établie, il y a longtemps de cela, par Edward F. Codd. Il a défini des "règles de normalisation". Voir http://support.microsoft.com/kb/283878/fr , http://en.wikipedia.org/wiki/Boyce-Codd_normal_form , http://en.wikipedia.org/wiki/First_normal_form , http://en.wikipedia.org/wiki/Second_normal_form , http://en.wikipedia.org/wiki/Third_normal_form .

n°1985404
skeye
Posté le 19-04-2010 à 10:45:11  profilanswer
 

ganguill a écrit :

(donc pas de clé étrangère possible de T1 vers T2)


 
Depuis quand?[:autobot]
 

ganguill a écrit :

 
1ère question: les clés primaires et étrangères sont-elles forcément obligatoires dans une base de données?  
2ème question: si quelques tables n'ont pas de relations primaires/étrangères (mais possèdent pourtant des infos communes afin de les jointer), mais que d'autres dans la base sont elles reliées par des clés primaires/étrangères, est-ce grave?
 
ps: je suis sous Oracle10g via Sql*Plus, bien que ce ne soit pas important ici  ;)  
 
Merci à tous  :D


1) Non, mais après il ne faut pas se plaindre si les données ne sont pas consistantes ou si les jointures sont lentes...
2) Non...mais cf 1)


---------------
Can't buy what I want because it's free -
n°1985405
ganguill
Posté le 19-04-2010 à 10:51:30  profilanswer
 

Donc ça suppose que chaque table doit comporter une clé primaire, ça d'accord.
Mais pour ce qui est des clés étrangères, je suis embêté...
Si ma table T1 possède les informations suivantes:
 
T1
TEL_T1 | NOM | PRENOM
0445653433 | MARTIN | MICHEL
etc..
 
et que ma Table T2 est comme ceci:
TEL_T2 | VALEUR
0445653433 |  tata
0445653433  | toto
 
 
Comment est-ce-possible de relier ces deux tables? Car T1 possède le champ "TEL_T1" en clé primaire, mais la table T2 ne possède pas de clé primaire (je peux mettre un ID mais qui ne me servirait à rien). J'aurais aussi pu mettre TEL_T2 en UNIQUE, mais tu remarques bien que c'est impossible dans mon cas (plusieurs milliers de numéros de téléphones sont en doubles, et doivent le rester).
 
Il n'y a que par les numéros de téléphones que je peux relier ces tables  :(  
 
Merci pour la doc en tout cas  :)

n°1985408
ganguill
Posté le 19-04-2010 à 10:54:53  profilanswer
 

skeye : Merci pour les réponses ;) Justement, je ne demande qu'à les relier moi ces tables :p Le problème c'est que là je coince.. (je ne cherche pas de requêtes toutes faites hein, ça je sais faire^^), c'est juste que je me demande bien comment faire le lien entre ces tables..
 
Pour résumer: je souhaiterai donc avoir TEL_T1 en clé primaire de T1, et une clé étrangère vers TEL_T2 (mais qui malheureusement ne peut pas être unique ou clé primaire..).

n°1985409
skeye
Posté le 19-04-2010 à 10:55:41  profilanswer
 

ganguill a écrit :

Donc ça suppose que chaque table doit comporter une clé primaire, ça d'accord.
Mais pour ce qui est des clés étrangères, je suis embêté...
Si ma table T1 possède les informations suivantes:
 
T1
TEL_T1 | NOM | PRENOM
0445653433 | MARTIN | MICHEL
etc..
 
et que ma Table T2 est comme ceci:
TEL_T2 | VALEUR
0445653433 |  tata
0445653433  | toto
 
 
Comment est-ce-possible de relier ces deux tables? Car T1 possède le champ "TEL_T1" en clé primaire, mais la table T2 ne possède pas de clé primaire (je peux mettre un ID mais qui ne me servirait à rien). J'aurais aussi pu mettre TEL_T2 en UNIQUE, mais tu remarques bien que c'est impossible dans mon cas (plusieurs milliers de numéros de téléphones sont en doubles, et doivent le rester).
 
Il n'y a que par les numéros de téléphones que je peux relier ces tables  :(  
 
Merci pour la doc en tout cas  :)


 
Dans ta table 2 la colonne tel_t2 peut très bien être une clé étrangère qui référence la colonne tel_t1 de la table T1.


---------------
Can't buy what I want because it's free -
n°1985410
skeye
Posté le 19-04-2010 à 10:56:59  profilanswer
 

Une clé étrangère n'a aucun besoin d'être unique, et si tu n'accèdes aux données de T2 que via une jointure par T1 alors T2 n'a aucun besoin de clé primaire. A la rigueur tu peux mettre le couple (tel_t2, valeur), mais a priori ça n'a aucun intérêt.


Message édité par skeye le 19-04-2010 à 10:57:32

---------------
Can't buy what I want because it's free -
n°1985412
ganguill
Posté le 19-04-2010 à 11:03:52  profilanswer
 

skeye a écrit :

Dans ta table 2 la colonne tel_t2 peut très bien être une clé étrangère qui référence la colonne tel_t1 de la table T1.


 
 
Je l'ai déjà testé tout à l'heure, mais j'obtiens cette erreur :
 

Code :
  1. ALTER TABLE T2 ADD CONSTRAINT fk_TEL FOREIGN KEY(TEL_T2) REFERENCES T1(TEL_T1);
  2. ERREUR à la ligne 2 :
  3. ORA-02298: cannot validate (xxx.FK_ND) - parent keys not found


 
 
Si je veux simplement créer une clé étrangère de T1 vers T2 avec uniquement TEL_T1 en clé primaire de T1, j'obtiens cette erreur:

Code :
  1. ALTER TABLE T1 ADD CONSTRAINT fk_TEL FOREIGN KEY(TEL_T1) REFERENCES T2(TEL_T2)
  2.                                                             *
  3. ERREUR à la ligne 2 :
  4. ORA-02270: no matching unique or primary key for this column-list


 
 
Donc là je désespère  :(

n°1985413
ganguill
Posté le 19-04-2010 à 11:06:55  profilanswer
 

Donc le vrai problème n'est pas la clé primaire de T2, mais plutôt le champ TEL_T2 (apparemment j'ai lu dans les docs que le champ référencé (donc ici TEL_T2) doit être unique ou être la clé primaire de T2.
Ce qui correspondrait ici à mon erreur (ORA-02270).. :(

n°1985422
olivthill
Posté le 19-04-2010 à 11:41:12  profilanswer
 

Il peut exister des clés étrangères sans qu'il soit nécessaire de créer des constraints.
 
Il faut toujours vérifier ses données avant de faire des insertions, donc, il faut mplémenter les contraintes dans les programmes d'accès aux bases de données. Mais si on implémente aussi les contraintes dans la base de données elle-même, cela fait un travail en double qui ralentit la base, et qui empêche les chargements en masse, et surtout qui empêche de faire des tests avec des données partielles, et donc contribue à faire des programmes mal testés, et donc probablement buggués.
 
Donc, d'une manière générale, il faut mettre le minimum de contraintes dans les bases de données. Et dans l'exemple données, cela n'est pas nécessaire du tout.

mood
Publicité
Posté le 19-04-2010 à 11:41:12  profilanswer
 

n°1985427
ganguill
Posté le 19-04-2010 à 11:49:18  profilanswer
 

olivthill a écrit :


Donc, d'une manière générale, il faut mettre le minimum de contraintes dans les bases de données. Et dans l'exemple données, cela n'est pas nécessaire du tout.


 
 
Merci beaucoup pour ta réponse :) Je ne vais pas mettre de clés étrangère de ma table T1 vers T2 (où même l'inverse), tout simplement car j'ai pu lire que ce problèmé était dû à des numéros de téléphones qui peuvent se trouver dans T2 mais qui n'apparaitraient pas dans T1.
Si j'ai le temps je chercherai les numéros de T2 posant problème, et je les supprimeraient en conséquence (afin donc de pouvoir créer ma clé étrangère de T1 vers T2).
 
Merci encore :)

n°1985769
tony-974
Humble motard, c'est rare
Posté le 20-04-2010 à 10:19:36  profilanswer
 

Bonjour,
 
J'ai une question de logique concernant une partie de la création d'une base mysql (test) :
Imaginons deux tables : MAGASIN, BONBON
MAGASIN ( magasin_id , magasin_name , magasin_city )
BONBON ( bonbon_type , bonbon_libele , bonbon_price , ?magasin_id )
 
La relation serait pour un type de bonbon et un magasin il y a un prix. Je ne sais pas s'il faut mettre magasin_id en clé étrangère et/ou primaire dans la table bonbon car ça ne fonctionne pas avec mysql.
 
Je ne sais pas (ou plus...) comment m'y prendre pour arriver à ce que je souhaite. Je pense que c'est basique pour un initié, ça serait gentil de m'éclairer.
 
Merci   :)


---------------
¤ JOE BAR TEAM ¤
n°1985783
Fred999
Rabat-joie
Posté le 20-04-2010 à 10:32:57  profilanswer
 

Tu crées une troisième table : PRIX (magasin_id pk/fk, bonbon_type pk/fk, prix).
 
PS : il est bien de faire une recherche, mais sur cette cat en particulier, il vaut quand même mieux avoir 1 seul problème/utilisateur par sujet.

n°1985813
tony-974
Humble motard, c'est rare
Posté le 20-04-2010 à 11:17:14  profilanswer
 

Merci Fred999;
Je ne voulais pas créer un nouveau sujet inutilement ;-)
Dois-je le faire à l'avenir ?


---------------
¤ JOE BAR TEAM ¤
n°1985814
skeye
Posté le 20-04-2010 à 11:18:19  profilanswer
 

tony-974 a écrit :

Merci Fred999;
Je ne voulais pas créer un nouveau sujet inutilement ;-)
Dois-je le faire à l'avenir ?


oui, squatter le sujet de quelqu'un d'autre, c'est mal.:o


---------------
Can't buy what I want because it's free -
n°1985936
tony-974
Humble motard, c'est rare
Posté le 20-04-2010 à 14:46:28  profilanswer
 

Très bien.
Cela dit j'ai une autre question liée à ma première.
Puis-je continuer ici ou faut-il que je créer un nouveau sujet pour le coup ?


---------------
¤ JOE BAR TEAM ¤
n°1985938
Fred999
Rabat-joie
Posté le 20-04-2010 à 14:50:38  profilanswer
 

Crée un nouveau sujet :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Clés primaires/étrangères obligatoires?

 

Sujets relatifs
Balise vidéo dans une page xHTML ? + styler liste de mots clésboucler sur les clés
url avec mots clés quel impact référencement?Tri dictionnaire par clés
2 Clés étrangères sur une table[JSP/Html/JS] Champs obligatoires dans un formulaire
Formulaire avec champs obligatoiresrecheche par mots clés
recherche dans une base de mot clés 
Plus de sujets relatifs à : Clés primaires/étrangères obligatoires?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR