语境
我正在学习识别和非识别关系,我想知道如何在 MySQL 中表达它们。为了练习,我一直在研究 Pokemon 的数据库。就上下文而言,每隔几年就会有一个新版本的游戏出现并更新很多东西,例如move
口袋妖怪可以使用的某个特性可能会变得更强。此更新称为generation
. 此外,每个move
都有一个元素type
,如火或水。
所以我的三个实体是move
,generation
和type
。由于我想跟踪口袋妖怪随着时间的推移如何移动机会,move
因此a与generation
. 移动的名称不足以识别它,因为例如移动“Karate Chop”在generation
1 和2 中是不同的。所以, ,generation
中的对应主键应该是我的主键的一部分。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 书中找不到外键是主键一部分的示例(他们讨论了识别关系,但我找不到语法示例)。具体来说,我不确定我列出约束的顺序是否重要(我应该先声明我的主键,然后是我的外键吗?)
指数
另外,我相信我的复合主键会自动成为我表的聚集索引。一个常见的查询是move
按generation
/过滤genID
。所以这应该自动有效,因为我有一个索引 on genID
,即使它是复合键的一部分,对吧?还是我需要单独创建一个单独的索引genID
?