多值字段是一个好主意吗?

9

我最近接触到了新的Access 2007功能,即多值字段。我的初步印象是,在单个字段中使用多个值是一个不好的想法。传统上,如果您想允许记录在一个字段中具有多个值,则需要创建另外两个表并使用外键将它们链接起来。这样可以轻松查询,并确保重复的值引用相同的项目。在单元格中保留列表似乎违反了数据库的目的。

是否有适合这些字段的好用途,而不让我感到不舒服?

8个回答

8

请参见:

多值数据类型被认为是有害的:一种数据类型可以有多大的危险性?

我和Access程序经理Suraj Poozhiyil进行了长时间的交谈...... Suraj和我都完全同意开发人员不需要使用多值字段。已经了解数据库的人们已经有了很好的实现多对多关系的方法,他们不会从多值字段中获得任何好处。

因此,我的明确而确定的建议是,开发人员不要使用多值字段。除了潜在的痛苦之外,它们没有提供任何好处。


1
那么他们为什么要创建它们呢?显然它们在现实世界中有用处,还有一整个数据库——Unidata和Universe——是围绕它们构建的。 - Noah
@Noah:快速谷歌搜索告诉我它们基于PICK而不是SQL。据我所知,PICK具有查询多值数据所需的语法(运算符等),Access/Jet/ACE没有。说实话,这不是我的领域(我使用过Intersystems Caché,但只是通过其SQL网关--非常出色--而不是MUMPS的东西)。我最喜欢第五范式 :) - onedaywhen

5
并不是在回答问题,但读者可能会注意到,有一个完整的行业围绕着“多值数据库”的概念(MultValued Databases):
这些数据库与关系型数据库不同,它们具有支持和鼓励使用具有值列表的属性的功能,而不是所有属性都具有单个值。
由于在这种情况下,数据库引擎具有扩展其查询语言以适应其表的多维性质的扩展(我假设Access可能没有),因此它与Access中的多值字段并不真正可比。但对于那些以前从未听说过多值数据库的人来说,这是一个有趣的相似之处。

3

Access市场的一个大部分是非开发人员,但有一定技术水平的用户。他们可能不理解归一化的价值,但可以使某些功能正常工作。他们只需要简单易用的东西,而这比自由文本字段更好,因为在自由文本字段中,人们输入的内容是希望他们都输入相同的内容。

随着他们了解得更多,他们可能开始使用其他表和外键。但是,有时候多值字段就足够了。


2
就像640K和2位数字来存储年份一样 ;) - D'Arcy Rittich

3
多值字段的概念是为了支持轻松创建报告/接口对象,此外,您可以创建显示问题类别的表单。与进行一些强烈的工作相比,天哪,连接它应该更简单,因为我们可以将:
机械,电气
作为一个字段的值,而不是
机械 电气
个人而言,我不喜欢它,并认为这种类型的字段是为非技术人员(开玩笑)创建的。严肃点说,除非您正在创建一个很少有人使用且很少有人需要进入的愚蠢工具,否则请勿使用此功能。
处理此问题的正确方法是连接,没有重复项,列内没有多个值(这本来就是3nf)。
创建这个的另一个原因是为了支持共享列表中的多个值。
Jon

2
多值字段可以轻松地避免您创建新表和关系的麻烦。
苏打 -> 类型
为什么我需要一个全新的表来说明百事可乐有常规、健怡等多种类型呢?
我希望它们能让我们给多值字段添加列,这样它们就像表一样,但工作量要少得多。

2

死后发帖...我认为当线程刚开始时,问题应该被修改,但我现在不会经历编辑过程。

问题是“多值字段是个好主意吗?”

真正应该问的问题是“关系数据库管理系统中的多值字段是一个好主意吗?”

正如其他人所指出的,有一个支持多值字段的整个MVDBMS模型。我是这个领域的专家,已经使用这个模型工作了30多年。当然,在我看来,对于每天使用这个平台的其他人来说,这是一个好主意。而且,Caché不仅有一个很棒的多维模型,而且还支持MVDBMS模型。所以在这方面,问题的答案是YES。

但对于RDBMS,特别是MS ACCESS,答案几乎肯定是否定的,因为RDBMS模型和该平台本身都不支持这个概念。

我认为被接受的答案是正确的,因为它不仅回答了提出的问题,还回答了原本想要问的问题。但是要一丝不苟地说,针对确切的问题,被接受的答案是不正确的。

我相信真正的答案是“只有DBMS平台支持它才是个好主意,MVDBMS和其他NoSQL平台是YES,RDBMS则是NO。”


1

坚决说不!
如果你正在学习SQL,就要学习正确的方法并规范你的表格。如果你懂得数据库设计,就要做好它。不是每个功能都必须被使用。


0

我真的不喜欢多值字段。也许他们这样做是为了更容易地与其他多值系统(如旧的PICK/Unidata系统)进行接口。我敢打赌,将使用此新功能频繁的Access数据库升级到SQL Server一定很有趣。


它在ACE中的唯一存在理由是为了与Sharepoint兼容。实际上,数据可以通过记录集访问,并且编写一些VBA将其写入真正的N:N表格会非常容易。当然,Access 4.2的SSMA可能非常了解MV字段并将其升级得很好。如果您有兴趣,我可以试一试并找出答案,因为我已经安装了A2007和SSMA 4.2。 - David-W-Fenton
@David-W-Fenton:“它在ACE中的唯一存在理由是为了与SharePoint兼容”-- ...然而,Access团队在Access中推广其普遍使用,例如这篇文章没有提到SharePoint:http://office.microsoft.com/en-us/access-help/use-a-list-that-stores-multiple-values-HA010031117.aspx - onedaywhen
1
营销材料往往不会揭示全部真相。 - David-W-Fenton
如果工具能够理解如何处理MV字段,那么升级应该没有问题。如果它们不能处理的话,可以使用脚本来实现,只是需要更多的工作量。我之前见过一些从Access转换到SQL Server的困难转换,并且拥有这个功能让我想要预见额外的困难。我也可以测试一下,但我会等待看是否真的需要。谢谢。 - Bratch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接