[Seasar-user:8708] Re: [S2Dao] 1:Nのマッピングについて

kubo [E-MAIL ADDRESS DELETED]
2007年 6月 27日 (水) 12:16:09 JST


久保(jflute)です。

> > 今後、1:Nをサポートする予定はあるのでしょうか?
> > また、通常1:Nを実装するときの定石などはあるのでしょうか?
> > 
> 1:Nが必要な場合は、DBFluteをご利用ください。
> DBFluteはS2Daoを拡張するフレームワークです。
> http://dbflute.sandbox.seasar.org/ja/index.html

紹介預かりましたので、DBFluteの{1:N}サポートに関してご説明させて頂きます。



ex) BOOK(本:親) -- COLLECTION(蔵書:子)というTable構造があるとして


「1:Nを実装するときの定石」でパッと思いつくのが3つあると思っています。
(無論他にもあるかと思いますが...)

A. BOOK left outer join COLLECTIONでSQL一発取得してEntityにMapping
B. BOOKの一覧を先に取得して、LazyLoadする。
     → 紐付くCOLLECTIONを取得するSQLをそれぞれ発行して取得する。
C. BOOKの一覧を先に取得して、SQLもう一発で紐付くCOLLECTIONを全て取得して
   BOOKの一覧とCOLLECTIONの一覧の関連をMappingする。

「A」は理想ですが、S2DaoもDBFluteもサポートしていません。

「B」はまさしく“Apache Torque”がこの実装をしていますが、
極端な話、BOOKが50件の場合、紐付くCOLLECTIONを取得するのに50回のSQLが
発行されることになります(BOOKと合わせると合計51回)。
DBFluteではこの方法は採用しません。

「C」は「A」より理想ではないですが、大抵の業務に耐えうる妥協点かなと
思っております。「SQLもう一発で紐付くCOLLECTION」も
恐らく一般的にINDEXを貼るであろうBOOKへのFKに対してin句で取得するため、
SQLは低速ではありません。
ListとListのMapping処理も「BOOK-1万件でCOLLECTION-8万件をMapping」
という極端な件数でなければ全くPerformance劣化を気にすることはありません。

よって、DBFluteでは「C」を採用しております。


/- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// BOOKの条件作成(例えば「名前が'S2Dao'で始まる本」という条件)
final BookCB bookCB = new BookCB();
bookCB.query().setBookName_PrefixSearch("S2Dao");

// BOOKの一覧の検索(例えば50件ほど取得) *1発目のSQL
final java.util.List<Book> bookList = bookBhv.selectList(bookCB);

// ★COLLECTIONの一覧を検索してBOOKの一覧とMapping *2発目のSQL
bookBhv.loadCollectionList(bookList);

for (Book book : bookList) {
    // BOOKから該当のBOOK_IDに紐付くCOLLECTIONを取得
    // (LazyLoadではないので、ここでは単に一覧のInstanceを取得するだけ)
    final java.util.List<Collection> collectionList = book.getCollectionList();

    for (Collection collection : collectionList) {
        ... = collection.getXxx();// COLLECTIONの列の値を取得
    }
}
- - - - - - -/

子Tableの検索と一覧のMappingに関しては、DBFluteが自動生成したClassで
処理されるため、利用者側は全く意識する必要はありません。


また、「C」のやり方を採用したことにより、1:N:1:1というような取得も可能で
す。
(内部的に実現が容易であったという意味で)
{N:1:1}は「2発目のSQL」で纏めて検索します。


詳しくはこちら参考にして下さい。
http://dbflute.sandbox.seasar.org/ja/tips-behavior-one_to_many_loading.html


何か疑問等ありましたら遠慮なく聞いてください。
よろしくお願いします。





Seasar-user メーリングリストの案内