You have to take into consideration the ISPs who force user requests through their proxy servers. Those users will appear to have the same IP address a lot of the time, AOL users for example. I usually go with checking that the UP address isn't new in the last 24 hours or so, since dial up users stand a good chance of getting assigned a different proxy their next session.
If you're using MySQL I wouldn't store raw IP addresses. That will cost you a varchar(15) field which may be up to 16 bytes. Instead convert the IP to a signed integer before storing it. That will only cost you 4 bytes, until ipv6 gets more love anyway.
def ip2long( ip ) long = 0 ip.split( /\./ ).reverse.each_with_index do |x, i| long += x.to_i << ( i * 8 ) end long end