[Seasar-user:8743] Re: [S2Dao] 1:Nのマッピングについて
Junichi Haseawa
[E-MAIL ADDRESS DELETED]
2007年 6月 27日 (水) 23:43:09 JST
ひがさん、久保さん
ご回答ありがとうございます。
ご丁寧に説明までいただきまして。。
参考にさせていただきたいと思います。
確かに理想はAだと思います。
簡単に実装するにはBかなぁと思っていたのですが、
やはりパフォーマンスが気になっていました。
Cの実装がもっとも現実的ですよね。
(コードもジェネレートしてもらえますし。。)
また、実際にサンプルなど作成して疑問点が合った場合は
質問させていただくこともあると思いますが、
そのときはよろしくお願いいたします。
----- Original Message -----
From: "kubo" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Sent: Wednesday, June 27, 2007 12:16 PM
Subject: [Seasar-user:8708] Re: [S2Dao] 1:Nのマッピングについて
> 久保(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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内