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

i7uaboj4  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(264)

形势概述

当前的问题是关于软件用户(客户机)希望对某个材料进行评估的情况。此评估可以使用一个或多个标准来完成,用户可以在软件的管理区域中添加和删除这些标准。请注意,评估必须保存在数据库中,以备将来参考。
附加信息:软件是用java编写的。

目标

假设有三张table。表 Material ,表格 Evaluation 和table Criteria . 注意pk idMaterial fk在吗 Evaluation .
下图显示了这些表格:

这三个表是实际表的简化。criteria表命名条件变量,并为在评估中计算的最终分数设置其权重。
在这种情况下,目标是用户能够添加和删除条件。定义了标准之后,他就可以创建材质的评估。
并使用这些标准在数据库中保存评估。
换句话说,我需要存储每个用户定义标准的得分。

问题

从技术Angular 来看,我们注意到:
软件必须允许用户删除和添加列。这有点棘手,因为如果他删除了2列并添加了1列,代码就必须找到他删除了哪一列并只删除它们,然后只添加一列。这个例子很棘手,因为如果我们删除所有的列,只添加他维护/添加的列,代码会更简单。
弄乱表列对于表的完整性来说似乎是危险的。尤其是在未知的情况下。
我在寻找更好更安全的解决方案。
任何建议都非常感谢。我希望我把问题说得尽可能清楚。

约束条件

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

yzuktlbb

yzuktlbb1#

但是我如何在事后创建一个评估呢?因为在你的解决方案中,每个标准都是一行。。。请举例说明好吗?
在我们的一个系统中,用户可以定义0到无限的标准。
因此,需要使用行。
具体来说,用户可以附加一个或多个 filters (他们是 or 'd)每个过滤器可以包含一个或多个 criterias (他们是 and (d)
代码方面的评估如下所示(这不是复制/粘贴代码,但可能会给您一个想法)。 environmentVariables 基本上是一个包含我们试图应用过滤器的对象属性的Map:

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");

    }
}
4ktjp1zp

4ktjp1zp2#

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

z4bn682m

z4bn682m3#

添加额外的表标准,其中两个外部特性作为主键..存在两个解决方案最后一个如我所说,这是您绘制的

相关问题