JTableを使用して、エンティティ、属性、値(EAV)ストア(リレーショナルDBMS)から取得したエンティティの属性プロパティを表示および編集するにはどうすればよいですか?
これは多くの可能な回答がある質問であることを私は知っているので、回答する前に以下の要件を確認してください。
私はあなたがすべてを読んで理解したことを示す答えに投票することを約束します(それらが完全に愚かでない限り)。
ユーザーは次のことができる必要があります。
属性でエンティティをフィルタリング/検索
表示する属性を(列として)選択します
選択した属性でエンティティを並べ替える
属性値を編集する
選択したエンティティに対して操作を実行します
(オプション)後で使用するためにビューを保存する機能。
システム要求:
エンティティの数:10万以上の一意のエンティティにスケールアップする必要があります
属性:ユーザーは新しい属性を追加および定義できます。システムはこれを処理できる必要があります
基盤となるストレージ:H2データベース(すでに設計済み)、JDBCによる通信
メモリ:すべてが収まるわけではないので、どういうわけかDBMSクエリからプルする必要があります
パフォーマンス:DBMSに必要なクエリの数を最小限に抑える必要があります(属性ごとに1つのクエリでOK、テーブルビューごとに1つのクエリを持つフォームがありますが、それはひどいです)。
クエリ:検索/フィルターに一致するエンティティのリストを生成するには、1つのクエリが必要です。そうでなければ、大規模なパフォーマンスは最悪です。
データの再利用:列が追加されたときにリスト全体を再クエリまたは再ソートする必要はありません。
私が見たもの:
艶をかけられたリストライブラリ
長所:
- カラムの取り扱いに柔軟に対応
- エンティティの並べ替え/フィルターの実装が簡単
- 列の表示形式と編集に柔軟に対応
短所:
- エンティティごとに1つのオブジェクト(オブジェクトが複雑な場合、メモリのオーバーヘッドは重大なメモリの問題になります!)
- すべての機能を担当するオブジェクト...ただし、オブジェクトはメモリ上の理由から単純である必要があります
- すべてのエンティティオブジェクトに対してHashMapを使用せずにユーザーが選択可能な列をサポートするにはどうすればよいですか?
AbstractTableModelを拡張して、JDBC ResultSetから行、列にデータをマップします
- 長所:
- 結果のページングにより、メモリの問題が回避されます
- 検索/フィルタリングはSQLで直接行われます
- メモリに優しい、行ごとにオブジェクトを作成する必要はありません
- 短所:
- カスタム列の実装と並べ替えは面倒です(テーブルヘッダーレンダラー、並べ替え列と順序の管理など)。
- おそらくカスタムJTableColumnModelも作成する必要があり、これは面倒になります。
- SQLを頻繁に操作する必要があるため、DBスキーマが変更された場合は、複数のコードを書き直す必要があります。
- エンティティID情報を維持するのが難しい
- 長所:
ORM
- 長所:
- DB行をオブジェクトにマップするように設計されています
- オブジェクト管理を提供します
- 短所:
- エンティティ-属性-値モデルの最悪のソリューション
- DBMSとJavaコードに加えて、ORMコードを学習して作成する必要があります。
- エンティティは任意の数の属性を持つことができます。ORMは静的で制限されたオブジェクト属性でのみ有効です
- カスタムSQLの柔軟性/速度を失う
- 長所:
私が見逃したより良いオプション、またはグレーズドリストやカスタムテーブルモデルを簡単にするための賢い方法はありますか?
ORMは、EAVストレージとのマッチングが非常に悪いため、オプションとして完全に破棄しました。