3

我有两张桌子:

  • 人员(personID、姓名、地址、电话、电子邮件)
  • 球员(出生日期,学校)

我将使用什么代码,以便我可以使用 Person 中的personID作为Person 和 Player 表中的主键?

我知道playerID也必须是 Player 中的外键。有任何想法吗?

4

4 回答 4

2

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

在这种情况下,您需要将 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 整数而不是学校名称来加入;这往往更紧凑。

于 2012-05-20T03:12:39.133 回答
2

首先,您也应该personIDPlayer表中。

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

您选择哪一种取决于您的应用程序的要求。如果您认为一个玩家只会与一个人关联,并且绝对是一个人,那么personId可以是主键。

但在许多情况下,您需要一个单独的playerId(我建议拥有一个)。例如,如果不是建模计算机游戏,则所有玩家可能都不是人 -personId将是null。此外,如果您对不同于足球运动员的篮球运动员建模,则同时玩这两种游戏的人在 player 表中可能有多个条目(多个记录相同personId)。

于 2012-05-20T03:26:22.737 回答
0

您可以添加一个 personID 字段并像管理 person 表一样管理它吗?每次插入玩家时,都必须插入具有相同 id 的相应人员。

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

于 2012-05-20T03:08:46.417 回答
0

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

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

于 2012-05-20T03:13:23.513 回答