用户可以添加/删除列的情况

情况概览

当前的问题是关于软件用户,即客户,想要对材料进行评估的情况。该评估可以使用 1 个或多个标准来完成,用户可以在软件的主管区域添加和删除这些标准。请注意,评估必须保存在数据库中以备将来查阅。

额外信息:该软件是用 Java 编码的。

客观的

假设三个表。表Material,表Evaluation和表Criteria。请注意,PKidMaterial是 中的 FK Evaluation

下图说明了这些表格:

http://img2.mukewang.com/61c2d9c6000131c705330428.jpg

这三个表是对真实表的简化。Criteria 表命名了标准变量,并为评估中计算出的最终分数设置其权重。

在这种情况下,目标是用户能够添加和删除标准。定义好标准后,他就可以对材料进行评估。

并使用这些标准来保存对数据库的评估。

换句话说,我需要存储给每个用户定义的标准的分数。

问题

从技术角度来看,我们注意到:

  1. 该软件必须允许用户删除和添加列。这有点棘手,因为如果他删除 2 列并添加 1,则代码必须找到他删除的列并仅删除它们,然后只添加一列。这个例子很棘手,因为如果我们可以删除所有列并只添加他维护/添加的列,那么在代码中会更容易。

  2. 弄乱表格列对于表格的完整性似乎是危险的。特别是在未知连接(?)的情况下。

我正在寻找更好更安全的解决方案。

任何意见是极大的赞赏。我希望我尽可能清楚地说明了这个问题。

约束

除了我使用 Java 和 MySQL 之外,解决方案没有任何限制。如果需要,我可以创建更多表,并且我可以允许用户添加/删除列。


慕桂英3389331
浏览 155回答 3
3回答

拉莫斯之舞

但是之后如何创建评估?由于在您的解决方案中,每个标准都是一行……请举例说明好吗?在我们的一个系统中,我们有一些相同的东西,用户可以在其中定义 0 到无限的标准。因此,您需要使用行。详细地说,用户可以附加一个或多个filters(它们是or'd),其中每个过滤器可以包含一个或多个criterias(它们是and'd)从代码端评估看起来像这样。(这不是复制/粘贴代码,但可能会给您一个想法)。environmentVariables基本上是一个包含我们尝试应用过滤器的对象属性的地图:public static boolean evaluate(Filter filter, Map<String, Object> environmentVariables) {&nbsp; &nbsp; for (Criteria criteria : filter.getCriterias()) {&nbsp; &nbsp; &nbsp; &nbsp; if (!evaluateCriteria(criteria, environmentVariables)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // one missmatch -> false.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; // all criterias matched, that filter is true.&nbsp; &nbsp; return true;}public static boolean evaluateCriteria(Criteria criteria, Map<String, Object> environmentVariables) {&nbsp; &nbsp; if (environmentVariables != null) {&nbsp; &nbsp; &nbsp; &nbsp; if (environmentVariables.containsKey(criteria.getKey())) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return evaluateCriteria(criteria, environmentVariables.get(criteria.getKey()));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return false;}private static boolean evaluateCriteria(Criteria criteria, Object value) {&nbsp; &nbsp; switch (criteria.getOperator()) {&nbsp; &nbsp; &nbsp; &nbsp; case LIKE:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (value != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return value.toString().toLowerCase().contains(criteria.getValue().toString().toLowerCase());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; //other OperatorTypes&nbsp; &nbsp; &nbsp; &nbsp; case STARTSWITH: // code...&nbsp; &nbsp; &nbsp; &nbsp; case ENDSWITH: // code...&nbsp; &nbsp; &nbsp; &nbsp; case EQUALS: // code...&nbsp; &nbsp; &nbsp; &nbsp; case GREATER_THAN: // code...&nbsp; &nbsp; &nbsp; &nbsp; case GREATER_THAN_EQUAL: // code...&nbsp; &nbsp; &nbsp; &nbsp; case LESSER_THAN: // code...&nbsp; &nbsp; &nbsp; &nbsp; case LESSER_THAN_EQUAL: // code...&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException(criteria.getOperator() + " is not defined");&nbsp; &nbsp; }}

慕娘9325324

然后根据您的评论,您应该只为标准创建一个表,用户在其中添加一行来指定评估标准是什么。这将更安全地添加和删除,因为您不会更改实际的表属性,而是操作条目编辑:要使用它,只需使用一个INSERT INTO语句,在其中将值插入到列中。

倚天杖

添加具有两个外来特征作为主键的额外表格标准......正如我所说的最后一个存在两种解决方案,这个你已经画了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java