Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 一个字段包含多个值或多个字段_Database Design - Fatal编程技术网

Database design 一个字段包含多个值或多个字段

Database design 一个字段包含多个值或多个字段,database-design,Database Design,Im正在建立CCG卡数据库。每张卡片都有诸如“闪电”或“水”之类的关键字,并且每张卡片可以有多个关键字 因此,问题是“如果卡片上有或没有关键字,最好将每个关键字都放在自己的字段中并保存,还是将所有关键字保存在一个字段中并将其解析出来,或者将其作为搜索函数保存?” 纸牌游戏将来可能会添加更多的关键字,并且纸牌的多个方面遵循与关键字相同的原则(即在一个字段中有许多选项) 我有点担心有一个50多列的表。提前感谢所有的帮助和回答。如果我需要澄清,请告诉我。两者都不需要 您应该有一个表,每个卡片关键字组合

Im正在建立CCG卡数据库。每张卡片都有诸如“闪电”或“水”之类的关键字,并且每张卡片可以有多个关键字

因此,问题是“如果卡片上有或没有关键字,最好将每个关键字都放在自己的字段中并保存,还是将所有关键字保存在一个字段中并将其解析出来,或者将其作为搜索函数保存?”

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

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

两者都不需要

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

如果要重复关键字,您可能需要添加一个关键字表,并将ID放在这个连接表中

CardID   KeywordID
1        1
1        2
2        1
3        3
关键词

KeywordID Keyword
1         Lightning
2         Water
3         Mountain

这被称为“”。观点各不相同,但总的来说,你至少应该把目标定在“”上,最好是更高。

如果你单独访问关键字,但将它们存储在同一个字段中,那么你违反了的原则,因此违反了第一范式

这太糟糕了!在bast,您将无法有效地搜索数据1,最糟糕的情况是,您将使数据库无法抵御无效数据2

所以一定要将每个关键字保留在单独的字段中,但这并不一定意味着这些字段应该位于不同的列中。如果有不同类型的关键字应该以不同的方式处理,那么为每种关键字都设置一个列是有意义的。此外,如果每张卡片上的关键字限制在一个较小的数字内,则可以对单独的列进行调整。3

然而,在您的情况下,我怀疑所有关键字都被平等对待,并且您不需要对它们的数量进行任何限制,从而形成了一种典型的一对多关系,如


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

2例如,如果用于分隔同一字段中的关键字的字符作为关键字本身的一部分给出,或者是因为错误,或者甚至是故意给出,该怎么办?您需要任何长度限制、大小写限制吗?等等,等等。。。理论上,所有这些都可以在应用程序级别强制执行,但这就是为什么在数据库级别强制执行它们更可取的原因


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

我只想在这里补充一点,非规范化(包括非第一个标准形式的设计,如一个字段中的许多值)是高级的东西,有很多潜在的问题。有时他们是需要的,但到目前为止,你还没有告诉我们任何理由。另外,当您使用这样的东西时,您确实希望确保您知道自己在做什么,并且可以在需要时将数据分解为规范化的形式


所以从规范化表单开始。如果您在这里提问,请仔细阅读规范化,并学习如何使用它。然后,仅在需要(通常用于表示数据约束)的情况下将其反规范化到必要的程度。如果您询问哪个更好,并且没有在字段中使用多个值的真正好的理由,那么最好按照其他评论员的建议将其拆分到另一个表中。

Standard。该组织将允许您执行诸如“给我所有有闪电和水的卡片”之类的查询,这将使用多列或将所有关键字插入字符串的方法造成混乱。如果这些卡有许多特征,那么您确实需要一个卡实体表、一个关键字(或电源)实体表和一个将卡与电源关联的关联表,正如podiluksa所指出的。如果这些卡跨越多个表并且具有多个部分的主键,那么我如何使其工作?@user1638987您需要解释为什么这些卡跨越多个表以及它们是如何组织的,然后才能解释。这就是我的扩展表名称/扩展代码(PK)卡扩展代码(PK)/Card ID(主键)/etc等关键词符号(PK)/卡片ID(PK)/关键词我想这就是你说的。假设一张卡片可以有3个或更多的关键字,这没有什么区别。@user1638987您可以编辑一个问题,然后在注释中引用该编辑。数据库规范化的第一条规则:一个单元格=一个值-这是否回答了您的问题?我永远不会把多个值放在一个列中——这只是在自找麻烦和乱七八糟的代码——你也不会从这种方法中得到任何东西。。。。在任何像样的RDBMS中,50列对于一个表来说都算不了什么……是时候阅读一本关于信息建模、关系模型和数据库设计的学术教科书了。(记录和使用设计的语言和工具手册不是关于信息建模和数据库设计的教科书。)几十本已出版的学术信息建模和数据库设计教科书都是pdf格式的在线免费教科书。stanford.edu有一个免费的在线课程。值得注意的是,有时非第一范式比标准化能给你提供更好的约束,但我同意,这是一个高级主题,如果有人问这个问题,最好不要管它。例如,假设我想要一个约束,使所有总账行项目在每个交易中加起来等于0。我无法在标准化数据库上表达这一点。我必须打破第一个正常形式才能这样做,或者编写相对复杂的触发器来尝试使其工作。@ChrisTravers我不确定我是否遵循了。一个违反1NF的表到底能允许你做什么?如果一个表没有,那是不可能的?我没有说不可能,我说不可能,没有相对复杂的触发器。您可以做的是在列中存储元组数组,针对该列定义约束,然后使用触发器来维护
KeywordID Keyword
1         Lightning
2         Water
3         Mountain