将MySQL中的多行组合成JSON或Serialize

时间:2014-04-23 19:33:30

标签: php mysql sql json

我目前有动态表单的数据库结构:

grants_app_id  user_id  field_name  field_value 
5--------------42434----full_name---John Doe  
5--------------42434----title-------Programmer  
5--------------42434----email-------example@example.com 

我发现这很难管理,它很快就填满了数据库中的数字行。我有不同的field_names,最多可以有78行,所以在对field_values进行更新或只是搜索时,它被证明是非常昂贵的。我想组合行并使用json或php序列化来大大减少对数据库的影响。有没有人对如何处理这个有任何建议?谢谢!

这将是预期的输出:

grants_app_id  user_id  data
5--------------42434----{"full_name":"John Doe", "title":"Programmer", "email":"example@example.com"}

1 个答案:

答案 0 :(得分:0)

这些行似乎没有简单的主键。

加快当前的解决方案:

  • 为(grants_app_id,user_id)
  • 创建索引
  • 添加自动递增的主键
  • 从field_name切换到field_id

该索引将使检索完整表单变得更加有趣(同时在插入时花费一些额外的时间)。

主键允许您通过指定由唯一索引支持的单个值来更新行,该索引通常应该非常快。

您可能已经有了一些字段定义。添加整数ID并使用它们来加速整个过程,因为存储,比较,编制索引的数据较少......

切换到JSON编码的变体

从PHP 5.2开始,使用json_encodejson_decode可以将数组转换为JSON并返回。

如何切换到JSON?

当前最好的方法可能是使用PHP脚本(或类似的)从旧表中检索所有数据,将其正确分组并将其插入到新表中。之后你可以切换名字,......这是一种离线方式。

另一种方法是添加新列并按field_name=NULL指示新列包含数据。之后您可以随时转换数据或仅将新数据存储为JSON。

使用JSON?

虽然将一行中的所有数据放在一起确实很容易记住:

  • 将所有字段保存在单个文本字段中,搜索字段内的值可能会变为两阶段方法,因为任何%内的LIKE都可以跳过其他字段的值。此外,通过索引列也无法轻松优化LIKE '%field:value%'
  • 更改单个字段意味着更新所有存储的字段。只要您确定在任何给定时间只有一个进程更改数据即可,否则会出现更多问题。
  • JSON-column需要足够大才能容纳字段名+值+分隔符。这可能很多。此外,如果您错过 - 计算任何字段中的长值意味着截断可能会在长值之后丢失所有字段上的所有信息

所以在你的情况下,即使有78个不同的字段,每个公式用户和字段也可能更好两个。 (甚至可能会发现JSON对于几乎没有字段的公式来说更实用。)

this question中所述,您必须记住JSON只是MySQL的其他一些文本。