- PR -

JAVAで多対多の関係を扱う方法って?

投稿者投稿内容
てっく
常連さん
会議室デビュー日: 2002/11/05
投稿数: 28
投稿日時: 2004-08-20 12:32
こんにちわ、てっくと申します。

私もダメ猫さんと同じ考え方をしています。

ぶっちゃけた話、1つのSQLでデータを全て取ることができるでしょうし。
あまり美しくないかもしれませんがー

1:NだろうがN:Mだろうが、
Private変数にリストで持たせておけば、
社員から取得資格一覧を参照することも、
資格から取得社員一覧を参照することも簡単にできますし。。。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2004-08-20 12:50
データを画面に出すだけであって、他に使うこと(ビジネスロジックに渡すとか)がなければ、
単純にリストで持ってしまってもいいかもしれませんね。

ただ、1:Nの対応の組み合わせが複雑な場合とか、表示だけでなくビジネス層でも使うこともあるような場合は、O-Rマッピングしたほうがいいと思います。

HibernateとかCayenneとかいったO-Rマッピングフレームワークを使えば、だいぶ楽にできますし。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-08-20 13:03
引用:

1つのSQLでデータを全て取ることができるでしょうし。



この方法は確かに「JOIN」を使えばできるのですが、どうしても取得データ量が多くなってしまうので、何万件担った時のことを考えるとあまり良くないと思いやめてます。
てっくさんの言うとおり、データの参照の汎用性も効きますからね。

あとJSPですが、表示処理の専門ということですが、僕はプログラムによって変更されないところで、他のページと同じ部分に関しては、外部ファイルにしてそれをインポートすることで表示させています。(ヘッダーなどで使用しています)
これをやるとJSPの表示がスッキリしますよ。
変更も1つのファイルで全部に適用されますし、データ量も減ります(多少ですが(^^;))。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-08-20 13:08
引用:

取得したデータはリストかVectorに保存して(各テーブルにつき1つ)
それをfor文かif文で表示すれば良いのではないでしょうか?
僕はいつもこの方法を取っていますが・・・・



テーブル内容を丸ごとメモリに詰め込んでも問題が発生しないデータ量であること、もしくはメインテーブルの主キーによってデータ範囲を絞られることが要件になりますが、ダメ猫さんの方法も一つの方法ですね。

私の場合はプログラミングは業務Onlyで、数万〜数百万のレコードを持つテーブルを扱うことが多いので、どうしても考え方がそっちに寄ってしまって、そういう発想が浮かびませんでした。
#「リスト」と言われれば「ページング処理」が暗黙のうちに混じってるような日々です(涙
##ついでに、各種条件でソートなのです……←絞れない

検索処理はRDBMSに実装されている高速なものを使いたいとか、RDBMSに独立でマシン割り当てられている環境でやることが多いのでそちらのCPUに負荷分散したいとか、そういう意図も無いではないですが……まあ、これらも状況依存ですよね。

引用:

他に良い方法があるのなら教えてほしいですw



重箱の隅みたいなところばかりですが……。

今回のケースですと、Vector(ArrayListの方がBetterと思いますが)に格納するのは「社員情報」だけにした方がいいと思います。
「家族構成」「取得資格」に関しては「社員情報」の従属情報としてリスト内に展開する用途になりますから、特定情報を探しやすいHashMapの方が便利ではないでしょうか。
KeyのListを取得してから回せばいい……と考えれば、全てHashMapでもいいかも知れません。

あと、余談になりますが。更新の少ないマスター的なテーブルに関しては起動時(/初回呼び出し時)だけRDBMSに問い合わせて以後はキャッシュを活用、RDBMS側のテーブルはバックアップ的に使うような方法もあります。それぞれのThreadが独自に問い合わせて独自にメモリに展開しても全て内容が同じだと分かっているなら何度も取りに行くだけ、それぞれが展開するだけ無駄ですから……。
ただ、この場合は更新系のフローを良く考えないと壊れます。特にアプリケーションサーバが複数台ある場合とか……。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-08-20 13:24
永井和彦さんご教授ありがとうございます。
引用:

テーブル内容を丸ごとメモリに詰め込んでも問題が発生しないデータ量であること、もしくはメインテーブルの主キーによってデータ範囲を絞られることが要件になりますが、ダメ猫さんの方法も一つの方法ですね。



僕の場合はメインのテーブルで例えば「年齢が30歳以上の人」と言う条件で取り出す場合には、
JOINを使って、もしくはselectを2重にかけて(WHEREの部分でselectで抽出した主キーを使用)主キーの判別をしますので、使用することはできます。

このやり方ではSQLが複雑になってしまうのですが、表示処理は楽になると思っています。

スキルアップ/キャリアアップ(JOB@IT)