はじめまして。
この度、Javaサーブレットを利用したWEBアプリケーションを開発しようとしています。
オブジェクト指向言語での開発は初めてのため、クラス図に表れるエンティティの扱いに困っています。
例えば、アマゾンのような大規模なサイトの場合、「会員」エンティティ、「書籍」エンティティ、顧客を分類する「地域」エンティティ等は、まともにインスタンス化すれば100万以上存在すると思われますが、これらはすべてインスタンス化されメモリに常駐するものなのでしょうか?
その場合はどの程度のサーバスペックと台数が必要でしょうか?
それとも設計は無視して一ユーザがアクセスする度にセッション内にデータベースから1レコード分のインスタンスを生成し、検索はインスタンスではなくSQLですませてしまうものなのでしょうか?
設計から実装する場合において、そのエンティティのデータが大量になる場合はどのようなテクニックがありますか?
ご教授宜しくお願いします。
No.3ベストアンサー
- 回答日時:
#2です。
> 例えば、ある会員が予約している書籍を一覧表示する場合、
> オブジェクト指向的に考えれば、
> 会員クラスが保持する予約リストフィールドに書籍クラスのインスタンスを保持するような設計になると考えております。
(「クラス」と「インスタンス」の使い分けが少し気になりますが)オブジェクト指向的にデータ構造を設計するとsnake103さんの書かれたとおりになると思います。
> でもこの場合、
> 結局書籍インスタンスがすべて必要になり、
> 100万件分のインスタンスのメモリ領域が必要になると考えております。
> 逆にSQLでやる場合は、
> 一覧表示をする際にその都度、
> SQLを発行しリストを生成する感じになると考えます。
> この方法はクラス図の設計を無視していると思うのですが、
> 私の考えが間違っていますでしょうか?
この部分が少し違っていて、基本的にオブジェクト指向データ設計と、メモリ/ディスク(データベース)の別は切り離して考えるべきではないかと思います。
もっと正確にいうと、ビジネスロジック層のデータ構造(抽象データ構造=オブジェクト指向データ構造)と、ストレージ層以下で使われるデータ構造(物理データ構造=メモリ/データベース(ディスク))は、分けて考えるものではないかということです。
書籍の例を用いて、少し具体的に説明してみます。
会員クラスが以下のように定義されているとします。
(擬似Javaコード)
class Kaiin
{
int kaiinId;
ShosekiList yoyakuList;
//コンストラクター
Kaiin(int Id) {
this.kaiinId = Id;
}
ShosekiList getYoyakuList() {
if (yoyakuList == null) { //[※]
getYoyakuListFromStorage();
}
return this.yoyakuList;
}
private ShosekiList getYoyakuListFromStorage() {
// データベースからthis.kaiinIdの予約リストを検索して
// KaiinインスタンスのyoyakuListに格納する処理
this.yoyakuList = ...;
return this.yoyakuList;
}
}
ここでは、予約リストを取り出す際、[※]で、もし予約リストがすでにメモリ上にあればそれを使い、なければデータベースから取ってくるようになっています。
上のクラスを利用すると、ある会員の予約リストを取り出す処理は、
Kaiin k = new Kaiin(id);
ShosekiList sl = k.getYoyakuList();
となり、予約リストがメモリ上にあるかデータベースから取ってくるかを意識する必要はありません。
ちなみに、どのようなインスタンスに対しても[※]のような処理を自動的にやってくれるのが、#2で挙げたJ2EE/EJBなどのフレイムワークと考えてください。
大変わかりやすいご回答有難うございました。
納得です。
これを機にJ2EEパターン等より勉強していきたいと思います。
また機会がありましたら宜しくお願いします。
No.2
- 回答日時:
> それとも設計は無視して一ユーザがアクセスする度にセッション内にデータベースから1レコード分のインスタンスを生成し、検索はインスタンスではなくSQLですませてしまうものなのでしょうか?
「設計は無視して」のところが気になりますが、こちらが正解だと思います。
ある程度大規模なWebアプリの設計には、現在では通常「三層モデル」(3 tier model)が用いられます。これは、アプリを「フロントエンド」「ビジネスロジック」「ストレージ」(必ずしもこの呼称が使われているとは限りませんが)に分けて考える手法です。
「会員」「書籍」「地域」などのエンティティの扱いは、ビジネスロジック層に相当します。この層では、それをメモリにロードするかデータベースに格納するかなどということは意識せず、インスタンスとして扱い、ロジックを組み立てます。
メモリへのロードやデータベースへの格納は、ストレージ層で隠蔽します。こうした隠蔽に用いられるテクニックとして、J2EEコンテナーやEJBなどがあります。
以上、非常に大ざっぱな説明ですが…。
もっと詳しい情報は、ここに出てきた単語を検索すれば得られると思います。
この回答への補足
早速のご回答ありがとうございます。
補足で以下の考え方が正しいか教えていただけませんか?
例えば、ある会員が予約している書籍を一覧表示する場合、オブジェクト指向的に考えれば、会員クラスが保持する予約リストフィールドに書籍クラスのインスタンスを保持するような設計になると考えております。でもこの場合、結局書籍インスタンスがすべて必要になり、100万件分のインスタンスのメモリ領域が必要になると考えております。逆にSQLでやる場合は、一覧表示をする際にその都度、SQLを発行しリストを生成する感じになると考えます。この方法はクラス図の設計を無視していると思うのですが、私の考えが間違っていますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- グループウェア Macでオープンオフィスが開きません 1 2023/01/14 14:22
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- その他(SNS・コミュニケーションサービス) 大至急お助け下さい。マストドンの或るインスタンスに登録したいのですが、ユーザー名で半角英数とアンダー 1 2023/08/25 10:33
- Excel(エクセル) 別インスタンスのエクセルを制御したい 1 2023/05/10 02:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
変数名の付け方
-
C# インスタンスの破棄
-
生成したインスタンスを削除す...
-
VB6.0で、DLLを動的に参照したい
-
エクセル(複数インスタンス)...
-
コンストラクタで設定した値が...
-
C#「オブジェクト参照が必要で...
-
非staticフィールドを参照でき...
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
VB.NET getとsetの概念がわかり...
-
変数の参照でエラーが出てしま...
-
Javaプログラムでプロキシを経...
-
フォームのCheck boxとOLEObjec...
-
フォームの存在をチェックする方法
-
vb.netでFAXを送信する方法
-
他のファイルの変数参照
-
SetWindowsHookExで質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
C# インスタンスの破棄
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
newしないインスタンス?実体化...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
文字列を日付に変換でParseExce...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
C#の構造体の開放のしかた
-
マルチスレッド間でデータ交換...
-
vb.netでFAXを送信する方法
おすすめ情報