将过滤器集传递到SQL类的数据库类的最佳设计

时间:2010-07-08 18:32:28

标签: java database-design derby

我正在开发一个FlashCard应用程序。部分原因是为用户提供了在难度级别和类别上过滤结果的选项(可能在将来有更多选项)。查看图像以获得用户屏幕的快速模型。

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

目前,我有一个Filter类,每个复选框都有一个变量。然后我将它传递给Database类。但是从那里开始,它是一组复杂的if / else语句来构建正确的SELECT语句查询。

1)有更好的方法来设计它吗? 2)在这种情况下,我的1表方法注定会失败吗?我走进了什么陷阱?

Sample Filter http://www.erinchris.com/CodeProjects/PractiCardsFilterExample.jpg

2 个答案:

答案 0 :(得分:2)

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


此外,这将大大简化您的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);

答案 1 :(得分:1)

在过去的这种情况下,我创建了一个整数列,可以执行按位操作。说明如下:

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

cat1  cat2  cat3 cat4
----  ----  ---- ----
1     2     4    8

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

5 = 0101 in binary = cat1设置,cat2未设置,cat3设置,cat4未设置

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

我们现在可以对options列使用按位运算来确定允许的选项。例子:

要在不关心其他类别时设置所有已设置类别2的记录,请执行以下操作:

2& options = 2

这将返回记录2,3和4。


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

6& options = 6

这将返回记录3和4


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

5& options = 5

这将返回记录1和3。


仅限第3类:

4 |选项= 4


类别3未设置:

4& options = 0


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