存储逻辑规则的适当数据结构和数据库模式是什么?

时间:2009-12-14 19:29:25

标签: database boolean-logic rule-engine

前言:我没有规则引擎,构建规则,建模规则,实现规则的数据结构等等方面的经验。因此,我不知道我在做什么,或者我在下面尝试过的是基础。

我正在试图弄清楚如何存储和处理以下假设情景。为了简化我的问题,假设我有一种用户购买对象的游戏类型,其中可能有1000个可能的对象,并且必须按指定的顺序购买对象,并且只能在特定的组中购买。例如,假设我是用户并且我想购买对象F.在我购买对象F之前,我必须先前购买了对象A OR(B和C)。我不能同时购买F和A,也不能购买F和B.它们必须符合规则指定的顺序。先是,然后是F。或者,首先是B,C,然后是F.我现在并不关心购买之间的时间跨度,或用户的任何其他特征,只是它们是现在的正确顺序。

为潜在的数千个对象存储此信息的最佳方法是什么,这些对象允许我读取所购买对象的规则,然后根据用户之前的购买历史记录进行检查?

我试过这个,但我一直试图实现A OR(B和C)这样的分组。我想将规则存储在我拥有这些表的数据库中:

 Objects
    (ID(int),Description(char)) 

ObjectPurchRules
    (ObjectID(int),ReqirementObjectID(int),OperatorRule(char),Sequence(int)) 

但显然当你处理结果时,没有分组,你会得到错误的答案。如果可能,我想避免过多的字符串解析:)。一个对象可能具有未知数量的先前所需购买。用于处理规则的SQL或伪代码片段将不胜感激。 :)

3 个答案:

答案 0 :(得分:5)

似乎您的问题分解为测试是否满足特定条件。

你将有复合条件。 所以给出一个项目表:

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

所以OWNS意味着id是Items表的一个键,MEETS_CONDITION意味着id是Conditions表的一个键。

这并不意味着限制你。你可以添加任务或其他任何表格,并添加额外的动词来告诉你在哪里看。或者,只需在完成任务后将任务放入Items表中,然后将完成的任务解释为拥有特定徽章。然后你可以使用相同的代码处理项目和任务。

答案 1 :(得分:0)

这是一个非常复杂的问题,我没有资格回答,但我看到很多引用。根本问题在于游戏,任务和项目以及各种对象的“统计”可能具有非关系依赖性。 This thread may help you a lot

您可能想要阅读有关该主题的几本书,并考虑将LUA用作规则处理器。

答案 2 :(得分:0)

我个人会在代码中执行此操作,而不是在SQL中执行此操作。每个项目应该是它自己的实现接口的类(即IItem)。 IItem将有一个名为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 )
}