I am designing a new application to track sports statistics with code-first migration. I have the bare minimum POCO setup. The problem is that I am not happy with the design specifically how the players, teams and tournaments are relating to each other. I appreciate any comments and suggestions. **PlayerAccount class:** /// <summary> /// Player account is a separate entity from the actual user account. /// Player account allows a user to join teams and participate in a tournament. /// </summary> public class PlayerAccount { [Key] public int Id { get; set; } [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } /// <summary> /// TournamentPlayerKeys tells us which team this player is competing with /// in a certain tournament. /// </summary> public virtual ICollection<PlayerTeamKey> PlayerTeamKeys { get; set; } public virtual ICollection<PlayerMatchStat> PlayerMatchStats { get; set; } } **Team class:** using System.Collections.Generic; using System.ComponentModel.DataAnnotations; /// <summary> /// Team can be formed by a single user or a group of user. You'll need a team to join a tournament. /// A single user can form his own team. /// </summary> public class Team { [Key] public int Id { get; set; } [Required] public string Name { get; set; } public virtual ICollection<PlayerTeamKey> PlayerTeamKeys { get; set; } public virtual ICollection<TeamTournamentKey> TeamTournamentKeys { get; set; } } **Tournament class:** using System.Collections.Generic; using System.ComponentModel.DataAnnotations; /// <summary> /// Tournaments are basically a collection of games in one event. /// For example, Summer 2014 Basketball League. /// </summary> public class Tournament { [Key] public int Id { get; set; } [Required] public string Name { get; set; } public virtual ICollection<TeamTournamentKey> TeamTournamentKeys { get; set; } public virtual ICollection<TournamentMatch> TournamentMatches { get; set; } } On a tournament there are multiple instances of matches (games): /// <summary> /// Match represents one occurence of a game in a league. /// </summary> public class TournamentMatch { [Key] public int Id { get; set; } [Required] public int Tournament_Id { get; set; } [ForeignKey("Tournament_Id")] public virtual Tournament Tournament { get; set; } public virtual ICollection<TournamentMatchResult> TournamentMatchResults { get; set; } } And of course we have multiple instances of match results in one match. The `Score` property determines who is the winner. /// <summary> /// This is the result of a league match. /// </summary> public class TournamentMatchResult { [Key] public int Id { get; set; } [Required] public int Match_Id { get; set; } [Required] public int Team_Id { get; set; } [Required] public double Score { get; set; } [ForeignKey("Match_Id")] public virtual TournamentMatch TournamentMatch { get; set; } [ForeignKey("Team_Id")] public virtual Team Team { get; set; } public virtual ICollection<PlayerMatchStat> PlayerMatchStat { get; set; } } I have a multipart key that creates the relationship between a player and a team: /// <summary> /// This is a multipart key class that defines a player as part of a team. /// Mind the naming convension, from smaller entity to a bigger entity; Player > Team. /// </summary> public class PlayerTeamKey { [Required] public int PlayerAccount_Id { get; set; } [Required] public int Team_Id { get; set; } [ForeignKey("PlayerAccount_Id")] public virtual PlayerAccount Player { get; set; } [ForeignKey("Team_Id")] public virtual Team Team { get; set; } } And I have another like that for team and tournament: /// <summary> /// This is a multipart key class that is a combination of a team id and a tournament id. /// This basically tells us that the team with the given id is going to participating on a tournament with the given id. /// </summary> public class TeamTournamentKey { [Required] public int Team_Id { get; set; } [Required] public int Tournament_Id { get; set; } [ForeignKey("Team_Id")] public virtual Team Team { get; set; } [ForeignKey("Tournament_Id")] public virtual Tournament Tournament { get; set; } }