Вы можете использовать обычную нормализованную таблицу тегов для навыков и использовать SQL, или вы можете сохранить навыки в виде одного списка и использовать поиск FREETEXT по одному столбцу.
user : id; name
skill : id; language_name
user_skill : user_id; skill_id
Каждый раз, когда вывстретите новый навык, просто создайте для него новую запись в навыке, чтобы «.Net», «DotNet», «C # .Net» появлялись 3 раза.
При поиске лучшего соответствия для «java»javascript html css ", разбейте его на список из 4, чтобы запрос выглядел следующим образом:
select top 10 u.name, count(*) matched
from skill s
inner join user_skill us on s.skill_id = us.skill_id
inner join user u on u.user_id = us.user_id
where s.language_name in ('java','javascript','html','css')
group by u.name
order by matched desc
(показаны первые 10)
В SQL Server 2005 с помощью FORXML, вы также можете получить список недостающих навыков для каждого из 10 лучших подходящих пользователей
select top(10)
u.id,
u.name,
count(*) matched,
stuff(
(
select ',' + s.language_name
from skill s
where s.language_name in ('java','javascript','html','css')
and not exists (
select * from user_skill u2
where u2.user_id=u.id
and u2.skill_id=s.skill_id)
for xml path('')
),1,1,'') as missing_list
from skill s
inner join user_skill us on s.skill_id = us.skill_id
inner join [user] u on u.user_id = us.user_id
where s.language_name in ('java','javascript','html','css')
group by u.id, u.name
order by matched desc