规范化mysql数据库

时间:2013-07-18 18:34:34

标签: mysql database data-structures normalization

我正在创建一个数据库来存储Magic收集卡的信息,其中一个我不知道如何规范化的是卡片类型/子类型。

以下是我尝试解释此信息的工作原理:

卡片最多有2种类型(但我认为没有什么能阻止3种类型的新卡片)

每张卡至少需要一种类型。

卡片最多有3个子类型(与上述相同。)

不需要子类型。

所以我在表格中有一个带有信息的

的typeID和subtypeID字段

我知道将信息存储在类型和子类型表中的唯一方法是:

1 - 我的表格中有type1,type2,subtype1,subtype2 ...字段

2 - 具有字段类型和子类型,并将信息存储为:“type1,type2”,“subtype1,subtype2”

1没有标准化,因此我想避免使用它

2我甚至不知道这是否被认为是正常化的,但似乎是一个坏主意。

2 个答案:

答案 0 :(得分:0)

IMHO: 实体卡具有您卡片的所有图形信息,但没有类型。 另一个实体类型有所有类型(具有地理链接) 在另一个middles实体CARDS_TYPES中,您存储了卡片和类型之间的所有链接。

因此,如果您的地理类型更改,您必须将这些更改放在实体TYPES中。因此,如果一张卡的类型数量增加,则在中间实体中添加新行。

答案 1 :(得分:0)

选项1或2均未标准化。它们都是“重复群体”的例子,与第一范式相冲突。

另请参阅我对Is storing a delimited list in a database column really that bad?

的回答

正确的标准化设计是:

Types ---< CardTypes >--- Cards ---< CardSubtypes >--- Subtypes

这是一个紧凑的表示法,它显示了类型和卡片之间的多对多表格,以及卡片和子类型之间的另一个多对多表格。要向给定卡添加多个类型,只需在CardTypes表中添加多行即可。同样为CardSubtypes添加多行以获取具有多个子类型的卡。

这始终是表示多对多关系的规范化方式。