Chtite question pratique [MySQL]

Eléphant du PHP | 377 Messages

25 mai 2007, 13:38

Hello les gens
Alors je me pose juste une question existentielle, je sais que les deux solutions que je vais exposer marchent mais j'aimerais savoir ce qui est le plus "propre" selon vous :

Alors le problème : deux tables, on va dire NEWS et DISCIPLINES, reliées par une table NEWS_DISCIPLINES
quand je mets à jour une news, je peux changer les disciplines auxquelles elle se rapporte.
Donc que faire :
1)

Code : Tout sélectionner

REPLACE INTO NEWS_DISCIPLINES SET (id_news, id_discipline) VALUES ($machin, $truc)
puis un DELETE de toutes celles qui n'ont plus de raison d'être (récupérées via PHP ou tout autre moyen)

2)

Code : Tout sélectionner

DELETE FROM NEWS_DISCIPLINES WHERE id_news=$truc
puis

Code : Tout sélectionner

INSERT INTO NEWS_DISCIPLINES SET (id_news, id_discipline) VALUES ($machin, $truc)
voila, c'est quasiment équivalent, mais y en a-t-il une à préférer à l'autre?
merki :)
Petit scarabée deviendra grand

Mammouth du PHP | 19672 Messages

25 mai 2007, 13:54

Autre option :
$sql = "UPDATE NEWS_DISCIPLINES ".
       "SET id_discipline = ". $truc ." ".
       "WHERE id_news = ". $machin .";";
Une seule requête et à mon avis plus propre.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 377 Messages

25 mai 2007, 13:55

Oui sauf que c'est une table de liaison, donc y'a un lien n:m entre les deux tables, je ne peux donc pas faire ce que tu proposes
Petit scarabée deviendra grand

Mammouth du PHP | 19672 Messages

25 mai 2007, 13:56

:shock: Voudrais-tu préciser ? J'ai un sérieux doute là :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 377 Messages

25 mai 2007, 13:59

Bah une news peut être concernée par X disciplines, et idem dans l'autre sens:
Ma news du premier janvier concerne le skate et le snowboard, celle du 2 fevrier concerne le skate et le ski, celle du 5 fevrier concerne le snow tout seul
donc il me faut bien une table de liaison entre les deux nan? (ou alors faut que je remette à plat tout ce que j'ai fait depuis quelques mois lol)
Petit scarabée deviendra grand

Mammouth du PHP | 19672 Messages

25 mai 2007, 14:26

Alors sois plus restrictif dans la clause WHERE en précisant la valeur de chacune des deux parties de la clé.
$sql = "UPDATE NEWS_DISCIPLINES ".
       "SET id_discipline = ". $truc ." ".
       "WHERE id_news = ". $machin ." ".
       "AND id_discipline = ". $chose .";";
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 377 Messages

25 mai 2007, 19:57

Nan, je crois qu'on arrive pas à se comprendre #-o
imagine que j'ai rentré la news en disant que c'était du skate, et qu'en fait c'est du vélo. Quand je fais la mise à jour, je ne connais pas les anciennes valeurs (et à vrai dire elles ne m'interessent pas), je veux juste mettre les nouvelles
Je suis plus clair?
Petit scarabée deviendra grand

Mammouth du PHP | 19672 Messages

25 mai 2007, 21:38

Bon, on va reprendre d'après ce que j'ai compris.
Tu as deux tables plus une relation, le tout ressemble à ceci:

Code : Tout sélectionner

+-----------------+ +----------------+ +-----------+ | news | | news_rubrique | | rubrique | +-----------------+ +----------------+ +-----------+ | news_id |----| news_id |----| rub_id | | news_txt | | rub_id | | rub_txt | +-----------------+ +----------------+ +-----------+
Dans ton système de gestion, tu es actuellement capable de relier une news à une ou plusieurs rubrique(s).
Si une news est liee a plusieurs rubriques, tu auras autant de lignes dans la relation que tu as de lien. Dans tous les cas, tu es donc en mesure d'identifier précisément une ligne pour un lien spécifique en disposant à la fois de la clé de la news et de celle de la rubrique.

Partant de là, avec le type de requête que je t'ai suggéré, tu effectues le changement de rubrique simplement en ajustant la colonne dans la relation, remplaçant l'ancienne par la nouvelle clé.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 mai 2007, 21:53

L'embêtant c'est qu'on se retrouve à faire le delta des enregistrements en PHP donc avec plein de code à taper lorsque le nombre de disciplines associées change. Par exemple, si une news se trouvaient en "skate" et "velo" et que finalement c'était du golf on se retrouve à effacer un enregistrement et mettre à jour l'autre. Dans l'autre sens il faut mettre à jour un enregistrement puis en ajouter un autre.

C'est pour cela que je recommanderais plutôt de faire un DELETE de toutes les disciplines associées suivi d'un INSERT (multiple, donc une seule requête, peu importe le nombre de disciplines). Ce n'est pas particulièrement performants si tu fais des microbenchmakrs, mais à l'échelle du site c'est insignifiant et ça réduit la taille du code PHP associé par 2 et augmente sa simplicité de maintenance par 2πr² :P

Eléphant du PHP | 377 Messages

25 mai 2007, 22:42

oki, merki les gens, je mets un ptit [Résolu] :wink:
Petit scarabée deviendra grand