3

次の Java ファイルを含むアプリケーションがあります。

サービス:

AccountService.java
UserService.java
MessageService.java

DAO:

AccountDAO.java
UserDAO.java
MessageDAO.java

テーブル:

ACCOUNTS
USERS
MESSAGES

には、3 つのテーブルすべてからデータを照会MessageService.javaする関数があります。newMessage()

(1) Spring のデカップリング標準によると、呼び出しは次のように行う必要があります。

                     AccountDAO.java -- ACCOUNTS
                    /
MessageService.java -- MessageDAO.java -- MESSAGES
                    \
                     UserDAO.java -- USERS

しかし問題は、このアプローチでは 3 つの DB 呼び出しが行われることです。

(2) パフォーマンスを向上させるために、次のことを行います。

MessageService.java -- MessageDAO.java -- Join ACCOUNTS, MESSAGES and USERS

しかし、このように密結合されているため、USERS テーブルに変更があった場合は、MessageDAO.java (および、USERS テーブルを使用する他のすべての DAO) も変更する必要があります。(非仮説では)DAOがたくさんあるので、それは本当に悪いことです

より良いプラクティスと見なされるアプローチはどれですか? または、私が見逃している別のアプローチはありますか?

4

4 に答える 4

4

Springのデカップリング基準によると、これが呼び出しの方法です。

これは誤りです。Springには「デカップリング標準」はありません。永続層コードを構造化する方法を説明しているSpringのドキュメントのリファレンスを見つけてください。

通常、アプリケーションが操作する「エンティティ」ごとに1つのDAOがありますが、複数のテーブルを3つの異なるクエリに結合するクエリを分解するという極端なパターンを採用するのは愚かなことです。

newMessage()クエリでいくつかのテーブルを結合するメソッドが必要な場合は、最も意味のあるDAOを選択し、おそらく、意味MessageDAOのある方法でクエリ/メソッドを記述します。

ただし、エンティティごとに個別のクエリが必要であり、1つのDAOクラスが他のエンティティのテーブルにアクセスするクエリを実行できないという規則はありません。これは極端すぎて、メリットがありません。

一方、すべてのテーブルを認識する複数のデータレイヤークラスを持つことの保守性について心配している場合は、この作業の一部を軽減するために言及されているように、ORMソリューションを調べてください。

于 2012-10-10T20:34:01.163 に答える
4

別の方法は、Hibernate などの ORM を使用して、各テーブルをエンティティにマッピングすることです。次に、それらのエンティティ間の論理関係を定義します。たとえば、ユーザーとメッセージ間の 1:M の関係。テーブルが変更されると、マッピングも変更する必要がありますが、SQL は変更されません (Hibernate が生成するため)。

ほとんどの関係では、Hibernate は結合を作成して関連するエンティティを 1 つのクエリで取得するのに非常に優れています。これが発生するかどうかを制御できます。ほとんどのリレーションシップのデフォルトとして遅延ロードを使用し、必要に応じて熱心なロードに切り替えることをお勧めします。

于 2012-10-10T20:55:00.040 に答える
2

これを 3 つの個別のクエリとして実行すると、データが 1 つのクエリと次のクエリの間で変化する可能性がある場合、正確性に影響を与える可能性があります。Spring のガイドライン (についてのあなたの考え) によって、間違った結果を得るコードを作成させてはなりません。

SQL での結合が正しいアプローチのようです。

于 2012-10-10T20:59:28.980 に答える
1

どちらの方法に従うにしても、デカップリングとパフォーマンスの間のスイート スポットを見つけることが常に重要です。レイヤー数などの選択でも成立します。

@mattbが推奨するように、特定のコンテキストで意味がある場合は、DAOでテーブルを結合してもまったく問題ないと思います

于 2012-10-12T11:18:57.180 に答える