1

我一直在研究数据规范化,但不太了解如何将其应用于我正在设置的卡片数据库。每张卡都来自一组,并且该组有一个符号。既然这两个东西对于该系列中的每张牌都是相同的,那么它应该构成它自己的桌子吗?是否所有牌都应该放在一张大桌子上,而不考虑设置?

此外,是否有理由不将每组的卡片放在以符号命名的表中,并将组的名称放在一列中?

我对此很陌生,所以如果我需要更具体或只是闭嘴让我知道。提前致谢。

4

3 回答 3

2

这取决于你想要什么样的正常形式。

考虑一个看起来像这样的卡片表,主键是(Name, Set)

Card:
| Name   | Set   | Symbol |
---------------------------
| Card 1 | Set 1 | 1      |
| Card 2 | Set 1 | 1      |
| Card 3 | Set 1 | 1      |
| Card 1 | Set 2 | 2      |
| Card 2 | Set 2 | 2      |

该表采用第一范式(1NF)。然而,它不是第二范式(2NF),因为 的值Symbol取决于 的值Set,并且(Set)是主键的真子集。

正如您在问题中所说,如果您想要 2NF,则需要创建一个单独的Set表:

Card:
| Name   | Set   |
------------------
| Card 1 | Set 1 |
| Card 2 | Set 1 |
| Card 3 | Set 1 |
| Card 1 | Set 2 |
| Card 2 | Set 2 |

Set:
| Name  | Symbol |
------------------
| Set 1 | 1      |
| Set 2 | 2      |

这些表现在都在 2NF(和 3NF、BCNF、4NF,...)中。

至于您问题的第二部分,您这样做而不是将所有列都放在一个表中的原因是双重的:

  • 使更改更容易。如果你想改变一个集合的属性,你只需要更新表格中的一行Set,而不是更新那个集合中的所有卡片。
  • 减少数据损坏的可能性。set 和 symbol 之间存在真正的依赖关系,但第一个表并没有强制执行这一点。这意味着数据库将很乐意让您进入损坏状态,其中同一组中的卡具有不同的符号。在第二组表中,这不可能发生。
于 2012-08-31T15:15:14.030 回答
1

我也不确定我是否理解这个问题,但我建议您将所有卡片放在一张大桌子上,不要将它们分成不同的桌子用于不同的系列。

您想要的是唯一标识该卡的 Id (cardId)。然后有一个 setId 和一个 symbolId。

然后你的牌桌看起来像:

CardId,SetId,SymbolId,描述

1 , 1 , 2, 一张很棒的卡片

2 , 2 , 2, 另一张甜蜜的卡片


您可以使该表变得庞大,并且能够超快速地计算/分离任何组或符号的牌。然后,您只需要一个查找表来告诉您 SetId 1 是什么以及 2 是什么。

于 2012-08-31T15:17:29.050 回答
1

我不太确定我是否理解您的问题,但如果我想建立一个数据库 TCG,我将有一个包含所有卡片和相应信息的表。我只假设 YGO 卡用于此,因为它们是众所周知的。

在“卡片”表中,您将有一个自增的“卡片 ID”、卡片名称、卡片描述、卡片符号、效果 ID、等级、攻击值和防御价值。所有这些都与“卡片相关”。

这些集合本身在一个 1:1 的表中,它将任意数量的卡链接到玩家 ID。

因此,假设玩家 ataylor 在他的系列中有三只蓝眼白龙,他将在该表中有三个条目,所有条目都具有相同的卡片/玩家组合......每个都代表一张卡片。

那是你想知道的吗?

于 2012-08-31T15:02:32.690 回答