我在研究数据库时遇到了问题。 假设有关系:
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
引用SomeEntity
和winner2
引用CompletelyAnotherEntity
的解决方案。其中一个可以是null
,但同时无法定义。我认为这不是一个正确的解决方案,所以请帮我妥善解决这个问题。
答案 0 :(得分:1)
我分别为GladiatorWinsCompetition
和AnimalWinsCompetition
使用两个关系变量(你可以只使用一个并推断另一个)。
稍微清理模式(使用更有用的实体名称,使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)的赢家留下空间。这对你来说是否合理?
修改
我故意忽略已经有已知竞争对手但尚未成为知名竞赛者的预定/正在进行的比赛的问题。