3

我有这样的表达:

(猫或猫或小猫或小猫)和(狗或狗)不是(鸽子或萤火虫)

有人知道如何制作表格来保存这些吗?

在收到使用括号的请求之前,我限制了运算符的使用以避免出现模棱两可的情况。所以只有 AND 和 NOT 或只有 OR 并以这种方式保存它们:

运营商

id | name  
1  | AND  
2  | OR  
3  | NOT  

关键词

id | keyword  
1  | cat  
2  | dog  
3  | firefly  

表达式

id | operator | keywordId  
1  | 0        | 1   
1  | 1        | 2  
1  | 3        | 3  

这是:猫和狗不是萤火虫

但现在,我真的很困惑……

4

5 回答 5

3

将它们保存为字符串或序列化数据结构(例如解析树)很可能是最好的解决方案,除非您确实需要修改数据库本身中的部分表达式。

于 2010-05-20T14:41:02.487 回答
3

对于您的示例,我会将它们存储为文本格式的反向波兰语,运算符/操作数为空格:

cat cats OR dog dogs OR AND
pigeon firefly OR NOT

这使您可以真正轻松简单地实现布尔表达式求值器,我想这就是您想要的。

如果您想让评估更容易,我会将对象名称的绑定存储到一个小词汇表(例如,AZ)和一个类似的 AND、OR、NOT 词汇表:

cat A cats B dog C dogs : DAB+CD+&
pigeon A firefly : AB+~

然后基本表达式评估器只需要处理单个字符,并且非常非常容易编码。

于 2010-05-20T15:00:36.463 回答
2

在过去的这种情况下,我创建了一个整数列,可以对其执行按位运算。解释如下:

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

Cat  Dog  Firefly
---  ---  ------
1     2     4

接下来,您将在主表中添加一个整数列,我们将其称为选项。当数字转换为二进制时,每个数字将代表天气允许猫、狗或萤火虫进入。例子:

5 = 101 二进制 = 允许猫,不允许狗,允许萤火虫。

id | locationName | options
---------------------------
1  | loc 1        | 5
2  | loc 2        | 2
3  | loc 3        | 7
4  | loc 4        | 6

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

当我们不涉及猫或萤火虫时,要获取所有允许狗的记录,您将执行以下按位运算:

2 & 选项 = 2

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


为了获得所有允许狗和萤火虫的记录,我们将执行以下位运算:

6 & 选项 = 6

这将返回记录 3 和 4


要获取所有允许猫和萤火虫的记录,我们将执行以下按位运算:

5 & 选项 = 5

这将返回记录 1 和 3。


只接受萤火虫:

4 | 选项 = 4


不接受萤火虫:

4 & 选项 = 0


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

于 2010-05-20T15:32:25.040 回答
0

我认为您需要一种连接“子表达式”的可能性。为什么表表达式中没有一个可以为空的外键链接到自身(到父表达式)?

于 2010-05-20T14:51:05.487 回答
0

(猫或猫)和(狗或狗)不是(鸽子或萤火虫)

猫和狗不是萤火虫

都是无效的布尔表达式,因为 NOT 是一元运算符(它只需要 1 个操作数)。

话虽如此,这是一个顽固的人。在数据库级别进行本地化已经够难的了。嗯..下面浮现在脑海中:

表达式

Id|运算符|关键字1|关键字2|表达式1|表达式2

所以在这里,keyword1、keyword2、expression1 和 expression2 都可以为空,并且每个表达式都存储为对关键字或另一个表达式的一元运算,或者对 0、1 或 2 个关键字和 0、1、2 个其他表达式的二元运算. 每个表达式 1 条记录,所有子表达式都有附加记录。您可以递归地完成代码中的评估。

这样你就不会有重复的ID。我看到的唯一缺点是很难保存(CAT AND CATS)AND DOG vs CAT AND(CATS AND DOG)之类的东西。两者的计算结果相同,但计算顺序发生了变化。

很确定这会奏效。如果您需要更多详细信息,请在评论中联系我。

普拉门

于 2010-05-20T15:13:25.950 回答