Tom's Guide > Forum > Programmation > [PHP/MySQL]Eviter les Doublons[resolu]

[PHP/MySQL]Eviter les Doublons[resolu]

Forum Programmation : [PHP/MySQL]Eviter les Doublons[resolu]

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonjour à tous,

Je vous expose mon (douloureux) problème:
J'ai 3 tables:

  • Une tables 'objets', dont les champs sont id, foo.
  • Une table 'users' dont les champs sont id, bar
  • Une table de lien l_objet_user dont les champs sont id_user,id_objet (et éventuellement un 3°champ id)


Je souhaite éviter les doublons dans la table l_objet_user.

Apres réflexion, je vois deux facons de procéder:

1)Verifier et supprimer les doublons apres l'insertion, soit automatiquement,soit ponctuellement (au travers d'un script PHP qu'on appelle manuellement par exemple).
2)Prévenir la formation des doublons
2a)En PHP, on récupere les éléments de la base l_objet_user, et on vérifie que l'élément quon veut insérer ne s'y trouve pas déja.
2b)Avec MySQL, en utilisant un systeme de cle primaire,cle unique, ... Les doublons sont detecté par le SGDB a l'insertion, on ne les insere donc pas.

Mais voila les problemes que je rencontre:
1)C'est pas super. L'execution automatique du script de 'purge' doit ralentir l'execution globale. D'autre part, l'execution ponctuelle laisse les doublons trop longtemps dans la base, et ca peut poser des problemes.

2a)Ca fait une requete en plus, a laquelle on ajoute le traitement en PHP. Si j'étais tout seul, c'est ce que je ferais,car c'est dans mes cordes en matiere de programmation, et ca me parait mieux que 1).
2b)A mon avis,c'est l'idéal. Le probleme, c'est que je ne connais/comprends pas grand chose aux clés primaires/composées/uniques/étrangeres. De plus, je ne sais meme pas si c'est effectivement possible avec mySQL.

Voila, en espérant que quelqu'un puisse me dépetrer un peu.

Merci :).


Message édité par Halike le 30-08-2007 à 14:46:18
------------------------------ "Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life."
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Solution 2b, bien sur. Le reste, c'est des bricolages. Des méthodes comme Merise peuvent t'aider à concevoir ta base de données correctement dès le départ , le problème c'est qu'il faut les apprendre... Et si y'a juste ça, c'est pas vraiement nécessaire.
Certains logiciels, une fois le modèle créé, permettent de générer directement le code pour créer les tables et tout.

Donc ce que tu peux faire, c'est mettre en clé primaire id pour objets, id pour users, et ou bien id_user et id_objet comme clé primaire (si y'a qu'un lien possible entre un objet et un utilisateur), sinon utilise ton champ id, ou autre chose...
(Je n'ai pas testé et je ne garantis rien! :) )

Répondre à Rakipu

Ce que je ferai, c'est de mettre un UNIQUE sur les deux colonnes.
UNIQUE(id_user, id_object);
Et donc, il ne peut y avoir un même couple qu'une seule fois.

------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

Merci à vous deux,c'est exactement le type d'information que je recherchais.
J'ai donc utilisé une clé unique sur lesdeux colonnes:

Code :
  1. ALTER TABLE `l_objet_user` ADD UNIQUE ( `id_user` , `id_objet` )


Et ca produit l'efet désiré.

Sinon, Rakipu,si tu as des liens instructifs sur Merise et tout ca, je suis preneur: ca ne peut pas faire de mal d'apprendre des trucs utiles.

Bonne journée :)

------------------------------ "Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life."
Répondre à Halike
Tom's Guide > Forum > Programmation > [PHP/MySQL]Eviter les Doublons[resolu]
Aller à :

Il y a 281 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens