我一直在检查数据规范化,但不太明白如何将其应用到卡im设置的数据库中。每一张牌都来自一套牌,那套牌上有一个符号。既然这两件事对于该组中的每一张牌都是相同的,那么这是否应该构成它自己的表呢?是否所有的牌都应该放在一张大桌子上,而不管是哪一套?
还有,有没有理由不把每个集合中的卡片放在一个以符号命名的表中,然后把集合的名称放在一列中呢?
我是一个新手,所以如果我需要更具体或者只是闭嘴,请让我知道。提前谢谢。
发布于 2012-08-31 23:15:14
这取决于你想要什么样的范式。
考虑一个看起来像这样的牌表,主键是(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表中的一行,而不是更新该符号中的所有卡片,从而降低了数据损坏的可能性。集合和符号之间存在真正的依赖关系,但第一个表不强制执行此操作。这意味着数据库将允许您进入一种损坏状态,即同一组中的卡片具有不同的符号。在第二组表格中,这是不可能发生的。发布于 2012-08-31 23:02:33
我不太确定我是否理解了你的问题,但是如果我想建立一个基于TCG的数据库,我会有一个表,里面有所有的卡和相应的信息。我就假设YGO的卡片是这样的,因为它们在某种程度上是众所周知的。
在‘牌’表中,你会有一个自动递增的‘卡ID’,牌的名称,牌的描述,牌的符号,效果ID,等级,攻击值和防御值。所有这些都是“与卡相关的”。
集合本身在1:1表中,该表将任何数量的牌链接到玩家ID。
所以假设玩家ataylor在他的集合中有三个蓝眼白龙,那么他的表中就会有三个条目,每个条目都有相同的卡片/玩家组合……每个条目代表一张卡片。
这就是你想知道的吗?
发布于 2012-08-31 23:17:29
我也不确定我是否理解了这个问题,但我建议你把所有的牌都放在一张大桌子上,不要把它们分成不同的桌子,分别放在不同的桌子上。
您需要的是唯一标识该卡的Id (cardId)。然后有一个setId和一个symbolId。
那么你的牌桌看起来就像这样:
CardId、SetId、SymbolId、说明
1,1,2,一张很棒的卡片
2,2,2,另一张甜蜜的卡片
你可以让那张桌子变得很大,并且能够超级快速地计数/分离出任何一组或符号的牌。然后你只需要一个查询表来告诉你什么是SetId 1和什么是2。
https://stackoverflow.com/questions/12217866
复制相似问题