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

Posted

技术标签:

【中文标题】在数据库字段中存储数字数组【英文标题】:Store array of numbers in database field 【发布时间】:2011-07-17 12:04:28 【问题描述】:

上下文:SQL Server 2008,C#

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

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

问题 #1: 我应该将数组存储在单独的表中吗?请给出一种或另一种方式的理由。

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

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

【问题讨论】:

【参考方案1】:

单独的表格将是执行此操作的最“规范化”方式。从长远来看,这可能会更好,因为您不必解析列的值来提取每个整数。

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

Sparse columns 也可能是您的另一个选择。

如果您想保持简单,您可以对值进行分隔:10;2;44;1

【讨论】:

XML 列有一些烦人的限制,比如不能在链接服务器上工作。 很高兴知道,谢谢。如果我的回答不清楚,我推荐一个单独的表格作为大多数情况下的合适解决方案。【参考方案2】:

单独的表,规范化

不是 XML 或 json ,而是在单独的行中单独的数字

不管你怎么想,这都是最好的方式。你可以稍后感谢我

【讨论】:

你好,我来自遥远的未来(2014)。我是来感谢你的。 @gbn,我很好奇为什么你认为这是最好的选择而不是其他选择。你能扩大你的答案吗?谢谢! 这对于很多应用程序来说都是非常糟糕的解决方案。 您认为这个解决方案可以扩展吗?我有一个 400K 整数的有序数组,我很难认为这是有效的。正如@jorge 所问,你能扩展一下吗? @MartinHansen 这个答案来自编辑之前,我们发现数组被视为一个块。如果数组不需要数据库解析或工作,那么从数据库的角度来看,它不是“一系列数字”,而是一个简单的对象,可以存储为测试、CSV 或 JSON 或其他任何东西。在许多情况下,当有人要求解析该数组以进行搜索或导出等时,这又会咬你一口。关于这个主题有很多问题。这就是为什么像我这样的数据库类型会推荐分离方法的原因......以及为什么这有 x3 赞成作为接受的答案......【参考方案3】:

在数据库中存储数据的“最佳”方式是最有利于将在数据库上执行的操作并且最容易维护的方式。正是这个后来的要求应该引导您找到一个规范化的解决方案,这意味着将整数存储在具有关系的表中。除了更容易更新之外,您之后的下一个开发人员也更容易了解信息的存储内容和方式。

【讨论】:

【参考方案4】:

我认为既然您在谈论 sql server,这表明您的应用程序可能是数据驱动的应用程序。如果是这种情况,我肯定会将数据库中的数组作为一个单独的表保留,每个值都有一条记录。它将被标准化和优化以进行检索。即使您在数组中只有几个值,您也可能需要将该数据与可能需要与您的数组值“连接”的其他检索数据结合起来。在这种情况下,通过使用索引、外键等(规范化)来优化 sql。

话虽如此,如果您不需要更改这些值,您始终可以对代码中的 10 个值进行硬编码并保存到数据库的往返行程。这取决于您的应用程序的工作方式以及该数组的用途。

【讨论】:

【参考方案5】:

我同意所有其他人的观点,即最好是单独的规范化表。但是,如果您坚持将它们全部放在同一张表中,请不要将数组放在一个单独的列中。相反,创建 10 列并将每个数组值存储在不同的列中。它将为您省去解析和更新问题。

【讨论】:

我不太同意 - 有时您可能需要 2 列,有时可能需要 40 列。如果您的表中有一堆可选列,那么它们只会占用空间。 @Josh 据我从 OP 了解到,它永远不会超过 10 个。【参考方案6】:

将其存储为 JSON 数组,但要知道现在所有访问都将针对整个数组 - 不会对特定系数进行单独的读/写。

在我们的例子中,我们将它们存储为一个 json 数组。与您的情况一样,各个数组编号之间没有关系-数组仅作为一个单元才有意义,并且作为一个单元,它确实与表中的其他列有关系。顺便说一句,其他一切都正常化。我把它比作:如果你要存储一个 10 字节的块,你会将它保存在 VARBINARY(10) 的单个列中。您不会将它分成 10 个字节,将每个字节存储在 VARBINARY(1) 的列中,然后用外键将它们拼接在一起。我的意思是你可以——但这没有任何意义。

作为开发人员,您需要了解该 int 数组实际上是多么“单片”。

【讨论】:

以上是关于在数据库字段中存储数字数组的主要内容,如果未能解决你的问题,请参考以下文章

在数据存储区的 JSON 类型字段中插入空数组

(转)mysql数据库中存储数字字段时,选择int和varchar的区别

java - 如何使用java将sql结果集字段存储到单独的数组变量中?

如何使用 NodeJS 仅将 NeDB 数据库中的某些字段存储到数组中

在 C++ 中存储和搜索数字的最佳方法

将 Matlab 数组存储在 SQL Server varbinary 字段中