I’m designing a small database for a personal project, and one of the tables, call it table C, needs to have a foreign key to one of two tables, call them A and B, differing by entry. What’s the best way to implement this?
Ideas so far:
- Create the table with two nullable foreign key fields connecting to the two tables.
- Possibly with a trigger to reject inserts and updates that would result 0 or 2 of them being null.
- Two separate tables with identical data
- This breaks the rule about duplicating data.
What’s a more elegant way of solving this problem?
You’re describing a design called Polymorphic Associations. This often gets people into trouble.
What I usually recommend:
In this design, you create a common parent table
Dthat bothAandBreference. This is analogous to a common supertype in OO design. Now your child tableCcan reference the super-table and from there you can get to the respective sub-table.Through constraints and compound keys you can make sure a given row in
Dcan be referenced only byAorBbut not both.