在数据库字段中存储数字数组

31

背景:SQL Server 2008, C#

我有一个包含整数的数组(0-10个元素)。数据不经常更改,但经常检索。

我可以创建一个单独的表来存储数字,但由于某种原因,感觉这样不是最优解。

问题#1:我应该将我的数组存储在单独的表中吗?请给出支持或反对的理由。

问题#2:(无论问题#1的答案是什么),在数据库字段中存储int[]的“最佳”方法是什么?XML?JSON?CSV?

编辑: 一些背景:被存储的数字只是一些系数,不参与任何关系,并且始终以数组形式使用(即永远不会检索或单独使用值)。

6个回答

58

分离表格,标准化

不是XML或json,而是将数字分别放在不同的行中。

无论您如何想,这都是最佳方式。之后您会感谢我的。


11
你好,我来自遥远的未来(2014年)。我在这里感谢你。 - Saturn
6
@gbn,我很好奇为什么你认为这是最佳选择而不是其他替代方案。你能否详细解释一下你的答案?谢谢! - Yogster
2
这是很多应用程序的非常糟糕的解决方案。 - afruzan
你认为这个解决方案可扩展吗?我有一个包含 400K 个整数的有序数组,我很难想象这是有效的。正如 @jorge 所问,你能否扩展一下? - Martin Hansen
2
@MartinHansen 这个答案是在我们发现数组被视为一个块之前给出的。如果数组不需要进行数据库解析或处理,则从数据库的角度来看,它不是“一系列数字”,而是一个简单的对象,可以存储为测试或CSV或JSON等格式。在许多情况下,当有人要求解析该数组以进行搜索或导出等操作时,这会对您产生影响。关于这个问题,这里有很多问题。这就是为什么像我这样的DB类型会推荐分离的方法...以及为什么这个答案作为被接受的答案获得了x3的赞成票数... - gbn

16

在数据库中存储数据的“最佳”方式是最符合操作需求,且能够使维护更加容易的方式。后者的要求应该导致您采用规范化的解决方案,即将整数存储在一个带有关系的表中。除了更易于更新外,这也更易于让接下来的开发人员理解信息存储的内容和方式。


9

将其存储为JSON数组,但请注意,现在所有访问都将针对整个数组进行 - 没有针对特定系数的单独读取/写入。

在我们的案例中,我们将它们存储为JSON数组。与您的情况类似,各个数组数字之间没有关系 - 数组只作为一个单位有意义,并且作为一个单位,它与表中的其他列确实存在关系。顺便说一句,其他所有内容都已经过规范化处理。我将其比喻为:如果您要存储10字节块,则应将其保存在VARBINARY(10)的单个列中。您不会将其分成10个字节,在VARBINARY(1)的每个列中存储每个字节,然后使用外键将它们拼接在一起。我的意思是,您可以这样做 - 但这毫无意义。

作为开发人员,您需要了解该int数组的“单块”程度。


对我来说也是一样的。这真的取决于数据之间的关系,以及是否只需要更新单个条目还是整个数组。 我将音频峰值数组保存到一个包含mp3数据的表中。这些数据永远不会改变,如果我还需要重新计算音频峰值。 => 在这里,单个JSON列就足够了。 - undefined

3

最规范的方法是使用单独的表来完成此操作。从长远来看,这可能更好,因为您不必解析列的值以提取每个整数。

如果您愿意,也可以使用XML列存储数据。

稀疏列也可能是另一种选项。

如果您想保持简单,只需使用分隔符将值分隔:10;2;44;1


1
XML列有一些令人讨厌的限制,比如无法从链接服务器中工作。 - iDevlop
好的,谢谢你的提醒。如果我的回答不够清晰,我建议在大多数情况下使用单独的表作为适当的解决方案。 - Josh M.

1

我认为,既然你在谈论SQL Server,那就说明你的应用程序可能是一个数据驱动的应用程序。如果是这种情况,我肯定会将数组作为单独的表格存储在数据库中,每个值都有一条记录。这样可以实现规范化和优化检索。即使数组中只有几个值,您也可能需要将该数据与其他检索到的数据组合起来,这些数据可能需要与您的数组值“连接”。在这种情况下,使用索引、外键等进行规范化,SQL是经过优化的。

话虽如此,如果您不需要更改这些值,您可以在代码中硬编码这10个值,并保存往返于数据库的时间。这取决于您的应用程序如何工作以及这个数组将用于什么。


0

我同意其他人的看法,最好的方法是创建一个单独的规范化表。但如果你坚持要把所有内容都放在同一个表中,不要把数组放在一个列中。相反,创建10个列,并将每个数组值存储在不同的列中。这样可以避免解析和更新问题。


1
我并不完全同意这个观点 - 有时你可能需要两列,而其他时候可能需要40列。如果你的表中有一堆可选列,那么它们只会占用空间。 - Josh M.
根据原帖,据我所知它永远不会超过10。 - Clodoaldo Neto

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