Solo perché i dati hanno una struttura simile non significa che abbiano lo stesso significato o gli stessi vincoli. Tieni separate le tabelle di ricerca. Ciò conserva chiavi straniere separato, in modo che il database possa proteggersi dal fare riferimento al tipo sbagliato di dati di ricerca.
Vorrei che i DBMS relazionali supportassero l'ereditarietà, in cui è possibile definire la struttura di base nella tabella padre e aggiungere semplicemente FK specifici nelle tabelle figlio. Allo stato attuale, dovrai sopportare alcune ripetizioni nel tuo DDL...
NOTA:un'eccezione alla regola "mantieni le tabelle di ricerca separate" potrebbe essere quando il tuo sistema deve essere dinamico (cioè essere in grado di aggiungere nuovi tipi di dati di ricerca senza creare effettivamente nuove tabelle fisiche nel database), ma non sembra così lontano dalla tua domanda.
Con una grande tabella di ricerca, le FK da sole non fermeranno (ad esempio) il ShippingLog
tabella dal riferimento a una riga destinata a EmployeeTask
tavolo. Utilizzando l'identificazione delle relazioni e la migrazione delle PK, puoi proteggerti da questo, ma non senza introdurre alcune ridondanze e richiedere un attento vincolo. È più pulito e probabilmente più performante fare semplicemente la cosa giusta e tenere separate le tabelle di ricerca.