Clés primaires/étrangères obligatoires?

Clés primaires/étrangères obligatoires? - SQL/NoSQL - Programmation

Marsh Posté le 19-04-2010 à 10:17:51    

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

Reply

Marsh Posté le 19-04-2010 à 10:17:51   

Reply

Marsh Posté le 19-04-2010 à 10:42:36    

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 .

Reply

Marsh Posté le 19-04-2010 à 10:45:11    

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 -
Reply

Marsh Posté le 19-04-2010 à 10:51:30    

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  :)

Reply

Marsh Posté le 19-04-2010 à 10:54:53    

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..).

Reply

Marsh Posté le 19-04-2010 à 10:55:41    

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 -
Reply

Marsh Posté le 19-04-2010 à 10:56:59    

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 -
Reply

Marsh Posté le 19-04-2010 à 11:03:52    

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  :(

Reply

Marsh Posté le 19-04-2010 à 11:06:55    

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).. :(

Reply

Marsh Posté le 19-04-2010 à 11:41:12    

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.

Reply

Marsh Posté le 19-04-2010 à 11:41:12   

Reply

Marsh Posté le 19-04-2010 à 11:49:18    

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 :)

Reply

Marsh Posté le 20-04-2010 à 10:19:36    

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 ¤
Reply

Marsh Posté le 20-04-2010 à 10:32:57    

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.

Reply

Marsh Posté le 20-04-2010 à 11:17:14    

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


---------------
¤ JOE BAR TEAM ¤
Reply

Marsh Posté le 20-04-2010 à 11:18:19    

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 -
Reply

Marsh Posté le 20-04-2010 à 14:46:28    

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 ¤
Reply

Marsh Posté le 20-04-2010 à 14:50:38    

Crée un nouveau sujet :o

Reply

Sujets relatifs:

Leave a Replay

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