在 MySQL 数据库中存储数组的最佳方法?
Posted
技术标签:
【中文标题】在 MySQL 数据库中存储数组的最佳方法?【英文标题】:Best way to store an array in MySQL database? 【发布时间】:2012-03-07 03:57:44 【问题描述】:我的应用程序的一部分包括歌曲的音量自动化。
音量自动化按以下格式描述:
[[0,50],[20,62],[48,92]]
我认为这个数组中的每个项目都是一个“数据点”,第一个值包含歌曲中的位置,第二个值包含 0-100 范围内的音量。
然后,我获取这些值并在客户端执行一个函数,用“虚拟”数据点插入这些数据,以创建贝塞尔曲线,从而在播放音频文件时实现平滑的音量转换。
但是,需要允许用户将此自动化保存到数据库中以供日后调用。
数据点可以是无限的(尽管实际上不应真正超过 40-50 左右,大多数小于 10)
另外我应该如何处理数据?它应该按原样存储在文本字段中吗?还是我应该事先以某种方式对其进行处理以获得最佳效果?
在 MySQL 中最好使用哪种数据类型来存储数组?
【问题讨论】:
您在应用中使用的数据类型是什么?它是一个字符串、一个数组还是一个对象?我从“按原样在文本字段中”收集来表示您在内部将点表示为字符串,但我可能读错了。 为什么不直接创建多个 INT 类型的字段?例如volume_min、volume_max、song_position 如果您不需要执行在该数组中搜索值的查询,您可以简单地使用text
字段并存储数组的序列化版本(您在此处发布的方式可以, [[0,50],[20,62],[48,92]]
).
它是一个数组。 @Lorenzo - 你是对的,我不需要对这些数据执行查询。每个卷自动化阵列将在表中具有与其关联的用户 ID、歌曲 ID 和名称。
您是否打算在数据库中对数据执行任何计算?如果没有,将其存储为文本(或者可能是 JSON,按照您的格式)然后将其读回内存中的适当对象是没有害处的。
【参考方案1】:
绝对不是text
字段,而是varchar
——也许。我不建议解析结果并将它们存储在单独的列中,除非您想利用数据库意义上的数据——统计等。
如果您从来没有看到自己问过“用户使用的平均音量是多少?”那就别费心去解析了。
要弄清楚如何存储这些数据,问问自己“我以后将如何使用它?”如果您将获得该数组并需要在 php 中使用它,您可以使用 serialize 函数。如果您将使用 javascript 中的值,那么 JSON 编码可能最适合您(加上许多语言知道如何解码)
祝你好运!
【讨论】:
完美答案米哈伊尔,谢谢。它涵盖了所有有问题的点。 @Mikhail +1 好吧,但为什么肯定不是text
字段?
text
旨在存储实际文本 - 例如故事或诗歌。它不是为存储字符串而设计的。在 mysql 中,文本存储在文件中而不是“树的叶子”中。它的一切都变慢了,搜索、索引、缓存。
@Kaan,我不知道 MySQL 根据其内容以不同的方法存储同一列。
@Mikhail 我的意思是 MySQL 最终会将所有内容保存到文件中(保存某些存储引擎)。但是 TEXT 列仅存储在不同的页面上(基于配置及其大小)而不是单个文件(谈论 InnoDB 存储引擎,但我猜其他人也在这样做)。无论如何,如果您的数据适合内存,那么无论如何都会从内存中访问它。所以,是的,访问它们可能会有开销(如果它们在外部页面而不是行页面中),但我认为这不会足够明显,尤其是当数据不像这个问题那样大时【参考方案2】:
我建议你看看 JSON 数据类型。这样,您可以以比 text 或 varchar 更有效的方式存储数组,并且可以直接从 MySQL 访问数据,而无需解析整个内容。
看看这个链接:https://dev.mysql.com/doc/refman/5.7/en/json.html
【讨论】:
【参考方案3】:如果在检索行时速度是最重要的,那么创建一个新表并使其专用于保存数组的索引。使用整数数据类型,并让每一行代表数组的一个索引。您必须创建另一个将它们绑定在一起的数字列,以便您可以使用 SQL 查询重新组装数组。
这种方式可以帮助 MySQL 帮助您加快访问速度。如果您只想要数组的某些部分,您只需更改 SQL 查询中的范围,您就可以根据需要重新组合数组。
【讨论】:
以上是关于在 MySQL 数据库中存储数组的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
在 MYSQL 数据库中存储 base64 字符串的最佳方法是啥?
将日期和时间存储在 MySQL 数据库中以便以后使用 PHP 显示的最佳方法是啥?