Bonjour tout le monde :) ,

j'ai un problème pour créer ma base de données pour un système de parrainage.
J'utilise le logiciel Mysql Worbench, et voici ce que j'ai fais pour mon système de parrainage :

Voici mes tables, ce qui me derange, en particulier, c'est la table parrainage...

Un parrain c'est quoi, un filleul (donc le pseudo du filleul que j'ai nommé filleul est qui est un varchar), puis le parrain, qui est l'id de la table users. Mais j'ai l'impression qu'il manque quelque chose a ma table :-° ...

Merci d'avance pour vos remarques.

Cordialement Elo.

13 réponses


un parain peut etre parrain plusieurs fois et un filleul parrain à son tour ?
parce que si c'est ca... ca va etre delicat à faire propre ^^

eloyas
Auteur

C'est exactement sa :) ...

alors je mettrais un champ filleul dans la table membre (parrain_id par exemple) et dans une autre table je mettrais les liens de parrains : parrain et filleul les champs de la table (qui forment à eux deux la clé primaire) comme ca, un membre a un parain : celui qui est dans la table membre (parrain_id) et un parrain a plusieurs filleul (dans la table parrains)

le membre 1 a le membre 3, 5 et 20 comme filleuls, dans la table parrain tu as 3 lignes : (1,3); (1,5) et (1,20) et dans la table membres, tu as 4 lignes : (1,null ou 0 selon ce que tu veux y mettre); (3,1); (5,1); (20,1) où pour ces trois derniers, le premier chiffre est l'id du membre et le deuxieme celui du parrain.

je pense que c'est pas mal comme ca. si tu as beaucoup besoin d'utiliser le parrain du membre, mets le dans la meme table, sinon, tu peux le mettre dans une autre, ca évite les redondance et c'est mieux :) (bien que dans tous les cas, la deuxieme méthode, sans champ en plus dans la table membre soit recomandée)

si tu as d'autres questions...

ps : désolé pour le temps, j'avais oublié titre du sujet dans le quel j'avais posté ^^

eloyas
Auteur

Pour le temps c'est pas grave ^^ .

Mais je n'est pas tout saisi sur le fonctionnement :-° .

Cordialement Elo.

Je ne suis pas certain de saisir ce que tu souhaite faire, mais je crois que tu n'es pas parti sur la bonne base. Je pense qu'il faut plutôt que tu parte sur une association réflexive pour ta table users. Je suis désolé, j'ai aucun logiciel pour faire de l'UML, alors je te laisse voir sur internet à quoi ça ressemble. A priori il te faut une association réflexive "un à plusieurs".
Par contre je peux te mettre 2 images de mon cours, si ça peut t'aider:
http://img64.imageshack.us/img64/5643/uml1.png
http://img191.imageshack.us/img191/7251/uml2w.png

oui ca peut se faire pour certaines l'association réflexive (un filleul à un parrain) mais pas pour l'autre parce qu'un parrain a plusieurs filleuls

je ferais ca moi :

membres(<u>id</u>, login, pass, mail, confirmation, temps, role_id);
roles(<u>id</u>, name, slug, level);
parrains(<u>parrain</u>, <u>filleul</u>);

les noms soulignés forment la clé primaire
et là tu as bien : un membre a un parrain et tu as un membre a 1 ou plusieurs filleul dans la table parrain avec le parrain toujours à gauche et son filleul toujours à droite, comme ca quand tu veux tous les filleuls, tu fais une requete du gere

SELECT * FROM parrains WHERE parrain = $id GROUP BY parrain

a l'inverse, si tu veux le parrain du membre, tu fais :

SELECT * FROM parrains WHERE filleul =$id

et tu auras un seul résultat ;)

flohw, ce que tu dis est faux et ne marche pas, en tous cas tes requêtes ne retournent pas ce que tu souhaite. Le solution est belle est bien l'association réflexive un à plusieurs.

J'ai fait un schéma sous photoshop pour représenter l'association:

Niveau SQL ça donne:

Create table users
(
    id int auto_increment primary key,
    login varchar(60) not null,
    pass varchar(255) not null,
    mail varchar(60) not null,
    confirmation varchar(30),
    temps int,
    parrain varchar(60),
    Constraint FK_users foreign key(parrain) references users(id)
)

On a alors la configuration suivante:

  • un users peut avoir un parrain

  • uun users peut être parrain plusieurs fois

Pour récupérer les filleuls d'un parain:

SELECT * FROM users WHERE parain='$id_parain'

Pour récupérer le parrain d'un filleul:

SELECT * FROM users WHERE id='$id_parrain'

ca qui revient au meme avec une table de moins donc mieux effectivement

Je viens de comprendre ton code, en fait ça peut marcher, oui. Mais ça complique un peu les requêtes SQL et ça autorise une filleul à avoir plusieurs parrains. Je dois dire que je pensais pas me servir de ça un jour quand je l'ai vu en cours! x)

ouai mais c'est effectivement ce qu'il faut utiliser :p

Pourquoi pas juste utiliser un champ parrain_id dans la table membres.
Une jointure la où ça va bien et le tour est joué. A part si tu a besoin de chaque filleul de chaque membre mais même ça tu peux le faire avec un simple traitement php.

C'est le principe de l'association réflexive JLou :)
Le problème de sélectionner chaque filleul de chaque membre, c'est qu'une partie des membres qui est parrain aura été filleul, ça promet comme requête! :)

En même temps l'intérêt de cette requête est plutôt limité (voire complètement inexistant). Mais en PHP tu dois pouvoir le faire en partant de la liste des membres avec un algo de complexité O(n) non ?

<?php 
$links = array();
foreach($membres as $m)
{
    $links$m->parrain_id]] = $m;
}

Un code du genre devrait faire l'affaire.