2010-08-28 5 views
1

Nouveau pour les bases de données mysql ici. J'ai une table d'utilisateurs et une table d'équipes. Un utilisateur peut être sur plus d'une équipe. Quelle est la meilleure façon de stocker la relation entre un utilisateur et quelles équipes il est? Disons qu'il y a des centaines d'équipes, chaque équipe compte environ 20 utilisateurs, et en moyenne un utilisateur peut compter environ 10 équipes, notez également que les utilisateurs peuvent changer d'équipe de temps en temps.mysql: comment gérer les relations entre les utilisateurs et les équipes?

Je peux éventuellement ajouter une colonne à ma table TEAMS qui contient une liste d'identifiants d'utilisateurs, mais je devrais ajouter une colonne à ma table USERS qui contient une liste d'identifiants d'équipe. Bien que cela puisse être une solution, cela semble désordonné pour la mise à jour de l'adhésion. Il semble qu'il pourrait y avoir une façon plus intelligente de gérer cette information ... Comme une autre table peut-être? Pensées?

Merci! Ps, quel est le meilleur type de champ pour stocker une liste, et quelle est la meilleure façon de délimiter?

Répondre

4

Quel est le meilleur type de champ pour stocker une liste, et quel est le meilleur moyen de le délimiter?

C'est généralement une très mauvaise idée d'essayer de stocker plusieurs valeurs dans une seule colonne. C'est un enfer à traiter et vous n'aurez jamais une intégrité référentielle adéquate.

Ce que vous cherchez vraiment, c'est un join table. Par exemple:

CREATE TABLE user_teams (
    user_id INT NOT NULL FOREIGN KEY REFERENCES users(id), 
    team_id INT NOT NULL FOREIGN KEY REFERENCES teams(id), 
    PRIMARY KEY (user_id, team_id) 
); 

donc il peut y avoir un certain nombre de team_id s pour un user et un certain nombre de user_id s pour une team. (Mais la clé primaire assure qu'il n'y a pas double emploi avec les correspondances du même utilisateur et équipe.)

ensuite pour sélectionner les détails de l'équipe pour un utilisateur, vous pouvez dire quelque chose comme:

SELECT teams.* 
FROM user_teams 
JOIN teams ON teams.id= user_teams.team_id 
WHERE user_teams.user_id= (...some id...); 
+0

+1 mais pourquoi avez-vous déclaré les deux comme clés primaires? – Eldelshell

+0

Parfait. Exactement ce que je cherchais. Merci. – ctown4life

+0

@Ubersoldat: Parce qu'il arrêterait les doublons de la combinaison user_id/team_id, tout en permettant des combinaisons différentes de user_id avec divers team_ids et vice versa. –

Questions connexes