A big practical problem with design 1 is that you can't easily let the database guarantee integrity (i.e. make sure that an alias always refers to a fact). Ofcourse you can add triggers and procedures to make it so, but in design 2 you can just declare fact_id a foreign key, and be done with it.