How to handle an "OR" relationship in an ERD (table) design?

database-design, erd, language-agnostic, polymorphic-associations

Solution

You're describing a design called Polymorphic Associations. This often gets people into trouble.

What I usually recommend:

A  -->  D  <--  B
        ^
        |
        C

In this design, you create a common parent table `D` that both `A` and `B` reference. This is analogous to a common supertype in OO design. Now your child table `C` can 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 `D` can be referenced only by `A` or `B` but not both.

Problem

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?

Original source