論理規則を格納するための適切なデータ構造とデータベーススキーマとは何ですか?
-
19-09-2019 - |
質問
はじめに:私は、ルール・エンジン、建物のルール、モデリングルール、ルールのデータ構造を実装する、またはその他もろもろの経験を持っていません。したがって、私は私がやっているかわからないか、私は以下試みたことは仕方オフベースである場合。
私は、次の仮定のシナリオを格納して処理する方法を把握しようとしています。私の問題を単純化するために、私は、ユーザーが可能なオブジェクトの1000のがあるかもしれないオブジェクトを、購入したゲームの種類があり、オブジェクトが指定された順序でのみ、特定のグループで購入しなければならないと言います。例えば、私はユーザーだと私は私がオブジェクトFを購入する前にオブジェクトF.を購入したいと言う、私は以前に、オブジェクトA OR(B AND C)を購入されている必要があります。私はFと同時にA、またFとB、Cを購入することはできません。彼らは、ルールが指定する順序でなければなりません。 Fその後、最初の後に。又は、B、Cまず、次いでF後で。私は、彼らが今の正しい配列でちょうどことを、購入、または使用者の任意の他の特性の間の時間のスパンで今心配していませんよ。
私は、購入されているオブジェクトのためのルールで読むことができますオブジェクトの潜在的に何千ものためにこの情報を保存して、ユーザーの以前の購入履歴に対してそれをチェックするための最良の方法は何ですか?
私はこれをしようとしましたが、私はそのようなOR(B AND C)としてグループ化を実現しようとしているにこだわっています。私はこれらのテーブルを持つデータベースにルールを保存したいと思います:
Objects
(ID(int),Description(char))
ObjectPurchRules
(ObjectID(int),ReqirementObjectID(int),OperatorRule(char),Sequence(int))
しかし、明らかにあなたは結果によってプロセスとして、グループ化せずに、あなたが間違った答えを得ます。私は、可能ならば:)過度の文字列解析を避けるためにしたいと思います。一つの目的は、以前に必要な購入数は不明を持つことができます。ルールを処理するためのSQLまたは擬似コードスニペットは理解されるであろう。 :)
解決
あなたの問題は、特定の条件が満たされているかどうかをテストするに破壊するように思えます。
あなたは複合条件を持つことになります。 だから、アイテムのテーブルを与えられます:
ID_Item Description ---------------------- 1 A 2 B 3 C 4 F
と可能なアクションのテーブルを与えられます:
ID_Action VerbID ItemID ConditionID ---------------------------------------- 1 BUY 4 1
私たちは、条件のテーブルを構築します:
ID_Condition VerbA ObjectA_ID Boolean VerbB ObjectB_ID --------------------------------------------------------------------- 1 OWNS 1 OR MEETS_CONDITION 2 2 OWNS 2 AND OWNS 3
だから、所有しているidはアイテムテーブルへの鍵であることを意味し、そしてMEETS_CONDITIONはidが条件テーブルへの鍵であることを意味します。
このはあなたを制限するものではありません。あなたはクエストまたは任意で他のテーブルを追加し、どこを見れするかを伝えるために余分な動詞を追加することができます。それとも、あなたがそれらを完了したときにちょうどあなたのアイテムテーブルにクエストを入れ、その後、特定のバッジを所有しているとして完成クエストを解釈します。そして、あなたは同じコードでアイテムやクエストの両方を扱うことができます。
他のヒント
これは私が答える資格がないんだけど、非常に複雑な問題ですが、私はへの参照をたくさん見てきました。根本的な問題は、さまざまなオブジェクトのためのゲーム、クエスト、アイテムと「統計」のために、非リレーショナルの依存関係を持つことができるということです。 このスレッドは。
あなたはトピックのカップルの本をピックアップすると、ルールプロセッサとしてLUAを使用してに見えるかもしれません。
個人的に私は、コードではなく、SQLでこれを行うだろう。各項目は、インターフェース(すなわちIItem)を実装する独自のクラスであるべきです。 IItemは、そのアイテムを購入するためにOKであるかどうかを判断でしょうOkToPurchaseと呼ばれる方法を持っているでしょう。これを行うには、それはあなたが構築できるというルールの集合(すなわちHasPreviouslyPurchased(x)は、CurrentlyOwns(X)、など)の一つ以上を使用します。
素敵なところは、すべての既存のロジックを壊すことなく、新しいルールで、このアプローチを拡張することは容易であるということです。
ここではいくつかの擬似コードです。
bool OkToPurchase()
{
if( HasPreviouslyPurchased('x') && !CurrentlyOwns('y') )
return true;
else
return false;
}
bool HasPreviouslyPurchased( item )
{
return purchases.contains( item )
}
bool CurrentlyOwns( item )
{
return user.Items.contains( item )
}