有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将筛选器集传递到数据库类以供SQL使用的最佳设计

我正在开发一个抽认卡应用程序。部分原因是用户可以选择过滤难度级别和类别的结果(将来可能会有更多选项)。有关用户屏幕的快速模型,请参见此图

闪存卡的数据存储在单个表中的Derby DB中。一列表示级别。每个类别的一列,用“Y”或“N”表示卡片是否属于该类别

目前,我有一个过滤器类,每个复选框只有一个变量。然后我将其传递给数据库类。但从这里开始,需要一组复杂的if/else语句来构建正确的SELECT语句查询

1)是否有更好的设计方法
2) 我的1表方法是注定要失败还是在这种情况下可以?我正走进什么陷阱

Sample Filter
(来源:erinchris.com


共 (2) 个答案

  1. # 1 楼答案

    古老的格言是,在计算机科学中有三个数字:零、一或无限。我建议不要为每个级别创建一个布尔列,而是为级别创建一个枚举或整数列,或者使用一个类别表和两个类别之间的连接,使用外键将问题链接到一个或多个类别,或者使用枚举或整数的“类别”列。这样,当您添加/删除/重命名新类别或级别时,就不会修改数据库模式。它独立于它包含的数据


    此外,这将大大简化SQL查询。比较:

    SELECT * FROM questions WHERE category1 = false AND category2 = false AND category3 = false ... and (level = 1 OR level = 2);
    

    SELECT * FROM questions WHERE category = 1 AND level = 2;
    

    或者

    SELECT * FROM questions WHERE category IN (1,3,6) AND level in (1,2);
    
  2. # 2 楼答案

    在过去类似的情况下,我创建了一个整数列,可以对其执行逐位操作。解释如下:

    首先为每个值分配一个二进制数字-

    cat1  cat2  cat3 cat4
                 
    1     2     4    8
    

    接下来,您将在主表中添加一个整数列,我们称之为选项。当数字转换为二进制时,每个数字将代表设置的天气类别1、2、3或4。例如:

    二进制中的5=0101=cat1已设置,cat2未设置,cat3已设置,cat4未设置

    id | name         | options
                 -
    1  | name1        | 5
    2  | name2        | 2
    3  | name3        | 7
    4  | name4        | 6
    

    我们现在可以对选项列使用位操作来确定允许哪些选项。例如:

    要在不关心其他类别的情况下获取设置了类别2的所有记录,请执行以下操作:

    2&;选项=2

    这将返回记录2、3和4


    要获取设置了cat2和cat3的所有记录,我们将执行以下逐位操作:

    6&;选项=6

    这将返回记录3和4


    要获取设置了类别1和类别3的所有记录,我们将执行以下逐位操作:

    5&;选项=5

    这将返回记录1和3


    仅3类设置:

    4 |选项=4


    3类未设置:

    4&;选项=0


    这可能是一个很难理解的概念,所以如果你有任何问题,请告诉我。在我看来,一旦你掌握了这个概念,这可能是完成你想要做的事情的最简单方法