I think there's redundancy: leg_number is natural key, and LEG(id) is abstract data. Why you don't like multicolumn pks? Because some frameworks not support them? Is it so hard to code it down? I've taked a took at DBIx::Class. I don't know it yet, but looks promising.