题
我如何可以使用JTable显示和编辑属性特性的实体从一个实体、特性、价值(EAV)存储,(a关系DBMS)?
我知道这是一个问题有很多可能的答案,所以请 看看这要求我们下面前回答。
我保证投票的答案显示你已经阅读和理解整个事情(只要他们不是完全傻).
用户需要的能够:
过滤/搜索实体通过自己的属性
选择哪些属性,以显示(作为列)
类实体通过选定的属性,
编辑属性的价值观
做作业上选定实体
(可选) 能力,以节省图,供以后使用。
系统要求:
数实体:需要扩展到100K独特的实体
属性:用户可以增加和确定新的属性、系统应该能够处理这个
潜在的储存:H2数据库(已经设计),通过JDBC
存储器:不一切都将配合,因此,在某种程度上需要从DBMS查询
性能:应尽量减少数量的查询需要DBMS(一项查询每属性确定,我有一个形式1的查询每表的看法,但它很烂).
查询:一个查询,应要求生成列表的实体匹配的搜查/过滤器。否则大规模的性能吸。
重复使用的数据:不应该重新进行查询或重新排序的整个列表时列加入。
我看着:
玻璃列出了图书馆
赞成:
- 灵活的关于列处理
- 容易实现的排序/过滤器的实体
- 灵活的关于列的显示格式和编辑
缺点:
- 一个物体每个实体(如果对象是复杂、存储器开销将成为一个严重的记忆问题!)
- 目负责所有的功能...但是,对象应该是简单的记忆的原因
- 我怎么支持,用户可选择列没有一个哈希每个实体对象?
延伸AbstractTableModel为地图数据从一个JDBC结果的行列
- 赞成:
- 寻呼的结果,避免了存储器的问题
- 搜查/过滤是直接在SQL
- 存储器友好,并没有使对象每排
- 缺点:
- 执行定义列和排序是一个痛苦(表的标题呈示,管理排序列和秩序,等等)!
- 可能需要编写定义JTableColumnModel过,这变得混乱!
- 有操纵SQL很多,所以,如果数据库模式的变化,必须重写多份代码!
- 难以维持的实体ID信息
- 赞成:
奥姆
- 赞成:
- 设计图DB行为的对象
- 提供对象的管理
- 缺点:
- 最坏的可能的解决方案实体的属性价值的模型
- 有学习和编写奥姆码外DBMS&Java代码!
- 实体可以有 任何 数量的属性,对象是静态的,有限的目属性
- 失去的灵活性和速度的定义SQL
- 赞成:
是有一个更好的选择,我错过了,或者一些聪明的办法,使玻璃清单或定制的表型号更容易?
我已经完全废弃奥姆作为一个选项,因为多么严重匹配它是EAV储存。
解决方案
我认为你最好的选择就是去与'延伸AbstractTableModel与形式地图数据从一个JDBC结果',因为
- Java6JTable已经建立在排序支持这样你真的不需要实施。
- 如果你设计的模型小心,你可以生存的一些架构的变化。代码清楚地允许自己作出改变容易,如果你需要的。
- 你得写信回来的变化。使用一个"保存"的按钮和批次更新,甚至可能会帮助你的表现。
- 你可以复盖TableCellEditor供应组合框,而不是默认的文本编辑器。
- 不要试图做的所有编辑在一个表中。有分离装置,用于项建立等等。
- 你可以添加、删除列JTable在运行时间。只是fireTableModelChanged()以及新列变得可见
编辑: 一个疯狂的事情我会做到创造一个定制的组件和做所有呈现自己和执行编辑操作,以及放置JTextField和JComboBox.
Edit2: 基于你的评论。保存的位置的选定项目之前,你做的火...()call.顺便说一句,我不认为叫重置排序或选择-没有问题。
如果你增加一栏,你可能仅仅取的关键领域的价值观用于新列只。显示他们在柱。然后做一个隐藏的完成重新装载的背景和交换的模型的时完成。这实际上是工作从多个结果集中在同一时间在一个表中。
删除是很容易因为你不出现的值得列。
Edit3:
DefaultRowSorter不是深刻的。它维持一个重建索引表对于你的记录。所以当JTable要求对第10行中,rowsorter检查,其第10条目索引表和检索,indexth元,从实际的模型。
如果你还有很多相同的字符串在模型使用一个简单的地图串串的高速缓冲的时候你查询的数据库中的数据。这种方式吨的多余的字符串的对象可以GC-d。
Edit4:
我会查询的新领域成地图的关键价值和我的主要模型包含了一系列的地图的关键价值。然后我会用一个获取名()实施其返回的价值的主要数据来源,从这些额外地图上的需求。我会查找排的关键,从初级模型和使用,以检索的实际价值从另外的地图。(顺便说一句.声誉,获得接受的答案是不受到每天的限制。)