0

我正在建立CCG卡的数据库。每张卡都有关键字,例如“闪电”或“水”,每张卡可以有多个关键字。

所以问题是“将每个关键字放在自己的字段中并保存是否更好,或者将所有关键字保存在一个字段中并将它们解析出来或搜索功能是否更好?”

卡牌游戏未来可能会添加更多关键字,并且卡牌的多个方面都遵循与关键字相同的原则(即在一个字段中有很多选项。)

我有点担心有一个超过 50 列的表。提前感谢所有帮助和答案。如果我需要澄清,请告诉我。

4

3 回答 3

5

两者都不。

您应该有一个表格,每个卡片关键字组合有一行。

IE

CardID   Keyword
1        lightning
1        water
2        lightning
3        mountain

如果要重复关键字,您可能需要添加一个关键字表,并将 ID 放在此联结表中。

CardID   KeywordID
1        1
1        2
2        1
3        3

关键词

KeywordID Keyword
1         Lightning
2         Water
3         Mountain

这称为“标准化”。意见各不相同,但恕我直言,总的来说,您至少应该瞄准“第三范式”,最好是更高。

于 2012-08-31T18:12:09.103 回答
2

如果您分别访问关键字,但将它们一起存储在同一字段中,则违反了原子性原则,因此违反了第一范式。

这是不好的!最糟糕的是,您将无法有效地搜索数据1,最坏的情况是,您的数据库将无法抵御无效数据2

因此,请务必将每个关键字保留在其单独的字段中,但这并不一定意味着这些字段应该位于不同的列中。如果有不同类型的关键字应该以某种方式进行不同的处理,那么为每种类型设置一个列是有意义的。此外,如果每张卡的关键字仅限于少数,则单独的列可能是合理的。3

但是,在您的情况下,我怀疑所有关键字都被平等对待,并且您不需要对它们的数量进行任何限制,从而导致经典的一对多关系,正如podiluska 已经解释的那样。


1索引不适用于“部分”字段。

2例如,如果用于分隔同一字段中的关键字的字符作为关键字本身的一部分给出,无论是因为错误还是故意?您是否需要任何长度限制、大写/小写限制?等等,等等……理论上所有这些都可以在应用程序级别强制执行,但是有很好的理由说明为什么在数据库级别强制执行它们更可取。

3尽管可以说有更好的解决方案来施加这样的限制。

于 2012-08-31T18:49:02.643 回答
1

我只想在这里补充一点,非规范化(包括非第一范式设计,如字段中的许多值)是高级的东西,有很多潜在的问题。有时它们是需要的,但到目前为止,您还没有向我们展示任何原因。此外,当您使用这样的东西时,您真的想确保自己知道自己在做什么,并且可以在需要时将数据分解为规范化的形式。

所以从规范化的形式开始。如果您在这里询问,请阅读规范化并学习使用它。然后仅在您需要的地方(通常是为了表达数据约束)将非规范化到必要的程度。如果您要问哪个更好,并且没有充分的理由在一个字段中使用许多值,那么您最好按照其他评论者的建议将其拆分到另一个表中。

于 2012-09-02T10:46:18.503 回答