试图建立一个规范的交易卡数据库

时间:2012-08-31 14:53:55

标签: database-normalization

我一直在查看数据规范化,并且不太清楚如何将其应用到我设置的卡数据库中。每张卡都来自一套,该套装有一个符号。由于这两个东西对于那个集合中的每张卡都是相同的,应该构成它自己的表吗?是否所有卡都在一个大表中,无论设置如何?

此外,是否有理由不在每个集合中使用以符号命名的表格中的卡片,只将该集合的名称放在一列中?

我是一个菜鸟,所以如果我需要更具体或只是闭嘴让我知道。提前谢谢。

3 个答案:

答案 0 :(得分: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      |

此表位于First Normal Form(1NF)。但是它不在Second Normal Form(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表中的一行,而不是更新其中的所有卡集。
  • 减少数据损坏的可能性。设置和符号之间存在真正的依赖关系,但第一个表并未强制执行此操作。这意味着数据库很乐意让您进入一个腐败状态,同一组中的卡片具有不同的符号。在第二组表中,这不可能发生。

答案 1 :(得分:1)

我不太确定我是否理解你的问题,但如果我想设置一个数据库TCG,我会有一张包含所有卡片和相应信息的表格。我会为此假设YGO牌,因为它们有点众所周知。

在'cards'表中,你有一个自动递增的'CardID',卡的名称,卡的描述,卡的符号,效果ID,级别,攻击值和防御价值。所有这些都与卡片有关。

这些集合本身位于1:1表格中,可将任意数量的牌与玩家ID相关联。

所以假设玩家ataylor在他的套装中有三只蓝眼白龙,他在那张桌子上有三个条目,都有相同的卡/玩家组合...他们每个代表其中一张牌。

那是你想知道的吗?

答案 2 :(得分:1)

我也不确定我是否理解这个问题,但我建议您将所有卡片保存在一张大表中,而不是将它们拆分成不同的表格。

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

然后你的牌表看起来像:

CardId中,SETID,符号ID,说明

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

2,2,2,另一张Sweet card


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