隐含不同外键的属性

时间:2016-10-25 19:39:09

标签: sql database database-design

我在研究数据库时遇到了问题。 假设有关系:

SomeEntity (
  id int PRIMARY KEY
);

CompletelyAnotherEntity (
  id int PRIMARY KEY
);

Competition (
  competitor1 FOREIGN KEY REFERENCES SomeEntity, 
  competitor2 FOREIGN KEY REFERENCES CompletelyAnotherEntity
  winner FOREIGN KEY REFERENCES ???
);

winner关系中哪种类型应具有Competition属性?它应该引用什么?

我想出了一个定义两个属性winner1引用SomeEntitywinner2引用CompletelyAnotherEntity的解决方案。其中一个可以是null,但同时无法定义。我认为这不是一个正确的解决方案,所以请帮我妥善解决这个问题。

4 个答案:

答案 0 :(得分:1)

我分别为GladiatorWinsCompetitionAnimalWinsCompetition使用两个关系变量(你可以只使用一个并推断另一个)。

稍微清理模式(使用更有用的实体名称,使relvars中的属性名称保持一致,始终包含数据类型):

Gladiator (
  GladiatorId int PRIMARY KEY
);

Animal (
  AnimalId int PRIMARY KEY
);

Competition (
  GladiatorId int FOREIGN KEY REFERENCES Gladiator, 
  AnimalId int FOREIGN KEY REFERENCES Animal,
  PRIMARY KEY ( GladiatorId, AnimalId )
);

GladiatorWinsCompetition (
  GladiatorId int, 
  AnimalId int,
  PRIMARY KEY ( GladiatorId, AnimalId ),
  FOREIGN KEY ( GladiatorId, AnimalId ) REFERENCES Competition
);

AnimalWinsCompetition (
  GladiatorId int, 
  AnimalId int,
  PRIMARY KEY ( GladiatorId, AnimalId ),
  FOREIGN KEY ( GladiatorId, AnimalId ) REFERENCES Competition
);

答案 1 :(得分:0)

我很难想到有两个不同实体竞争的比赛。我希望这样的事情:

Competitors (
  CompetitorId int PRIMARY KEY
);

Competition (
  competitor1 FOREIGN KEY REFERENCES Competitors(CompetitorId), 
  competitor2 FOREIGN KEY REFERENCES Competitors(CompetitorId),
  winner FOREIGN KEY REFERENCES Competitors(CompetitorId)
);

答案 2 :(得分:0)

competitor(id)
gladiator(id) -- FK to competitor
animal(id) -- FK to competitor
competition(gid,aid,cid) -- FKs to gladiator, animal & competitor

如果DBMS无法为您提供所需的列联合类型,请

gladiator(id,gtype)
animal(id,atype)

如果角斗士和/或动物的外部语言类型不是本机DBMS,其中type,gtype或atype可以在某些原生DBMS类型中表示它们,也可以使用。

观察给定表中的值是如何独立于DBMS或外部类型系统键入值的。

答案 3 :(得分:0)

为什么你需要让胜利者参考?

CHECK((竞争对手1,竞争对手2)中的获胜者)是您真正需要的。作为FK的获胜者仍将为竞争对手3(竞争者1,竞争者2)的赢家留下空间。这对你来说是否合理?

修改

我故意忽略已经有已知竞争对手但尚未成为知名竞赛者的预定/正在进行的比赛的问题。