SQL:两个拥有相同主键的表

3

我有两张表:

  • Person(personID,name,address,phone,email)
  • Player(dateOfBirth,school)

如果我想在Person和Player表中都使用Person中的personID作为主键,应该用什么代码?

我知道playerID也必须是Player表中的外键。有什么想法吗?

4个回答

2
这段内容涉及IT技术,需要翻译成中文。假设有一些非球员人员(比如教练、家长、裁判等)也需要被记录在内,那么就需要两个表来存储信息。虽然教练也是出生的,但是他们的出生日期对系统并不重要,因此不需要将出生日期传回到人员表中。另外,假设这些人只在一个学校上学,如果他们去年在另一所学校就读,那么在两个赛季之间,球员记录将会被更新。(如果需要记录历史上就读过的学校,需要采用不同的表结构)。当然,未来可能还会向球员表中添加更多字段。在这种情况下,需要将球员数据与正确的人员联系起来。
CREATE TABLE Player
(
    PlayerID     INTEGER NOT NULL PRIMARY KEY REFERENCES Person(PersonID),
    DateOfBirth  DATE NOT NULL,
    School       VARCHAR(20) NOT NULL REFERENCES School(SchoolName)
);

我假设学校列表是有限的。您可以使用SchoolID整数代替学校名称进行连接;这通常更加紧凑。


是的,我为了问题简化它了。还有一个playerTeam、coach、coachTeam表,我也要在其中使用personID。我能否对这些表执行您建议的操作? - batsta13
是的,你也可以为其他表做“相同”的操作。 - Jonathan Leffler

2

首先,Player表中应该有personID

完成上述操作后,你可以将personID作为Player表的主键,或者可以拥有一个单独的playerID列,并将其作为主键。

选择哪种方式取决于你的应用程序要求。如果你认为一名玩家只与一个人相关联且绝对只有一个人,则personId可以是主键。

但在许多情况下,你需要一个单独的playerId(我建议使用),例如,如果你不是模拟计算机游戏,则并非所有玩家都是人- personId将为null。此外,如果你将篮球运动员和足球运动员建模为不同的对象,那么打这两个游戏的人可能会在Player表中具有多个条目(具有相同的personId的多个记录)。


0

你能否添加一个personID字段,并以与person表相同的方式进行管理?每次插入一个player,都需要插入相应的具有相同id的person。

当然,如果你的person概念是抽象的,那么它肯定应该在同一张表中。


0

我建议您将出生日期字段从“Player”表移至“person”表中(毕竟,一个人不会有多个出生日期!),然后在“player”表中添加“personID”字段。如果一个人有多所学校(小学,初中,高中),则“player”表的主键应为personID + school。

让一个表的主键作为第二个表的主键肯定没有问题;这样的第二个表可以帮助节省磁盘空间并提高访问速度。假设有一个要存储的大型文本字段,但并非所有人都需要存储该字段。在一个辅助表中存储此字段(具有相同的主键)意味着只有需要此字段的人才会在辅助表中有记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接