首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >架构-2外键到同一主键?

架构-2外键到同一主键?
EN

Stack Overflow用户
提问于 2011-03-08 11:12:13
回答 3查看 858关注 0票数 3

我有两个表,名为TeamsMatches -我希望能够添加一个Match,它由两个团队组成,但也能够获得特定Team的所有匹配。

我能做的是:

  • A:在TeamsMatches
  • B之间建立多对多的关系))在Matches表中增加两个列,名为HomeTeamAwayTeam,这是指Teams表中的一个团队的外键。H 214f 215

我们都同意B听起来最好,因为我知道每次参加比赛的球队的确切数量--对吗?

现在,当在我的实体中声明这种关系时,我需要与Match实体有两个多对一的关系,因为Match实体有两个引用Team的外键--如果外键/引用的数量必须是来自MatchTeam的相同,那么我将得到这样的结果:

// Team.cs

代码语言:javascript
复制
public class Team
{
    public virtual int ID { get; private set; } 
    public virtual string TeamName { get; set; } 
    public virtual Cup Cup { get; set; } 
    public virtual IList<Match> HomeMatches { get; set; } 
    public virtual IList<Match> AwayMatches { get; set; } 
    public virtual IList<Match> Matches
    {
        get { return HomeMatches.Concat(AwayMatches).ToList(); }
    } 

    public Team()
    {
        HomeMatches = new List<Match>(); 
        AwayMatches = new List<Match>();
    }
}

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        Id(x => x.ID); 
        Map(x => x.TeamName).Not.Nullable(); 
        References(x => x.Cup, "CupID"); 
        HasMany(x => x.HomeMatches).KeyColumn("HomeTeamID").Inverse().Cascade.AllDeleteOrphan(); 
        HasMany(x => x.AwayMatches).KeyColumn("AwayTeamID").Inverse().Cascade.AllDeleteOrphan(); 

        Table("Teams");
    }
}

// Match.cs

代码语言:javascript
复制
public class Match
{
    public virtual int ID { get; private set; } 
    public virtual Team HomeTeam { get; set; } 
    public virtual Team AwayTeam { get; set; } 
    public virtual int WinnerID { get; set; } 
    public virtual Cup Cup { get; set; }
}

public class MatchMap : ClassMap<Match>
{
    public MatchMap()
    {
        Id(x => x.ID); 
        Map(x => x.WinnerID); 
        References(x => x.HomeTeam, "HomeTeamID"); 
        References(x => x.AwayTeam, "AwayTeamID"); 
        References(x => x.Cup, "CupID"); 

        Table("Matches");
    }
}

如代码所示,那么我将不得不使用.Concat()来合并团队的HomeMatches和AwayMatches,以获得特定团队的所有匹配。

这真的是最好的方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-08 14:58:03

B是最好的方法,因为A有点像鲱鱼。在比赛和球队之间,你并不想要很多,但你不想要他们的原因并不是因为你知道一场比赛中会有多少队,而是因为一场比赛实际上已经是团队间的许多关系了。

在这种情况下,当两个团队之间有很多到多个关系时,就称之为匹配,并且它有自己的属性集(时间、日期、位置.)。

比赛一定要有两把外键给球队,因为比赛是你的多对多的一桌。

票数 3
EN

Stack Overflow用户

发布于 2011-03-09 13:32:47

在关系模型中,它看起来像这样。所以两个外键是可以的,HomeTeamIDAwayTeamID被称为角色名

票数 2
EN

Stack Overflow用户

发布于 2011-03-08 14:58:14

事实上,这可能是最好的方法。我认为您只是对这样一个事实有问题:您需要将两个列表连接在一起才能完成一个看似简单的查询。但是,您所使用的结构不仅仅是将两个团队关联在一起,而是提供了一个几乎分层的结构,即HomeTeam = Parent,AwayTeam = Child。

如果你想简单地把这两者联系起来,你可以像你说的那样创建多对多:

代码语言:javascript
复制
[Team]

[MatchTeam]
TeamID
MatchID
IsHomeTeam

[Match]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5231653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档