php - Mysql:将数据数组存储在单个列中

标签 php mysql sql

在此先感谢您的帮助。

嗯,这是我的情况。我有一个网络系统,可以根据声波计创建的样本进行一些与噪声相关的计算。本来,数据库只存储这些计算的结果。但现在,我还被要求自己存储样本。每个样本只是一个包含 300 或 600 个数字的列表,每个数字保留一位小数。

因此,我想到的最简单的方法是在表中添加一列,用于存储给定样本的所有计算结果。此列应包含数字列表。

那么我的问题是:将此数字列表存储在单个列中的最佳方法是什么?

需要考虑的事情:

  • 如果该列表可以由 PHP 和 javascript 读取而没有进一步的复杂性,那就太好了。
  • 列表只有在完整检索时才有用,这就是为什么我宁愿不规范化它。此外,对该列表进行的计算有点复杂,并且已经用 PHP 和 javascript 编码,所以我不会对给定列表的元素执行任何 SQL 查询

此外,如果有比存储它更好的方法,我很想知道它们

非常感谢,祝您今天/晚上愉快:)

最佳答案

首先,您真的不想这样做。 RDBMS 中的列是原子的,因为它只包含一条信息。试图在一个列中存储多个数据是违反第一范式的。

如果您绝对必须这样做,那么您需要将数据转换为可以存储为单个数据项的形式,通常是字符串。您可以使用 PHP 的 serialize() 机制、XML 解析(如果数据恰好是文档树)、json_encode() 等。

但是您如何有效地查询这些数据呢?答案是你不能。

另外,如果以后有人接管了您的项目,您真的会惹恼他们,因为数据库中的序列化数据很难处理。我知道,因为我继承了这样的项目。

我有没有提到你真的不想那样做?您需要重新考虑您的设计,以便它可以更容易地存储在原子行方面。例如,为该数据使用另一个表,并使用外键将其与主记录相关联。它们被称为关系数据库是有原因的。

更新:我被问及数据存储要求,例如单行是否在存储方面更便宜。答案是,在典型情况下不,它不是,在答案是肯定的情况下,你为此付出的代价是不值得的。

如果您使用 2 列相关表(1 列用于样本所属记录的外键,1 列用于单个样本)那么每列最多需要 16 个字节(8 个字节用于 longint 键列, 8 个字节用于 double float )。对于 100 条记录,即 1600 字节(忽略数据库开销)。

对于序列化字符串,最好的情况是字符串中每个字符存储 1 个字节。你不知道字符串会有多长,但如果我们假设 100 个样本和所有存储的数据由于某种人为巧合而全部落在 10000.00 和 99999.99 之间,小数点后只有 2 位数字,那么你'重新查看每个样本 8 个字节。在这种情况下,您所节省的只是外键的开销,因此所需的存储量为 800 字节。

这当然是基于很多假设,比如字符编码总是每个字符 1 个字节,组成样本的字符串永远不会超过 8 个字符,等等。

但是,当然还有用于序列化数据的任何机制的开销。绝对最简单的方法,CSV,意味着在每个样本之间添加一个逗号。这会将 n-1 个字节添加到存储的字符串中。所以上面的例子现在是 899 字节,这是最简单的编码方案。 JSON、XML,甚至 PHP 序列化都会添加比这更多的开销字符,您很快就会拥有比 1600 字节长得多的字符串。而这一切都是在 1 字节字符编码的假设下。

如果您需要索引样本,则数据需求的增长与字符串相比会更加不成比例,因为字符串索引在存储方面比浮点列索引要昂贵得多。

当然,如果您的样本开始添加更多数字,则数据存储会进一步增加。即使在最好的情况下,39281.3392810 也不能作为字符串存储在 8 个字节中。

如果数据是序列化的,数据库就无法操作。您无法对样本进行排序,无法对它们进行任何类型的数学运算,数据库甚至不知道它们是数字!

老实说,如今存储设备便宜得离谱,您可以花很少的钱购买多个 TB 驱动器。存储真的那么重要吗?除非你有数亿条记录,否则我怀疑它是。

你可能想看看一本叫做 SQL Antipatterns 的书

关于php - Mysql:将数据数组存储在单个列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567916/

相关文章:

php - 尝试在 PHP 中使用 "SET @rownum = 0;"时出错

mysql - Gem mysql2 适配器未安装

SQL FROM 子句缺失错误

php - 当composer连接到GitHub时,我会收到有关弃用身份验证方法的警告。我应该使用什么身份验证配置?

php - 或者像我的 SQL 查询(使用 CodeIgniter 生成)一样,无法使用 jQuery DataTables

MySql/PHP - 设计我的第一个数据库。需要评论

c++ - SQL Null返回 "stops"使用odbc在c++中返回

c# - 如何编写复杂 SQL 但使用谓词(通过 Dapper)

php - PHP 中的 MAMP exec 命令在 Apache 环境中找不到 mysql(在 CLI 中工作)

php - 单击复选框时立即更新 mysql 数据库