0

语境

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

所以我的三个实体是move,generationtype。由于我想跟踪口袋妖怪随着时间的推移如何移动机会,move因此ageneration. 移动的名称不足以识别它,因为例如移动“Karate Chop”在generation1 和2 中是不同的。所以, ,generation中的对应主键应该是我的主键的一部分。generationgenIDmove

另一方面,我想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 书中找不到外键是主键一部分的示例(他们讨论了识别关系,但我找不到语法示例)。具体来说,我不确定我列出约束的顺序是否重要(我应该先声明我的主键,然后是我的外键吗?)

指数

另外,我相信我的复合主键会自动成为我表的聚集索引。一个常见的查询是movegeneration/过滤genID。所以这应该自动有效,因为我有一个索引 on genID,即使它是复合键的一部分,对吧?还是我需要单独创建一个单独的索引genID

4

1 回答 1

0

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

于 2021-11-11T16:58:48.823 回答