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
.