You've written that you need up to 5 users in total... So let's say you do have a picklist on the User object with values like 'North Europe', 'South Europe' and so on (again, one option would be to have these as Roles but that's going a bit too far).
Set<String> keys = new Set<String>();
for(Opportunity o : trigger.new){
if(o.Design_Region__c != null && o.Design_Territory__c != null ){
keys.put(o.Design_Territory__c + ' ' + o.Design_Region__c); // composite key
}
}
if(!keys.isEmpty()){
Map<String, User> regionalManagers = new Map<String, User>();
for(User u : [SELECT Id, Region__c FROM User WHERE isActive = true and Region__c IN :keys]){
regionalManagers.put(u.Region__c.toLower(), u); // will overwrite existing entries if there's more than 1 guy in that "Role"!
}
for(Opportunity o : trigger.new){
if(o.Design_Region__c != null && o.Design_Territory__c != null ){
String mapKey = (o.Design_Territory__c + ' ' + o.Design_Region__c).toLower();
if(regionalManagers.containsKey(mapKey)){
o.Regional_Director__c = regionalManagers.get(mapKey).Id;
}
}
}
}
You could even take it one step further. If you think about it in a way "unique region => user id" then maybe a Custom Setting with the mapping (type = list) would be a nice solution? That would mean 0 query rows wasted.