The 'threads' design is only for the categories, so you can build a 'tree' of categories.
Then you can create another table that hold the actual data about the sites. You can link that data to the categories by adding a categiryid that points to the id of the category in the 'tree' table.
As for rating and ip check, you can make that as complex as you like. A simple method is to create cookie on the client that holds all the id's of the sites they have rated. That way when they rate a site, they also send all the info about previous ratings, and you can check that.
But, cookies can be erased, so if a user want's to cheat, he can. A more fullproof system would be to store the IP of every vote in the database. Then they'd have to change IP's before they can vote again.