在MySQL表中存储数组

时间:2013-03-28 09:29:51

标签: php mysql arrays multidimensional-array

我有一个5级多维数组。数组中的键数量有所波动,但我需要将其存储在数据库中,以便稍后可以使用PHP访问它。有没有简单的方法可以做到这一点?

我的想法是使用几个不同的分隔符(如#*%*将数组转换为单个字符串,然后使用一系列explode()在需要时将数据转换回数组它

此时我还没有编写任何代码,因为我希望有更好的方法来做到这一点。但我确实有一个潜在的解决方案,我试图在下面概述:

这是我的数组的概述:

n=button number
i=item number
btn[n][0]               = button name
btn[n][1]               = button desc
btn[n][2]               = success or not (Y or N)
btn[n][3]               = array containing item info
    btn[n][3][i][0]     = item intput type (Default/Preset/UserTxt/UserDD)
    btn[n][3][i][1]     = array containing item value - if more than one index then display as drop down

这是我要使用的分隔符的破坏:

#*Button Title                      //button title
    &*val1=*usr1234                 //items and values
    &*val2=*FROM_USER(_TEXT_$*name:)        //if an items value contains "FROM_USER" then extract the data between the perenthesis
    &*val3=*FROM_USER(_TEXT_$*Time:)        //if the datatype contains _TEXT_ then explode AGAIN by $* and just display a textfield with the title
    &*val4=*FROM_USER($*name1@*value1$*name2@*value2)       //else explode AGAIN by $* for a list of name value pairs which represent a drop box - name2@*value2

//sample string - a single button
#*Button Title%*val1=*usr1234&*val2=*FROM_USER(_TEXT_$*name:)&*val3=*FROM_USER(_TEXT_$*date:)&*val4=*FROM_USER($*name1@*value1$*name2@*value2)

总之,我正在寻找一些如何在单个数据库表中存储多维数组的想法。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

您想要的是data serialization方法。不要发明自己的,已经有很多。最明显的候选者是JSON(json_encode)或PHP特定的serialize。 XML也是一种选择,特别是如果您的数据库可以在某种程度上本地支持它。

答案 2 :(得分:0)

最好的决定是json_encode

串行化旁边的json_encode在db中存储有一些优点。

  1. 缩小尺寸
  2. 如果你 必须在db中手动修改数据,序列化会有一些问题,因为这种格式存储了已经序列化的值的大小,并且修改了这些值,你必须计算并修改这个参数。

答案 3 :(得分:0)

SQL(无论是mySQL还是其他任何变体)都不支持数组数据类型。

在SQL中处理这种数据的方式是将它存储在多个表中。

因此,在此示例中,您有一个表包含buttonIDbuttonNamebuttonSuccess等字段,另一个表包含buttonInputType和{{ 1}}字段,以及buttonInputValue链接回父表。

这将是推荐的“关系”做事方式。这样做的关键在于,当时机成熟时,它可以更容易地从数据库中查询数据。

还有其他选择。

一种选择是使用mySQL的buttonID功能。由于您有一组固定的值可用于输入类型,因此您可以使用enum字段,这可以使您无需为此添加额外的表。

当然,另一个选择是其他人建议的,只需使用enum或类似的序列化数据,并将其全部存储在一个大文本字段中。

如果数据将被用作简单的数据块,而不需要运行查询来检查其中的部分数据,那么这有时可能是最简单的解决方案。这不是数据库专家想要看到的东西,但从实用的角度来说,如果它完成了这项工作,那么随时可以使用它。

但是,了解这些限制非常重要。通过使用序列化解决方案,您基本上会说“这些数据根本不需要以任何方式进行管理,因此我不能为它做适当的数据库设计而烦恼。”这很好,只要你不需要管理或搜索其中的值。如果你这样做,你需要更加努力地思考你的数据库设计,并警惕采用“简单”选项。