Table for optional parent/child relationship
The solution you outlined is one valid option - assuming that an item can only belong to a single person at any given time.

In PostgreSQL you can enforce mutual exclusion between the two fk columns with a simple CHECK constraint:


  either a Parent or Child must exists


... you can add a simple CHECK constraint:

CHECK (a IS NOT NULL OR b IS NOT NULL)


Would demand at least one NOT NULL column - but also allow that both parent_id and child_id exist. If you want to disallow that, too, make it:

CHECK (a IS NOT NULL AND b IS NULL OR b IS NOT NULL AND a IS NULL)