我一直在研究数据规范化,但不太了解如何将其应用于我正在设置的卡片数据库。每张卡都来自一组,并且该组有一个符号。既然这两个东西对于该系列中的每张牌都是相同的,那么它应该构成它自己的桌子吗?是否所有牌都应该放在一张大桌子上,而不考虑设置?
此外,是否有理由不将每组的卡片放在以符号命名的表中,并将组的名称放在一列中?
我对此很陌生,所以如果我需要更具体或只是闭嘴让我知道。提前致谢。
我一直在研究数据规范化,但不太了解如何将其应用于我正在设置的卡片数据库。每张卡都来自一组,并且该组有一个符号。既然这两个东西对于该系列中的每张牌都是相同的,那么它应该构成它自己的桌子吗?是否所有牌都应该放在一张大桌子上,而不考虑设置?
此外,是否有理由不将每组的卡片放在以符号命名的表中,并将组的名称放在一列中?
我对此很陌生,所以如果我需要更具体或只是闭嘴让我知道。提前致谢。
这取决于你想要什么样的正常形式。
考虑一个看起来像这样的卡片表,主键是(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
,而不是更新那个集合中的所有卡片。我也不确定我是否理解这个问题,但我建议您将所有卡片放在一张大桌子上,不要将它们分成不同的桌子用于不同的系列。
您想要的是唯一标识该卡的 Id (cardId)。然后有一个 setId 和一个 symbolId。
然后你的牌桌看起来像:
CardId,SetId,SymbolId,描述
1 , 1 , 2, 一张很棒的卡片
2 , 2 , 2, 另一张甜蜜的卡片
您可以使该表变得庞大,并且能够超快速地计算/分离任何组或符号的牌。然后,您只需要一个查找表来告诉您 SetId 1 是什么以及 2 是什么。
我不太确定我是否理解您的问题,但如果我想建立一个数据库 TCG,我将有一个包含所有卡片和相应信息的表。我只假设 YGO 卡用于此,因为它们是众所周知的。
在“卡片”表中,您将有一个自增的“卡片 ID”、卡片名称、卡片描述、卡片符号、效果 ID、等级、攻击值和防御价值。所有这些都与“卡片相关”。
这些集合本身在一个 1:1 的表中,它将任意数量的卡链接到玩家 ID。
因此,假设玩家 ataylor 在他的系列中有三只蓝眼白龙,他将在该表中有三个条目,所有条目都具有相同的卡片/玩家组合......每个都代表一张卡片。
那是你想知道的吗?