すべてのアドレスを独自のテーブルに入れるというのは、非常に一般的なアイデアのようです。開発者は繰り返しを探し出し、それを排除するのが大好きです。しかし、この場合、アドレスを独自の専用テーブルに配置してエンティティ ステータスで威厳を持たせることを躊躇します。なぜなら、ほとんどのアプリケーションと同様に、アドレスを本格的なエンティティとして扱わないと、複雑になりすぎるからです。
住所を実際のエンティティとして扱った場合、2 つの会社が何らかの形で同じ住所を共有した場合、または 1 つの会社がしばらくの間ある場所に住んでいた場合、別の会社が同じ場所に住んでいた場合、それらの会社は同じ住所を参照します。アプリケーションが入力としてアドレスを受け入れていた場合、アドレス テーブルにガベージを叩きつけるだけでなく、既存のアドレスがあるかどうかを確認して参照するためです。どちらにするつもりですか?ほとんどのビジネス アプリケーションと同様に、入力している新しいアドレスがデータベースに既に存在する他のアドレスと同じであるかどうかをまったく気にしないため、問題はありません。個々のものとして扱います。それがエンティティとキャットフードの違いです。
したがって、統合では、交差テーブルを導入してインデックスを作成する必要があり、アドレスを持つすべてのエンティティをそれに結合する必要があります。アドレスを熱心に取得するか、遅延読み込みを使用するかを検討する必要があります。すべてのアドレスを 1 つのバケットにまとめ、誰もが自分のアドレスにすばやくアクセスできるようにする必要があります。実際のエンティティの場合、異なるものが同じエンティティにリンクする必要があるため、これはある程度理にかなっていますが、それを気にしないことを上記で確立しました。誰もこれらのエントリを共有していません。
アドレスを 1 つのテーブルに統合することで排除している繰り返しはどこにあるのでしょうか? 住所はどこかに関係なく、同じフィールドを使用してデータベースに格納されるため、スペースを節約できません。唯一の繰り返しは、スキーマを生成するために使用される DDL にあります。これは、アドレス (アプリケーション コードの冗長性に対処する) の再利用可能なコンポーネント (「コンポーネント」は Hibernate 用語) を作成し、ORM ツールを使用して管理できます。スキーマを生成します。または、最悪の場合、それを無視してください。アドレスはそれほど変更されません。それはあなたの最大の問題ではありません。
あなたが説明しているこれらの要件は、あなたが友人のために行っているプロジェクトにとって、疑わしいエンタープライズのように聞こえます。おそらく、あなたの友人の脳は、委員会が何をしているのかを知らない委員会によってでっち上げられた要件を精巧に説明するために過度に露出することによって毒されている. 仕事でこのがらくたを我慢しなければならないのは十分に悪いことですが、個人的なプロジェクトの場合はどうですか? 彼を説得してみてください。
しかし、あなたの友人が企業的な仕事をあなたにアウトソーシングしているかもしれません。もしそうなら、被害を封じ込めてください: 顧客の住所専用のテーブルを作成して、交差テーブルを必要としないようにし、他のエンティティの住所をインラインに配置します。アドレスが 1 つしかないこれらのエンティティを別のテーブルからアドレスを取得しても、結合が増えるだけです。履歴が必要な場合は、邪魔にならない別の履歴テーブルに書き込みます。