我正在开发一个FlashCard应用程序。部分原因是为用户提供了在难度级别和类别上过滤结果的选项(可能在将来有更多选项)。查看图像以获得用户屏幕的快速模型。
闪存卡的数据存储在单个表中的Derby DB中。 Level的一栏。每个类别的列,其中“Y”或“N”表示该卡是否属于该类别。
目前,我有一个Filter类,每个复选框都有一个变量。然后我将它传递给Database类。但是从那里开始,它是一组复杂的if / else语句来构建正确的SELECT语句查询。
1)有更好的方法来设计它吗? 2)在这种情况下,我的1表方法注定会失败吗?我走进了什么陷阱?
Sample Filter http://www.erinchris.com/CodeProjects/PractiCardsFilterExample.jpg
答案 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
这可能是一个难以掌握的概念,所以如果您有任何疑问,请告诉我。在我看来,一旦掌握了这个概念,它可能是完成你想要做的事情的最简单方法。