ポリモーフィック アソシエーションは、外部キーまたは多対 1 の関係に似ていますが、ターゲットが多くのタイプ (言語のクラス、データベースのテーブル) のいずれかであるという違いがあります。
数年間使用してきたデータベース設計を PHP から Java に移植しています。古いコードでは、独自の ORM を展開していましたが、これは多くの理由で最適ではありませんでした。後で微調整を開始し、自分で再度実装することになるかもしれませんが、今のところ、エンティティ クラスで市販の ORM と JPA を使用したいと考えています。
データベースのレイアウトについて、JPA で表現する方法がわからないことが 1 つあります。
Node
グラフを格納するテーブルがEdge
あります(重要な場合はDAG)。各ノードは、必要に応じて、データベースから別のエンティティを 1 つ参照できます。これらのエンティティは、グラフ全体で複数回参照される可能性があり、ユーザーがアクセスできない「孤立した」エンティティも存在する可能性がありますが、少なくともしばらくの間保持することは理にかなっています。
これらのオブジェクトは、継承などの点でまったく関連していませんが、Customer->Site->Floor->Room のような自然な階層を持っています。実際、何年も前に、「親」オブジェクトを指す外部キー フィールドだけから始めました。しかし、この階層は十分に柔軟ではなく、バラバラになり始めました。
たとえば、ユーザーがフォルダー内のオブジェクトをグループ化できるようにしたいのですが、一部のオブジェクトは複数の「親」を持つことができ、時間の経過とともに関係が変化します。以前の関係を追跡する必要があるため、グラフのエッジにはタイムスパンが関連付けられており、そのエッジがいつからいつまで有効であったかが示されます。
ノードからオブジェクトへのリンクは、ノード テーブルの 2 つの列に格納されます。1 つは外部テーブルの ID を保持し、もう 1 つはその名前を保持します。例 (一部の列は省略):
table Node:
+--------+-------+----------+
| ixNode | ixRef | sRefType |
+--------+-------+----------+
| 1 | NULL | NULL | <-- this is what a "folder" would look like
| 2 | 17 | Source |
| 3 | 58 | Series | <-- there's seven types of related objects so far
+--------+-------+----------+
table Source (excerpt):
+----------+--------------------+
| ixSource | sName |
+----------+--------------------+
| 16 | 4th floor breaker |
| 17 | 5th floor breaker |
| 18 | 6th floor breaker |
+----------+--------------------+
JPAを使用する以外の解決策があるかもしれません。テーブルのレイアウトを変更したり、新しいテーブルを導入したりすることもできます。ただし、これについてはすでによく考えており、テーブルの構造は問題ないように思えます。思いもよらなかった第3の方法もあるかもしれません。