Database 没有钥匙的桌子不好吗?
我有下表,代表足球比赛期间发给球员的卡片:Database 没有钥匙的桌子不好吗?,database,database-design,relational-database,database-schema,Database,Database Design,Relational Database,Database Schema,我有下表,代表足球比赛期间发给球员的卡片: CREATE TABLE cards ( player_id INT, match_id INT, color VARCHAR(4), minute INT, FOREIGN KEY (player_id) REFERENCES players(id), FOREIGN KEY (match_id) REFERENCES matches(id) ); 如您所见,其中没有主键。在同一场比赛中,一名玩家在
CREATE TABLE cards (
player_id INT,
match_id INT,
color VARCHAR(4),
minute INT,
FOREIGN KEY (player_id) REFERENCES players(id),
FOREIGN KEY (match_id) REFERENCES matches(id)
);
如您所见,其中没有主键。在同一场比赛中,一名玩家在同一分钟内可能收到两张相同颜色的牌。我认为这是可以的,因为没有必要更精确地知道一张卡片是在哪一秒发出的
这个设计不好吗?这个有名字吗?这是正常形式吗?是的,通常情况下,表没有主键是个坏主意 其中一个原因是如果没有主键,那么如果您想要删除或更新其中一条记录(如果您有多条记录具有与您解释的相同的数据),则无法知道您引用的是哪条记录 例如:
player_id match_id color minute
1 100 RED 34
1 100 RED 34
2 100 YELLOW 41
3 200 RED 22
现在,假设你想更新玩家1得到的第二张牌,并将其更改为黄色或将其移除。您将如何编写该查询
因此,如果您希望在同一场比赛中为同一玩家创建多个记录,则可以为每个记录创建一个。否则,自然主键将是player_id和match_id的组合
CREATE TABLE cards (
card_id INT PRIMARY KEY,
player_id INT,
match_id INT,
color VARCHAR(4),
minute INT,
FOREIGN KEY (player_id) REFERENCES players(id),
FOREIGN KEY (match_id) REFERENCES matches(id)
);
是的,一般来说,没有主键的表是个坏主意 其中一个原因是如果没有主键,那么如果您想要删除或更新其中一条记录(如果您有多条记录具有与您解释的相同的数据),则无法知道您引用的是哪条记录 例如:
player_id match_id color minute
1 100 RED 34
1 100 RED 34
2 100 YELLOW 41
3 200 RED 22
现在,假设你想更新玩家1得到的第二张牌,并将其更改为黄色或将其移除。您将如何编写该查询
因此,如果您希望在同一场比赛中为同一玩家创建多个记录,则可以为每个记录创建一个。否则,自然主键将是player_id和match_id的组合
CREATE TABLE cards (
card_id INT PRIMARY KEY,
player_id INT,
match_id INT,
color VARCHAR(4),
minute INT,
FOREIGN KEY (player_id) REFERENCES players(id),
FOREIGN KEY (match_id) REFERENCES matches(id)
);
只需添加一个新属性NumberOfCards,然后您就可以将{player,match,color,minute}作为键 这个设计不好吗 对 这是正常形式吗
不可以。每个列都可以为空,并且允许重复行,因此它不是正确的关系,也不满足任何标准形式。只需添加一个新属性NumberOfCards,然后您就可以将{player,match,Color,minute}作为键 这个设计不好吗 对 这是正常形式吗
不可以。每一列都可以为空,并且允许重复行,因此它不是一个正确的关系,也不满足任何标准形式。让我详细介绍一下 在关系数据库中,表是关系的数学概念的物理表示,关系是一组元组。因为它是一个集合而不是多集合,所以最多只能包含一次每个元组 没有键的表允许多个相同的行/元组,因此不是关系,您的数据库不能再被视为关系 在您的特定情况下,您可以从现有字段中创建一个键,然后添加一个数量字段,您可以根据需要增减该字段。或者,考虑一个更细粒度的自然密钥,甚至是一个伪代理密钥,这将允许你真正区分不同的卡。
很少有情况下,当数据不是很重要,但写性能很重要时,无键表可能有用,例如在存储调试跟踪时,但在绝大多数情况下,缺少键应该是一个很大的危险信号。让我详细介绍一下 在关系数据库中,表是关系的数学概念的物理表示,关系是一组元组。因为它是一个集合而不是多集合,所以最多只能包含一次每个元组 没有键的表允许多个相同的行/元组,因此不是关系,您的数据库不能再被视为关系 在您的特定情况下,您可以从现有字段中创建一个键,然后添加一个数量字段,您可以根据需要增减该字段。或者,考虑一个更细粒度的自然密钥,甚至是一个伪代理密钥,这将允许你真正区分不同的卡。
很少有情况下,当数据不是很重要但写性能很重要时,无键表可能有用,例如在存储调试跟踪时,但在绝大多数情况下,缺少键应该是一个很大的危险信号。可能相关:;在大多数情况下,没有主键的数据库表就是一个表,通常每个数据库表都应该有一个主键。@AlbusShin不,弱实体仍然有一个键。只是外键在键内。可能相关:;在大多数情况下,没有主键的数据库表就是一个表,通常每个数据库表都应该有一个主键。@AlbusShin不,弱实体仍然有一个键。只是外键在键里面。我不明白玩家id,比赛id怎么会是一个天生的prima
ry键。@aochagavia-如果player\u id/match\u id组合自然不同,那么它将被视为自然键,因为它将唯一地描述一个记录。我不理解player\u id如何,match\u id可以是一个自然主键。@aochagavia-如果player\u id/match\u id组合自然不同,那么它将被视为一个自然键,因为它将唯一地描述一个记录。