在 MySQL 中表达识别和非识别关系
Expressing identifying and non-identifying relationships in MySQL
上下文
我正在学习识别和非识别关系,我想知道如何在 MySQL 中表达它们。为了练习,我一直在为口袋妖怪开发一个数据库。就上下文而言,每隔几年就会出现一个新版本的游戏并更新很多东西,例如某宝可梦可以使用的move
可能会变得更强。此更新称为 generation
。此外,每个 move
都有一个元素 type
,例如火或水。
所以我的三个实体是 move
、generation
和 type
。由于我想跟踪 Pokemon 如何随时间移动机会,因此 move
与 generation
处于 identifying 关系。移动的名称不足以识别它,因为,例如generation
1 和 generation
2 中的移动“空手道印章”不同。因此 generation
、genID
中相应的主键应该是我的主键的一部分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
),而不是前一种情况,我觉得我应该指出。
上下文
我正在学习识别和非识别关系,我想知道如何在 MySQL 中表达它们。为了练习,我一直在为口袋妖怪开发一个数据库。就上下文而言,每隔几年就会出现一个新版本的游戏并更新很多东西,例如某宝可梦可以使用的move
可能会变得更强。此更新称为 generation
。此外,每个 move
都有一个元素 type
,例如火或水。
所以我的三个实体是 move
、generation
和 type
。由于我想跟踪 Pokemon 如何随时间移动机会,因此 move
与 generation
处于 identifying 关系。移动的名称不足以识别它,因为,例如generation
1 和 generation
2 中的移动“空手道印章”不同。因此 generation
、genID
中相应的主键应该是我的主键的一部分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
),而不是前一种情况,我觉得我应该指出。