Miaghstir: "Simple to query" isn't a problem, I want to avoid "unnecessary queries", and I somehow imagine that it's faster to do things in SQL when possible rather than "fetch data, handle data, send data back" in PHP (not that it actually matters much, the number of users shouldn't be able to put any measurable load on the servers anyway).
It's a risky path you're going down. It will be fine for something small (as your example sounds), but if you want to go into bigger databases, you need to avoid putting business level constraints in your data layer. The purist view of a data layer is that it is simply a model of how your data looks. This is constrained within itself (i.e. it is impossible to have a person key pointing at a person that doesn't exist). However it's really not intended to start enforcing higher level constraints like 'a phone can be in table a, or table b...' it becomes a mess.
Many people will disagree with this, I have the argument with other developers often about how much logic we should put in to data access. Generally it comes down to specific cases. However here it sounds like it's a validation issue, and when someone tries to change this, you find out if it's valid, if not, stop them. It's beyond integrity because you've opened the application of the phone information up to much.
As I just said, Guids (uniqueidentifier) would solve most of your problems, they allow you to have multiple keys in the same column without collision, but it always goes wrong from there on.