数据库结构 , Eav 模型 , 搜索查询太慢
Database Structure , Eav model , too slow search queries
我正在创建一个汽车销售网站。我有一个 car_properties
table 来存储我的汽车属性,例如 ABS、Climate、Navigation、Alarm 等
我正在为 car properties
table 使用 EAV 模型,所以我的 table 看起来像:
id , name , value , car_id
我的主要 table 汽车 : car_sale
table :
id, price , brand , mode , year
但是对于一辆车,我在 car_properties
table 中有大约 25-30 行。考虑一下 300 辆汽车,car_properties
table.
中大约有 9000 行
我的主页上有一个详细的搜索选项。
search filters : Brand , Model , Location , Year-to-Year , Price-to-price , condition , tranmission and so on
但是当我添加 jus 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)
感谢您的帮助!
EAV 糟透了。
确定几个通常搜索的且具有良好选择性的列。将它们放在主要 table 的列中。确定几个复合指标。将其余字段放入 JSON 中的一个额外列中。使用 MySQL 筛选具有列的属性,然后使用 PHP 完成对 JSON 数据的筛选。
不要为您的 searchable
字段使用 eav
模型。如果您有很多 fields
并且需要像我一样 filter
他们,请尝试使用像 ElasticSearch
这样的搜索引擎来达到这个目的。
我正在创建一个汽车销售网站。我有一个 car_properties
table 来存储我的汽车属性,例如 ABS、Climate、Navigation、Alarm 等
我正在为 car properties
table 使用 EAV 模型,所以我的 table 看起来像:
id , name , value , car_id
我的主要 table 汽车 : car_sale
table :
id, price , brand , mode , year
但是对于一辆车,我在 car_properties
table 中有大约 25-30 行。考虑一下 300 辆汽车,car_properties
table.
我的主页上有一个详细的搜索选项。
search filters : Brand , Model , Location , Year-to-Year , Price-to-price , condition , tranmission and so on
但是当我添加 jus 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) 感谢您的帮助!
EAV 糟透了。
确定几个通常搜索的且具有良好选择性的列。将它们放在主要 table 的列中。确定几个复合指标。将其余字段放入 JSON 中的一个额外列中。使用 MySQL 筛选具有列的属性,然后使用 PHP 完成对 JSON 数据的筛选。
不要为您的 searchable
字段使用 eav
模型。如果您有很多 fields
并且需要像我一样 filter
他们,请尝试使用像 ElasticSearch
这样的搜索引擎来达到这个目的。