新しいコード要件が古いコードベースに浮上しました。これにより、以前は直接関連していなかった2つのユーザークラス(完全に異なるスキーマの異なるテーブルに格納されている)間の直接(内部)通信が可能になり、残念ながら、コードはほとんどオブジェクト指向に対応していません。あまり設計されていないため、親クラスはありません)。この機能を考慮しなかったこの古い設定にバッグを掛けるつもりなので、PKの衝突がないという保証はありません。
したがって、解決策は明白なようです。火で殺し、混乱したマッピングテーブル全体を書き換えます。マップを実装するための可能な方法については2つの方向性がありますが、私はDBAではないので、見逃した長所と短所があるかどうかはわかりません。
抽象化を明確にするために、異なるユーザーデータの3つのグループを検討してください:教授、管理、学生(いいえ、これは宿題ではありません。約束!)
マッピング1
(professor_id、admin_id、student_idは、それぞれのテーブルへの外部キーです)
| mailing_id (KEY) | professor_id | admin_id | student_id |
-------------------------------------------------------
| 1001 | NULL | 87 | NULL |
| 1002 | 123 | NULL | NULL |
| 1003 | NULL | NULL | 123 |
このアプローチの+/-は、短所に対してかなり重いようです:
- 行ごとに2つの「無駄な」フィールド
- 2NFに違反
- 異常を挿入/更新する脆弱性(0-1フィールドのみがNULLに設定されている行など)
ただし、プロにはメリットがないわけではありません。
- マッピングは単一のルックアップで実行できます
- mailing_idから特定のユーザーの「ソース」データを簡単に特定
正直なところ、私の考えでは、この考えはまったく好きではありません。
マッピング2
(MSG_ *が定義済みの定数、列挙型、または別の適切な識別子であると仮定します)
| mailing_id (KEY) | user_type (UNIQUE1) | internal_id (UNIQUE2)|
------------------------------------------------------------------
| 1001 | MSG_ADMIN | 87 |
| 1002 | MSG_PROF | 123 |
| 1003 | MSG_STUDENT | 123 |
この設定により、{user_type、internal_id}の固有の複合インデックスがより明確になり、3NFが維持され、アプリケーションコードでI / U異常をチェックする必要がなくなります。
欠点は、DBの外部で処理する必要があるユーザーソーステーブルを決定する際に透過性が少し失われることです。これは基本的に、アプリケーションレベルのuser_type値からテーブルへのマッピングになります。現在、私は(かなり強く)この2番目のマッピングに傾いています。
しかし、私は自分の限界を痛感しており、おそらく両方向の利点や障害を逃してしまったと確信しているので、私よりも賢明な考えに目を向けます。