One possibility is to use "inheritance", esp. if the objects you refer to have common fields. The schema looks like this: followables followable_id primary key -- common fields users user_id primary key references followables(followable_id) -- user specific fields pages page_id primary key references followables(followable_id) -- page specific fields ... random_entities ... followed_id references followables(followable_id) This means that both `pages` and `users` "are" `followables`, have `followables`' attributes and can be referenced alike. ORMs often create schemas like this to model inheritance, and handle the joining for you. Do not worry about inefficiency until you can prove it is a problem. ---------------- wrt. to efficiency. Write a simple SQL script that inserts test information up to the number of rows you deem you need. Write your queries (remember, you don't want to query your entire timeline, you will normally `LIMIT` your queries), check their execution speed- with the stuff you mention I'm guessing the performance will be satisfactory. If not, post your queries and the outputs of `EXPLAIN`.