java将筛选器集传递到数据库类以供SQL使用的最佳设计
我正在开发一个抽认卡应用程序。部分原因是用户可以选择过滤难度级别和类别的结果(将来可能会有更多选项)。有关用户屏幕的快速模型,请参见此图
闪存卡的数据存储在单个表中的Derby DB中。一列表示级别。每个类别的一列,用“Y”或“N”表示卡片是否属于该类别
目前,我有一个过滤器类,每个复选框只有一个变量。然后我将其传递给数据库类。但从这里开始,需要一组复杂的if/else语句来构建正确的SELECT语句查询
1)是否有更好的设计方法
2) 我的1表方法是注定要失败还是在这种情况下可以?我正走进什么陷阱
(来源:erinchris.com)
# 1 楼答案
古老的格言是,在计算机科学中有三个数字:零、一或无限。我建议不要为每个级别创建一个布尔列,而是为级别创建一个枚举或整数列,或者使用一个类别表和两个类别之间的连接,使用外键将问题链接到一个或多个类别,或者使用枚举或整数的“类别”列。这样,当您添加/删除/重命名新类别或级别时,就不会修改数据库模式。它独立于它包含的数据
此外,这将大大简化SQL查询。比较:
与
或者
# 2 楼答案
在过去类似的情况下,我创建了一个整数列,可以对其执行逐位操作。解释如下:
首先为每个值分配一个二进制数字-
接下来,您将在主表中添加一个整数列,我们称之为选项。当数字转换为二进制时,每个数字将代表设置的天气类别1、2、3或4。例如:
二进制中的5=0101=cat1已设置,cat2未设置,cat3已设置,cat4未设置
我们现在可以对选项列使用位操作来确定允许哪些选项。例如:
要在不关心其他类别的情况下获取设置了类别2的所有记录,请执行以下操作:
2&;选项=2
这将返回记录2、3和4
要获取设置了cat2和cat3的所有记录,我们将执行以下逐位操作:
6&;选项=6
这将返回记录3和4
要获取设置了类别1和类别3的所有记录,我们将执行以下逐位操作:
5&;选项=5
这将返回记录1和3
仅3类设置:
4 |选项=4
3类未设置:
4&;选项=0
这可能是一个很难理解的概念,所以如果你有任何问题,请告诉我。在我看来,一旦你掌握了这个概念,这可能是完成你想要做的事情的最简单方法