数据库结构,Eav模型,搜索查询太慢

时间:2015-04-11 22:30:49

标签: php mysql database laravel database-design

我正在创建一个汽车销售网站。我有一个car_properties表来存储我的汽车属性,例如ABS,气候,导航,警报等。

我正在使用car properties表格的EAV模型,所以我的表格如下:

id , name , value , car_id

我的汽车主表:car_sale表:

id, price , brand , mode , year 

但对于1辆车我在car_properties表中有大约25-30行。想想这300辆汽车,它将在car_properties表中大约9000行。

我的主页上有详细的搜索选项。

search filters : Brand , Model , Location , Year-to-Year , Price-to-price , condition , tranmission and so on 

但是当我添加2或3辆汽车时,它的速度太慢了!我的搜索查询如:

        $query = CarSale::
          where('car_model_id', '=', $model_id)
        ->join("car_properties as cp1", "cp1.car_for_sale_id", "=", "car_for_sale.id")
        ->join("car_properties as cp2 ", "cp2.car_for_sale_id", "=", "cp1.car_for_sale_id")
        ->join("car_properties as cp3 ", "cp3.car_for_sale_id", "=", "cp2.car_for_sale_id")
        ->join("car_properties as cp4 ", "cp4.car_for_sale_id", "=", "cp3.car_for_sale_id")
        ->join("car_properties as cp5 ", "cp5.car_for_sale_id", "=", "cp4.car_for_sale_id")
        ->join("car_properties as cp6 ", "cp6.car_for_sale_id", "=", "cp5.car_for_sale_id")
        ->groupBy('car_for_sale.id')
        ->select('car_for_sale.*' );


    if($year1!='' and $year2!=''){
        $query->where('year', '>=' , $year1 )->where('year', '<=' , $year2);
    }
    if($price1!='' and $price2!=''){
        $query->where('price', '>=' , $price1 )->where('price', '<=' , $price2);
    }
    if($location!=''){
        $query->where("cp1.name",'=',"location")
              ->where("cp1.value",'like',"%$location%");
    }
    if($condition!=''){
        $query->where("cp2.name",'=',"condition")
              ->where("cp2.value",'like',"%$condition%");
    }
    if($transmition!=''){
        $query->where("cp3.name",'=',"gearbox")
              ->where("cp3.value",'like',"%$transmition%");
    }
    if($wheel!=''){
        $query->where("cp4.name",'=',"steering_wheel")
              ->where("cp4.value",'like',"%$wheel%");
    }
    if($fuel!=''){
        $query->where("cp5.name",'=',"fuel_type")
              ->where("cp5.value",'like',"%$fuel%");
    }
    if($imported!=''){
        $query->where("cp6.name",'=',"customs")
              ->where("cp6.value",'=',$imported);
    }

    $results = $query->get(); //finally get the result

    return view('frontend.category')->with('results', $results );

这里有什么问题!结构,搜索查询还是逻辑?  (我使用的是php laravel 5,mysql-InnoDB) 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

EAV糟透了。

决定通常搜索的几个列,并且具有良好的选择性。将它们放在主表的列中。确定一些复合指数。将其余字段放入一个额外列中的JSON中。使用MySQL过滤具有列的属性,然后使用PHP来完成使用JSON数据的过滤。

More discussion in my EAV blog.

答案 1 :(得分:1)

请勿在{{1​​}}字段中使用delete me._record; 模型。如果您有很多eav且需要searchable他们像我一样,请尝试使用fields之类的搜索引擎来实现此目的。