2009-06-23 9 views
4

J'ai certaines tables qui bénéficient de tables plusieurs-à-plusieurs. Par exemple la table d'équipe.Une table de jointure plusieurs-à-plusieurs peut-elle contenir plus de deux colonnes?

Un membre de l'équipe peut détenir plus d'une 'position' dans l'équipe, toutes les positions sont listées dans la table db de position. Les positions précédentes tenues sont également stockées pour cela, j'ai une table séparée, donc je

  • table membre (contenant les détails de l'équipe)
  • de table positions (positions contenant)
  • table member_to_positions (id de membre et id de la position)
  • member_to_previous_positions (id de membre et id de la position)

simples, mais le point crucial est maintenant qu'un membre de l'équipe peut appartenir à plusieurs équipes aghhh. J'ai déjà une table de correspondance team_to_member. Maintenant, le problème vient de savoir comment lier un poste à une équipe? Un membre peut avoir été chef d'équipe dans une équipe et est actuellement responsable de l'équipe radio et responsable de la presse dans une équipe différente. Comment puis-je tirer l'info par membre pour montrer sa position actuelle, mais aussi son passé, y compris les anciennes équipes. Ai-je besoin d'ajouter une position à une table d'équipe et d'y faire des références croisées, ou puis-je ajouter l'équipe à la table des positions?

Tout est très confus, cette normalisation.

Répondre

5

Il est tout à fait légitime d'avoir une table de TeamPositionMember, avec les colonnes

Team_Id 
Position_Code 
Member_Id 
Start_Date 
End_Date NULLABLE 

Et et une colonne d'identification de remplacement pour la clé primaire si vous voulez; sinon, il s'agit d'une clé primaire composite à trois champs. (Vous aurez toujours besoin d'une contrainte d'unicité.)

Avec cet arrangement, vous pouvez avoir une équipe avec n'importe quel ensemble de positions. Une équipe peut avoir zéro ou plusieurs personnes par position. Une personne peut remplir zéro ou plusieurs postes pour zéro ou plusieurs équipes.

EDIT:

Si vous voulez les dates, révisent comme indiqué ci-dessus, et ajouter start_date au PK pour permettre à la même personne de tenir la même position à des moments différents.

+0

Ahh droite, donc je peux attribuer une clé primaire à plus de 2 colonnes, c'est intéressant. (Im en utilisant mysql workbench pour construire cela). Donc, vous cochez PK par champ. –

+0

Il y a beaucoup de répétitions dans ce modèle, cependant ... – Matchu

+0

Répétition? Cela devrait être le minimum, avec des doublons empêchés. – dkretz

0

On dirait que vous avez besoin d'une position plusieurs-à-plusieurs positions pour les équipes maintenant.

+0

il semble que je vais finir avec autant de tables plusieurs-à-plusieurs que je suis des tables de stockage de données, est-ce normal !! –

+0

c'est si l'application nécessite plusieurs à plusieurs relations .... :) – Stuart

+0

he il, ouais je suppose que je n'ai tout simplement jamais travaillé avec quelque chose comme ça. Essentiellement, les membres peuvent être dans n'importe quelle équipe, travailler n'importe quelle position, les équipes font des événements, qui ont des emplacements, qui changent tous et se croisent, et gardent l'histoire! de nombreuses façons, je peux les séparer si j'ai besoin de faire de simples requêtes simples! thnkx –

0

Votre table team_to_member peut en effet avoir une colonne supplémentaire position_id pour décrire (ou dans ce cas pointer vers) la position du membre dans cette équipe.

+0

Mais si le joueur peut avoir plusieurs positions, cela échoue ... – Matchu

+0

Pas si ces positions sont pour des équipes différentes. Un joueur peut-il avoir des positions différentes dans la même équipe? Ensuite, il devient plus compliqué .. – MSpreij

+0

Oui, pensez à une équipe comme un équipage de yacht! Un membre peut être un skipper dans l'équipe A, et aussi l'homme de la presse dans l'équipe A. Mais quand il s'ennuie, il est aussi juste un winchman dans l'équipe B pour quelque chose à faire! Si je cherche l'équipe B, je veux voir le nom de tous les membres, leur position sur l'équipe B et peut-être aussi les autres équipes et positions des membres! Confus je sais! –

4

Ma première pensée:

Donnez votre many-to-many tableau équipes/membres une colonne d'identité. Chaque relation d'équipe à membre a maintenant un identifiant.

Créez ensuite des positions de liaison plusieurs-à-plusieurs aux relations d'équipe-membre. De cette façon, les équipes peuvent avoir plusieurs membres, les membres peuvent avoir plusieurs équipes et les membres peuvent avoir plusieurs positions par équipe.

Maintenant, tout est beau et sec, et tout le lien semble fonctionner. Est-ce que cela sonne juste à quelqu'un d'autre?

+0

Sonne juste pour moi. Jamais vu une table de lien de many-to-many lier une table régulière à une autre table de lien de many-to-many (ouf), astuce soignée. – MSpreij

+0

Matchu, avec la table many-to-many d'une équipe à l'autre, si j'ajoute un identifiant, est-ce que j'en fais un index et garde l'identifiant team_id et l'attribut member_id en tant que clé primaire commune? Ou ne pas l'avoir comme un index? –

+0

Où puis-je ajouter la date jointe, date de fin à l'équipe ou à la table de position. c'est compliqué. –

0

Débarrassez-vous de la table member_to_previous_position. Il suffit d'utiliser member_to_positions et ont ces colonnes:

MemberToPositionID (autoincrement OK only) 
MemberID 
PositionID 
StartDate 
EndDate 

ensuite de trouver des positions actuelles, vous faites:

select * 
from member_to_positions 
where EndDate is null 
+0

Qu'en est-il de la liaison aux équipes? – Matchu

6

Oui, un grand nombre à plusieurs table de jonction peut avoir des attributs supplémentaires (colonnes). Par exemple, s'il existe une table appelée Table PassengerFlight codée par PassengerID et ID vol, il peut y avoir une troisième colonne indiquant l'état du passager donné sur le vol donné. Deux statuts différents peuvent être "confirmés" et "listés en attente", chacun étant codé d'une manière ou d'une autre. En outre, il peut y avoir des relations ternaires, des relations impliquant trois entités et pas seulement deux. Ces tables vont avoir trois clés étrangères qui ensemble sont la clé primaire pour la table de relation.

+1

Walter a vraiment aimé cette idée, ça m'a aidé à mieux comprendre le concept, j'ai choisi le dorfier comme bonne réponse car son exemple m'a aidé avec la date, et il a posté en premier :) souhaite que je puisse attribuer la deuxième place! –

Questions connexes