如何组织JSON以加快信息访问速度?

时间:2018-12-21 18:26:49

标签: php mysql json

我一直在尝试以JSON格式存储车辆信息,以便更快地访问车辆图像。

我已经在数据库中为JSON建立了一个表。 JSON设置如下所示。所有车辆及其所有图像信息都在此JSON中。我不确定这是否是存储数据的最佳方法。我希望能够基于VIN快速搜索,以仅获取与该VIN相关的图像。

我的问题:

  1. 动态显示相关车辆图像的加载速度。
  2. 仅获取关联的图像;其他车辆图片也在显示
  3. 不确定我的JSON格式是否有意义(或效率低下),是否对JSON不太有用
  4. 是否有更简单的方法来设置用于查询特定JSON的SQL表?

可能的解决方案(不限于一种):

  • 重新格式化JSON以进行简单引用
  • 重新格式化表格以简化查询
  • 编辑“代码循环”以加快运行时间

我以前在InventoryPage上设置了循环,这是一个动态页面,它使用$ _GET获取关联的VIN,遍历我的数据库以获取与VIN关联的图像。这行得通,但是由于所需的迭代次数太长。

通常有比这更多的条目,为了便于阅读,我将其修剪回去。我们平均有100辆车,每辆车有20-60张图像。 这是我的JSON格式的示例:

[{"vin": "JF1GR89658L827860", "images": [{"image": 
"https://cdn04.carsforsale.com/3/420970/23594569/1133776572.jpg?
dt=100320180034", "width": 800, "height": 600}, {"image": 
"https://cdn04.carsforsale.com/3/420970/23594569/1133776606.jpg?
dt=100320180034", "width": 800, "height": 600}]}, 
{"vin": "6Y86G433753", "images": [{"image": 
"https://cdn04.carsforsale.com/3/420970/23684711/1135715340.jpg?
dt=100620180134", "width": 800, "height": 600}, {"image": 
"https://cdn04.carsforsale.com/3/420970/23684711/1135715371.jpg?
dt=100620180134", "width": 800, "height": 600}]}]

我目前必须遍历JSON并找到关联图像的代码,我认为这些图像错误地显示了来自不同车辆的图像:

foreach ($vehicles as $vehicle)
        {
            if ($vehicle['vin'] === $vin) {

                $last_element = ',';



                while ($vehicle['images']) {
                    echo "{";
                    echo "src: '" . $vehicle['images'][0]['image'] . "',";
                    echo "h: " . $vehicle['images'][0]['height'] . ",";
                    echo "w: " . $vehicle['images'][0]['width'];
                    echo "}" . $last_element;


                } 

                break;
            }
        } 

“代码循环”上方的预期输出(对于图像滑块):

{
  src: "image_link",
  h: vehicle_height,
  w: vehicle_width
}

2 个答案:

答案 0 :(得分:2)

请勿尝试手动创建JSON。用所有数据构造一个数组,然后调用json_encode()

$json_array = array();
foreach ($vehicles as $vehicle)
{
    if ($vehicle['vin'] = $vin) {
        foreach ($vehicle['images'] as $image) {
            $json_array[] = ['src' => $image['image'], 'h' => $image['height'], 'w' => $image['width']];
        } 
        break;
    }
}
echo json_encode($json_array);

您还可以考虑使用vin作为键,使JSON列成为对象而不是数组。这样就不需要循环,只需使用$vehicle[$vin]。您还可以在MySQL查询中使用JSON_SEARCH()来提取该元素而不是整个数组。

答案 1 :(得分:0)

这是一个自以为是的答案,但我真的看不到为此使用JSON列的好处。我认为您所拥有的数据看起来更适合传统的相关表。我认为JSON列非常适合存储更多非结构化数据,具有不同属性的不同对象集。但是您有一组相似的对象,每个对象都有一个完全相同的属性的平面列表。图像记录将完全适合它们自己的表,并且可能与具有其他与VIN相关的数据的不同表相关联,并且我认为以这种方式检索相关数据将更简单,更高效。只是我的两分钱,我知道它并不能真正直接回答问题,但是发表评论有很多。