The solution that you mentioned is commonly followed as its out of box .The idea that you mentioned is documented in this blog very well
http://www.forcetree.com/2009/11/one-to-one-relationship-in-salesforce.html
The other solution is very obvious that's the trigger .Just checking if the child record already exists for a parent ,not allowing the user to create the other one unless until first child record id deleted .But downfall its custom coding.
Next way is why not merge the fields of both the objects and make a single object .Note this i will consider when i have to go for one to one between custom objects .If standard like Account and contact then i would prefer outofbox one.