在MySQL数据库中存储数组的最佳方法是什么?

26

我的应用程序的一部分包括歌曲的音量自动化。

音量自动化以以下格式描述:

[[0,50],[20,62],[48,92]] 

我将数组中的每个项目视为“数据点”,第一个值包含歌曲位置,第二个值包含0-100范围内的音量。

然后,我使用客户端函数对这些值进行插值,与“虚拟”数据点相结合,以创建贝塞尔曲线,从而在播放音频文件时实现平滑的音量过渡。

但是,需要允许用户将此自动化保存到数据库以便以后召回。

数据点可以是无限的(尽管在现实情况下,应该不会超过40-50个,大部分少于10个)

还有,应该如何处理数据? 应该像文本字段一样存储吗? 还是应该进行某种形式的预处理以获得最佳结果?

在MySQL中使用哪种数据类型来存储数组最好?


1
如果您不需要在该数组中搜索值来执行查询,则可以简单地使用text字段并存储数组的序列化版本(您在此处发布的方式是正确的,[[0,50],[20,62],[48,92]])。 - lorenzo-s
这是一个数组。 @Lorenzo - 你说得对,我不需要在这个数据上执行查询。每个音量自动化数组将在表中与其关联的userid、songid和name。 - gordyr
1
你是否计划在数据库中对数据进行任何计算?如果没有,将其存储为文本(或者根据您的格式可能是JSON),然后将其读回到适当的内存对象中是没有问题的。 - buzypi
谢谢大家,我也想到了这一点,但是我想确认一下是否有符合最佳实践的首选方法来处理这种情况,以免我遗漏了什么。 - gordyr
如何在数据库中存储以下类型的矩阵?int[] myIntArray = new int[1000]{1,2,3,0,1,2,1, ...}? - luksmir
显示剩余2条评论
4个回答

48
绝对不是一个“文本”字段,而是一个“varchar”字段 - 或许吧。我不建议解析结果并将其存储在单独的列中,除非您想在数据库中利用该数据 - 统计等等。
如果您从不会问自己“用户使用的平均音量是多少?”,那就不要费心解析它。
要弄清楚如何存储这些数据,请问自己“我将如何在以后使用它?”如果您将获得数组并需要在PHP中使用它,可以使用serialize函数。如果您将在JavaScript中使用这些值,那么JSON编码可能是最适合您的选择(而且许多语言都知道如何解码它)。
祝您好运!

1
完美的回答Mikhail,谢谢你。它涵盖了所有问题的要点。 - gordyr
1
@Mikhail +1没问题,但为什么一定不是text字段? - lorenzo-s
2
text 用于存储实际文本,例如故事或诗歌。它不是设计用于存储字符串。在 MySQL 中,text 存储在文件中而不是“树叶”中。所有关于它的操作都会变慢,包括搜索、索引和缓存。 - Mikhail
1
@Kaan,我不知道MySQL会根据其内容以不同的方式存储相同的列。 - Mikhail
1
@Mikhail 我的意思是MySQL最终将所有内容持久化到文件中(除了某些存储引擎)。但是TEXT列仅存储在不同的页面上(基于配置和它们的大小),而不是单独的文件(谈论InnoDB存储引擎,但我想其他存储引擎也是这样做的)。无论如何,如果您的数据适合内存,它都将从内存中访问。因此,是的,访问它们可能会有一些开销(如果它们在行页面而不是外部页面中),但我认为这不足以引起注意,特别是当数据不像这个问题中那样大时。 - Kaan
显示剩余3条评论

7
我建议您查看JSON数据类型。这样,您可以比使用文本或varchar更有效地存储数组,并且您可以直接从MySQL访问数据而无需解析整个数据。请参考此链接:https://dev.mysql.com/doc/refman/5.7/en/json.html

4
如果在检索行时速度最重要,那么可以创建一个新表,专门用于保存数组索引的指针。使用整型数据类型,每行表示一个数组索引。你需要创建另外一个数字列来将它们绑定起来,以便用 SQL 查询重新组装数组。
这种方式可以帮助 MySQL 提高访问速度。如果您只想获取数组的某些部分,您只需在 SQL 查询中更改范围,然后可以按照需要重新组装数组。

1

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