Yes, the ? (IN REGEX) matches the preceding character (or group of characters) 0 or 1 time, i.e., optional. Obviously, group characters to ensure a match of more than one character and put the ? outside the closing parenthetical. I think I have a better explanation in the Regex section of my signature's tutorial.
Changing from user_id to user_name isn't a problem unless you've changed the values, too. Typically, that IS the problem.
Handler file? It depends upon the complexity of your redirection ... OR NOT! Check http://wilderness-wally.com and look at the links in the TOC on the left of every page. They're created using the title of each article, not the id. I could just as easily duplicate the script to take the id of the articles but the numbers contain no useful information (this is a client-maintained website so I've had to limit the characters Mr Wilderness can use in the titles - URI restrictions, of course - and perform my redirections based on "user_name" rather than "user_id".
If you've not changed the database, you could have your profile.cfm look for the two keys and use the value of the one provided to access the database. Trivial alteration, IMHO (if-then-else).
If you've changed the database names, though, you're in deep doo-doo because you'll have to create a handler script to do a lookup and redirection for you. I've created a RewriteMap for a "casual client" which performs this database lookup and redirection while in the .htaccess file but it could just as easily perform this task as the first thing it does in your generic script, too (albeit, a bit more complicated than the if-then-else above).
More information is required for an opinion on which way to go, though, but I believe you've got enough to handle the problem now anyway. Oh, well, you know where to find me if you need more information (like my collection of URI-acceptable characters).