以前の回答は、質問の最初の部分にうまく答えていると思います。ただし、ダニエルが推奨するリンクは、参照される「ソース」テーブルの数がかなり少ない場合にのみ解決策を提供します。また、「ソース」テーブルの数を増やすことにした場合、ソリューションは簡単には拡張できません。
より良い戦略を推奨するには、タスクが何であるか、および「ソース」テーブルにそれらを組み合わせることができる共通点があるかどうかについて、もう少し詳しく説明するとよいでしょう。
現在の構造では(質問から推測できる限り)、関係を逆にします。
- source_id 列と source_table 列を持つすべての利用可能なソースのリポジトリとして機能するテーブル (AllSources と呼びましょう) を作成します。どちらも主キーに含まれています。
- AllSources テーブルを参照する各「ソース」テーブルから外部キーを作成して、既に登録されているソースのみを保持できるようにします。
- 次に、AllSources テーブルを参照する外部キーを使用して、質問で言及したテーブルを作成します (別の「ソース」テーブルではありません)。
欠点: AllSources と「ソース」テーブルを一緒に管理して、AllSources でレコードを作成する場合、適切な「ソース」テーブルにも対応するレコードを作成する必要がありますが、実際にはそれほど難しくありません。