Jeśli chodzi o podział regionów to możesz to zrobić na zasadzie drzewa.Jedna kolumna z regionami.
Regiony (id,name,type,path)
Do tego tabele:
Fachowcy(id,name)
FachowcyWRegionie (id, FachowiecId,RegionId)
Path oznacza ścieżkę składająca się z identyfikatorów regionów.Np dla miejscowości która znajduje się w powiacie krakowskim i województwie małopolskim będzie to 'id województwa/id powiatu/id miejscowosci'.
Teraz wyobraźmy sobie sytuacje że fachowiec dodał usługę w rejonie powiatu krakowskiego.Dodajesz tylko jeden rekord do tabeli FachowcyWRegionie z identyfikatorem powiatu krakowskiego.Następnie gdy użytkownik wpisuje w wyszukiwarkę miejscowość z powiatu krakowskiego.To robisz tak.
SELECT Fachowcy.id,Fachowcy.name FROM Fachowcy LEFT JOIN FachowcyWRegionie on Fachowcy.id = FachowcyWRegionie.idFachowiec LEFT JOIN Regiony ON FachowcyWRegionie.idRegion=Regiony.id WHERE Regiony.path LIKE 'path miejscowosci' OR Regiony.path LIKE 'path powiatu nadrzednego wobec miejscowosci' OR Regiony.path LIKE 'path wojewodztwa nadrzednego wobec miejscowosci' GROUP BY Fachowcy.id
Bo logiczne jest że jeśli fachowiec działa w obrębie powiatu krakowskiego, to działa też w miejscowości należącej do tego powiatu.
W przypadku path nadrzędnego wobec miejscowości skracasz po prostu scieżkę path o dana ilość znaków.
Już późno więc nie wiem czy dobrze to wytłumaczyłem.Pytaj jakby coś.