我正在建立CCG卡数据库。每张卡都有关键字,如“闪电”或“水”,每张卡可以有多个关键字。
所以问题是“将每个关键字放在自己的字段中是否更好,并且如果卡具有或不存在则保存?或者最好将所有关键字保存在一个字段中并将其解析出来或搜索到搜索结果函数?“
纸牌游戏可能会在未来添加更多关键词,并且该卡的多个方面遵循与关键词相同的原则(即在一个领域中有多个选项。)
我有点担心有50多列的表格。感谢所有的帮助和答案提前。如果我需要澄清,请告诉我。
答案 0 :(得分:5)
都不是。
你应该有一张表,每个卡片关键字组合有一行。
即
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
这称为“Normalisation”。意见各不相同,但恕我直言,一般来说,你应该至少瞄准“3rd Normal Form”,最好是更高。
答案 1 :(得分:2)
如果您单独访问关键字,但将它们一起存储在同一个字段中,则违反了atomicity 的原则,因此违反了第一范式。
这很糟糕!在bast,你将无法有效地搜索你的数据 1 ,最坏的情况下,你将使你的数据库无法抵御无效数据 2 。
因此,请务必将每个关键字保留在其单独的字段中,但这并不一定意味着这些字段应位于不同的列中。如果有不同的种关键字应该以某种方式区别对待,那么为这些类型中的每一种设置列都是有意义的。此外,如果每张卡片的关键字数量限制为较小,则单独的列可能是合理的。 3
但是,在您的情况下,我怀疑所有关键字都被平等对待,并且您不需要对它们的数量进行任何限制,从而导致经典的一对多关系,如podiluska already explained。< / p>
1 索引不适用于“部分”字段。
2 例如如果用于分隔同一字段中的关键字的字符是作为关键字本身的一部分给出的,或者是因为该错误,甚至是故意的?您是否需要任何长度限制,大写/小写限制?等等......所有这些事情在理论上都可以在应用程序级别强制执行,但有very good reasons为什么在数据库级别强制执行它们是可取的。
3 虽然可以说有更好的解决办法来施加这样的限制。
答案 2 :(得分:0)
我只想在此补充说,非规范化(包括非首先正常形式的设计,如字段中的许多值)是具有很多潜在问题的高级东西。有时它们是必需的,但到目前为止,你没有向我们展示任何理由。此外,当您使用此类内容时,您确实希望确保知道自己在做什么,并且可以根据需要将数据分解为规范化表单。
首先从规范化表格开始。如果您在这里要求阅读标准化并学会使用它。然后只在您需要的地方(通常表达数据约束)在必要的范围内进行非规范化。如果你问哪个更好并且没有充分的理由在一个字段中使用很多值,那么你最好将其分解为另一个表,就像其他评论家所建议的那样。