 <p>Okay, this answer is SQL Server specific, but should be adaptable to other RDBMSs, with a little work. So far as I see, we have the following constraints:</p> <ul> <li>An invoice may be associated with 0 or 1 Work Orders</li> <li>A Work Order must be associated with an invoice or an ABC or a DEF</li> </ul> <p>I'd design the WorkOrder table as follows:</p> <pre><code>CREATE TABLE WorkOrder ( WorkOrderID int IDENTITY(1,1) not null, /* Other Columns */ InvoiceID int null, ABCID int null, DEFID int null, /* Etc for other possible links */ constraint PK_WorkOrder PRIMARY KEY (WorkOrderID), constraint FK_WorkOrder_Invoices FOREIGN KEY (InvoiceID) references Invoice (InvoiceID), constraint FK_WorkOrder_ABC FOREIGN KEY (ABCID) references ABC (ABCID), /* Etc for other FKs */ constraint CK_WorkOrders_SingleFK CHECK ( CASE WHEN InvoiceID is null THEN 0 ELSE 1 END + CASE WHEN ABCID is null THEN 0 ELSE 1 END + CASE WHEN DEFID is null THEN 0 ELSE 1 END /* + other FK columns */ = 1 ) ) </code></pre> <p>So, basically, this table is constrained to only FK to one other table, no matter how many PKs are defined. If necessary, a computed column could tell you the "Type" of item that this is linked to, based on which FK column is non-null, or the type and a single int column could be real columns, and InvoiceID, ABCID, etc could be computed columns.</p> <p>The final thing to ensure is that an invoice only has 0 or 1 Work Orders. If your RDMBS ignores nulls in unique constraints, this is as simple as applying such a constraint to each FK column. For SQL Server, you need to use a filtered index (>=2008) or an indexed view (&lt;=2005). I'll just show the filtered index:</p> <pre><code>CREATE UNIQUE INDEX IX_WorkItems_UniqueInvoices on WorkItem (InvoiceID) where (InvoiceID is not null) </code></pre> <hr> <p>Another way to deal with keeping WorkOrders straight is to include a WorkOrder type column in WorkOrder (e.g. 'Invoice','ABC','DEF'), including a computed or column constrained by check constraint to contain the matching value in the link table, and introduce a second foreign key:</p> <pre><code>CREATE TABLE WorkOrder ( WorkOrderID int IDENTITY(1,1) not null, Type varchar(10) not null, constraint PK_WorkOrder PRIMARY KEY (WorkOrderID), constraint UQ_WorkOrder_TypeCheck UNIQUE (WorkOrderID,Type), constraint CK_WorkOrder_Types CHECK (Type in ('INVOICE','ABC','DEF')) ) CREATE TABLE Invoice_WorkOrder ( InvoiceID int not null, WorkOrderID int not null, Type varchar(10) not null default 'INVOICE', constraint PK_Invoice_WorkOrder PRIMARY KEY (InvoiceID), constraint UQ_Invoice_WorkOrder_OrderIDs UNIQUE (WorkOrderID), constraint FK_Invoice_WorkOrder_Invoice FOREIGN KEY (InvoiceID) references Invoice (InvoiceID), constraint FK_Invoice_WorkOrder_WorkOrder FOREIGN KEY (WorkOrderID) references WorkOrder (WorkOrderID), constraint FK_Invoice_WorkOrder_TypeCheck FOREIGN KEY (WorkOrderID,Type) references WorkOrder (WorkOrderID,Type), constraint CK_Invoice_WorkOrder_Type CHECK (Type = 'INVOICE') ) </code></pre> <p>The only disadvantage to this model, although closer to your original proposal, is that you can have a work order that isn't actually linked to any other item (although it claims to be for an e.g INVOICE).</p>