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组合自然不同,那么它将被视为一个自然键,因为它将唯一地描述一个记录。