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

时间:2018-10-31 20:38:25

标签: java mysql

情况概述

当前问题与软件用户(客户)想要评估材料的情况有关。可以使用1个或多个条件(用户可以在软件的主管区域中添加和删除)来完成此评估。请注意,评估结果必须保存在数据库中,以备将来查阅。

其他信息:该软件使用Java编码。

客观

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

下图说明了表格:

enter image description here

这三个表是实际表的简化。 “条件”表将条件变量命名为标准变量,并根据评估计算出的最终分数设置其权重。

在这种情况下,目标是用户能够添加和删除条件。 在定义了标准之后,他就可以为物料创建评估。

并使用这些条件在数据库中保存评估。

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

问题

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

  1. 该软件必须允许用户删除和添加列。这有点棘手,因为如果他删除2列并添加1,则代码将必须找到他删除的列并仅删除它们,然后只添加一个列。从这个意义上说,该示例很棘手,如果我们仅删除所有列并仅添加他维护/添加的列,则在代码中会更容易。
  2. 处理表列似乎对表的完整性很危险。尤其是在未知连接(?)的情况下。

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

任何建议都将不胜感激。我希望我尽可能明确地提出这个问题。

约束

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

3 个答案:

答案 0 :(得分:0)

然后,基于您的评论,您应该只创建一个标准表,用户在其中添加一行以指定评估标准。添加和删​​除此文件将更加安全,因为您无需更改实际的表属性,而是操作条目

编辑

要使用此功能,只需使用INSERT INTO语句,即可在其中将值插入到列中。

答案 1 :(得分:0)

  

但是,之后如何创建评估?由于在您的解决方案中,每个条件都是连续的...请您举例说明吗?

在我们的系统之一中,我们拥有相等的条件,用户可以为某个事物定义0到无限的标准。

因此,您需要使用行。

详细信息,用户可以附加一个或多个filters(它们是or),其中每个过滤器可以包含一个或多个criterias(它们是and 'd)

从代码方面进行评估看起来像这样。 (这不是复制/粘贴代码,但可能会给您一个想法)。 environmentVariables基本上是一张地图,其中包含我们要在其上应用过滤器的对象属性:

public static boolean evaluate(Filter filter, Map<String, Object> environmentVariables) {
    for (Criteria criteria : filter.getCriterias()) {
        if (!evaluateCriteria(criteria, environmentVariables)) {
            // one missmatch -> false.
            return false;
        }
    }

    // all criterias matched, that filter is true.
    return true;
}

public static boolean evaluateCriteria(Criteria criteria, Map<String, Object> environmentVariables) {
    if (environmentVariables != null) {
        if (environmentVariables.containsKey(criteria.getKey())) {
            return evaluateCriteria(criteria, environmentVariables.get(criteria.getKey()));
        }
    }
    return false;
}

private static boolean evaluateCriteria(Criteria criteria, Object value) {
    switch (criteria.getOperator()) {
        case LIKE:
            if (value != null) {
                return value.toString().toLowerCase().contains(criteria.getValue().toString().toLowerCase());
            } else {
                return false;
            }
        //other OperatorTypes
        case STARTSWITH: // code...
        case ENDSWITH: // code...
        case EQUALS: // code...
        case GREATER_THAN: // code...
        case GREATER_THAN_EQUAL: // code...
        case LESSER_THAN: // code...
        case LESSER_THAN_EQUAL: // code...
        default:
          throw new UnsupportedOperationException(criteria.getOperator() + " is not defined");

    }
}

答案 2 :(得分:-2)

添加带有两个外来功能作为主键的额外表条件。.正如我所说的,最后一个解决方案存在两个解决方案,并且您已经得出结论