在 MySQL 中表达识别和非识别关系

Expressing identifying and non-identifying relationships in MySQL

上下文

我正在学习识别和非识别关系,我想知道如何在 MySQL 中表达它们。为了练习,我一直在为口袋妖怪开发一个数据库。就上下文而言,每隔几年就会出现一个新版本的游戏并更新很多东西,例如某宝可梦可以使用的move可能会变得更强。此更新称为 generation。此外,每个 move 都有一个元素 type,例如火或水。

所以我的三个实体是 movegenerationtype。由于我想跟踪 Pokemon 如何随时间移动机会,因此 movegeneration 处于 identifying 关系。移动的名称不足以识别它,因为,例如generation 1 和 generation 2 中的移动“空手道印章”不同。因此 generationgenID 中相应的主键应该是我的主键的一部分move.

另一方面,我想将 type 作为外键存储在 move 中,但我相信这是一个 非识别 关系.每个move都有一个type,所以我相信这就是所谓的强制非识别关系。

我的尝试

那么我该如何在 MySQL 中写这个呢?我认为它会像

CREATE TABLE move (
  moveID int NOT NULL,
  genID int NOT NULL,
  typeID int NOT NULL,
  PRIMARY KEY (MoveID, GenID),
  CONSTRAINT FK_GenMove FOREIGN KEY (genID) REFERENCES generation(genID),
  CONSTRAINT FK_TypeMove FOREIGN KEY (typeID) REFERENCES type(typeID)
);

但是,我在我正在使用的 MySQL 书中找不到外键是主键一部分的示例(他们讨论了识别关系,但我找不到示例语法)。具体来说,我不确定列出约束的顺序是否重要(我应该先声明主键,然后再声明外键吗?)

指数

此外,我相信我的复合主键会自动成为 table 的聚集索引。一个常见的查询是通过 generation/genID 过滤 move。所以这应该自动有效,因为我在 genID 上有一个索引,即使它是复合键的一部分,对吧?还是需要单独为genID做一个单独的索引?

第二天我意识到的一件事是我声明主键的顺序很重要。 (moveID, genID) 将首先按 moveID 排序,然后按 genID 排序,而 (genID, moveID) 将按另一种方式排序。因为我提到我想要在我的原始 post 中的后一种情况的行为(在给定的 generation 中挑选出所有 move),而不是前一种情况,我觉得我应该指出。