3

私はこのような表現をしています:

(猫または猫または子猫または子猫)AND(犬または犬)NOT(鳩またはホタル)

それらを保存するためのテーブルを作成する方法を知っている人はいますか?

角かっこを使用するように要求される前は、あいまいな状況を避けるために演算子の使用を制限していました。したがって、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

過去にこのような状況で、ビットごとの操作を実行できる整数列を作成しました。以下の説明:

各値に 1 つの 2 進数を割り当てることから始めます。

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

次に、メイン テーブルに整数列を追加します。これをオプションと呼びます。数値が 2 進数に変換されると、各桁は猫、犬、またはホタルが許可されている天気を表します。例:

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

「部分式」を連結する可能性が必要だと思います。(親式に)それ自体にリンクしているテーブル式にnull許容の外部キーがないのはなぜですか?

于 2010-05-20T14:51:05.487 に答える
0

(猫 OR 猫) AND (犬 OR 犬) NOT (鳩 OR ホタル)

猫と犬はホタルではない

NOT は単項演算子であるため、どちらも無効なブール式です (オペランドは 1 つしか取りません)。

そうは言っても、これはタフです。データベース レベルでローカリゼーションを行うだけでも十分に困難です。うーん..以下が思い浮かびます:

ID|演算子|キーワード1|キーワード2|式1|式2

したがって、ここでは、keyword1、keyword2、expression1、および expression2 はすべて null 可能であり、すべての式は、キーワードまたは別の式に対する単項演算、または 0、1 または 2 個のキーワードと 0、1、2 個の他の式に対する 2 項演算のいずれかとして格納されます。 . 式ごとに 1 レコード、すべての部分式に追加のレコードがあります。コード内の評価を再帰的に行うことができます。

これにより、ID が重複することはありません。私が見る唯一の欠点は、(CAT AND CATS) AND DOG 対 CAT AND (CATS AND DOG) のようなものを保存するのが難しいことです。これらはどちらも同じに評価されますが、計算の順序が変わります。

確かにこれはうまくいくでしょう。詳細が必要な場合は、コメントでお知らせください。

プラメン

于 2010-05-20T15:13:25.950 に答える