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

时间:2012-05-20 03:05:52

标签: mysql sql primary-key

我有两张桌子:

  • 人(personID,姓名,地址,电话,电子邮件)
  • 玩家(dateOfBirth,学校)

我会使用哪些代码,因此我可以在Person和Player表中使用 personID 作为主键

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

4 个答案:

答案 0 :(得分:2)

目前尚不清楚您需要两个表来获取此信息,除非有代表的人不是玩家。我们假设情况就是这样(其他人可以是教练,父母,裁判等)。此外,即使教练确实出生,他们的出生日期对系统来说也不重要(因此不需要将出生日期转回人员表)。另外,假设您正在与只上过一所学校的人打交道;如果他们去年在不同的学校,玩家记录将在季节之间更新。 (如果您需要有关不同年份参加的学校的历史信息,您将需要一个不同的表格结构。)假设您在适当的时候会向Player表中添加更多字段,这也是合理的。

在这种情况下,您需要将播放器数据链接回正确的人:

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整数而不是学校名称来加入;这往往更紧凑。

答案 1 :(得分:2)

首先,您还应该在personID表中添加Player

完成后,您可以将personID作为Player表的主键,也可以有一个单独的playerID列,这可以是主键

您选择哪一个取决于您的应用程序的要求。如果您认为某个玩家只与一个人相关联,而且只有一个人,则personId可以成为主键。

但是在很多情况下你需要一个单独的playerId(我建议有一个)。例如,如果不对电脑游戏进行建模,则所有玩家可能不是人 - personId将是null。此外,如果您对与足球运动员不同的篮球运动员进行建模,则同时玩这两种游戏的人可以在玩家表中具有多个条目(具有相同personId的多个记录)。

答案 2 :(得分:0)

您是否可以像管理人员表一样添加personID字段并进行管理?每次插入播放器时,都必须插入具有相同ID的相应人员。

当然,如果你的人的概念是抽象的,那么它应该完全在同一个表中

答案 3 :(得分:0)

我建议您将出生日期字段从“玩家”表格移动到“人物”表格(毕竟,一个人没有多个出生日期!),然后将“personID”字段添加到'玩家'表。如果一个人有多个学校(小学,中高,高),那么'玩家'表的主键应该是personID + school。

将一个表的主键作为第二个表中的主键肯定没有问题;这样的第二个表可以帮助节省磁盘空间并缩短访问时间。假设存在一个大文本字段存储给某些人 - 但不是所有人 - 。将此字段存储在辅助表中(使用相同的主键)将意味着只有需要此字段的人才会在辅助表中显示记录。