为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英3389331 2021-12-22 15:34:37
情况概览当前的问题是关于软件用户,即客户,想要对材料进行评估的情况。该评估可以使用 1 个或多个标准来完成,用户可以在软件的主管区域添加和删除这些标准。请注意,评估必须保存在数据库中以备将来查阅。额外信息:该软件是用 Java 编码的。客观的假设三个表。表Material,表Evaluation和表Criteria。请注意,PKidMaterial是 中的 FK Evaluation。下图说明了这些表格:这三个表是对真实表的简化。Criteria 表命名了标准变量,并为评估中计算出的最终分数设置其权重。在这种情况下,目标是用户能够添加和删除标准。定义好标准后,他就可以对材料进行评估。并使用这些标准来保存对数据库的评估。换句话说,我需要存储给每个用户定义的标准的分数。问题从技术角度来看,我们注意到:该软件必须允许用户删除和添加列。这有点棘手,因为如果他删除 2 列并添加 1,则代码必须找到他删除的列并仅删除它们,然后只添加一列。这个例子很棘手,因为如果我们可以删除所有列并只添加他维护/添加的列,那么在代码中会更容易。弄乱表格列对于表格的完整性似乎是危险的。特别是在未知连接(?)的情况下。我正在寻找更好更安全的解决方案。任何意见是极大的赞赏。我希望我尽可能清楚地说明了这个问题。约束除了我使用 Java 和 MySQL 之外,解决方案没有任何限制。如果需要,我可以创建更多表,并且我可以允许用户添加/删除列。
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

但是之后如何创建评估?由于在您的解决方案中,每个标准都是一行……请举例说明好吗?


在我们的一个系统中,我们有一些相同的东西,用户可以在其中定义 0 到无限的标准。


因此,您需要使用行。


详细地说,用户可以附加一个或多个filters(它们是or'd),其中每个过滤器可以包含一个或多个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");


    }

}


查看完整回答
反对 回复 2021-12-22
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

然后根据您的评论,您应该只为标准创建一个表,用户在其中添加一行来指定评估标准是什么。这将更安全地添加和删除,因为您不会更改实际的表属性,而是操作条目

编辑

要使用它,只需使用一个INSERT INTO语句,在其中将值插入到列中。


查看完整回答
反对 回复 2021-12-22
?
倚天杖

TA贡献1828条经验 获得超3个赞

添加具有两个外来特征作为主键的额外表格标准......正如我所说的最后一个存在两种解决方案,这个你已经画了


查看完整回答
反对 回复 2021-12-22
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信