假设数据库很大。我对搜索结果页面有一个非常复杂的查询。在下面的查询中,您可以看到我从 user_profile 表中检索了一些属性值 id,例如,教育是一个属性。当我有属性教育的值 id 时,我从数组(php 代码)中检索此 id 的标签名称,其中 id 是数组键。
public static $education = array(0 => 'No answer',
1 => 'High school',
2 => 'Some college',
3 => 'In college',
4 => 'College graduate',
5 => 'Grad / professional school',
6 => 'Post grad');
类似的还有大约 10 个其他属性。否则我的查询会更加复杂,我需要创建表 attribute_id_label 并为每个属性创建另一个连接以检索每个属性的值 id 的标签名称。这意味着额外的 10 个连接可能会降低查询速度。但这仍然是正确的方法。
所以我的问题是:如果表 attribute_id_label 只有大约 500 条记录。由于该表非常小,与该表进行 10 次联接会有什么大的不同吗?即使表 user_profile 非常大并且查询已经很复杂,如您所见?
这是我的查询:
SELECT
group_concat(DISTINCT looking.looking_for SEPARATOR ',') as lookingFor,
group_concat(DISTINCT photo.photo ORDER BY photo.photo_id DESC SEPARATOR ',') as photos,
profile.user_id as userId,
url as profileUrl,
nickname,
avatar.photo,
city,
ethnicity,
education,
occupation,
income,
//and 10 more fields like education, occupation, ethnicity...
FROM user_profile profile
LEFT JOIN user_profile_photo photo ON photo.user_id=profile.user_id
LEFT JOIN user_profile_photo avatar ON avatar.photo_id=profile.photo_id
INNER JOIN user_profile_looking_for looking ON looking.user_id=profile.user_id
LEFT JOIN user_profile_txt txt ON txt.user_id = profile.user_id
INNER JOIN place a ON a.place_id=profile.place_id
INNER JOIN (SELECT lat, lon FROM place WHERE place_id = :place_id) b ON (3959 * acos( cos( radians(b.lat) ) * cos( radians( a.lat ) ) * cos( radians( a.lon ) - radians(b.lon) ) + sin( radians(b.lat) ) * sin( radians( a.lat ) ) ) ) < :within
GROUP BY profile.user_id LIMIT 0,12
大多数属性不会由用户填充,并且由于您建议不可为空,对于那些未填充的属性最好使用什么?我可以为每个属性使用额外的字段没有答案。每个属性都会有额外的价值没有答案。让我们以属性教育和想要为例。属性教育有 id 1,want 是 2。
eav_attribute_option
option_id | attr_id | label
1 | 1 | No answer
2 | 1 | High school
3 | 1 | ...
4 | 2 | No answer
5 | 2 | Opportunities
6 | 2 | ...
但是现在问题重复了,每个属性都没有答案值。但这是避免 NULL 值的方法。我不确定这是否正确。