논리 규칙을 저장하는 데 적합한 데이터 구조와 데이터베이스 스키마는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1902951

문제

머리말:나는 규칙 엔진, 규칙 작성, 규칙 모델링, 규칙에 대한 데이터 구조 구현 등에 대한 경험이 없습니다.그러므로 나는 내가 무엇을 하고 있는지, 아래에서 시도한 것이 기본에서 벗어난 것인지 알 수 없습니다.

다음과 같은 가상 시나리오를 저장하고 처리하는 방법을 알아내려고 합니다.내 문제를 단순화하기 위해 사용자가 개체를 구매하는 게임 유형이 있다고 가정해 보겠습니다. 여기서는 1000개의 가능한 개체가 있을 수 있으며 개체는 지정된 순서에 따라 특정 그룹에서만 구입해야 합니다.예를 들어, 제가 사용자이고 객체 F를 구매하고 싶다고 가정해 보겠습니다.객체 F를 구매하려면 이전에 객체 A OR(B AND C)를 구매해야 합니다.F와 A를 동시에 구매할 수 없으며, F와 B,C도 구매할 수 없습니다.규칙이 지정하는 순서대로 이루어져야 합니다.먼저 A를 하고 그 다음에는 F를 사용합니다.또는 B, C를 먼저 사용한 다음 F를 나중에 사용합니다.지금 당장은 구매 사이의 시간 간격이나 사용자의 다른 특성에 관심이 없으며 단지 현재로서는 올바른 순서라는 것뿐입니다.

구매 중인 개체에 대한 규칙을 읽을 수 있도록 잠재적으로 수천 개의 개체에 대한 이 정보를 저장한 다음 사용자의 이전 구매 내역과 비교하여 확인할 수 있는 가장 좋은 방법은 무엇입니까?

이렇게 시도했지만 A 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

따라서 OWNS는 ID가 Items 테이블의 키임을 의미하고 MEETS_CONDITION은 ID가 Conditions 테이블의 키임을 의미합니다.

이것은 당신을 제한하려는 것이 아닙니다.퀘스트 등이 포함된 다른 테이블을 추가할 수 있고, 어디를 봐야 할지 알려주는 추가 동사를 추가할 수 있습니다.또는 퀘스트를 완료할 때 Items 테이블에 넣은 다음 완료된 퀘스트를 특정 배지를 소유한 것으로 해석합니다.그러면 동일한 코드로 아이템과 퀘스트를 모두 처리할 수 있습니다.

다른 팁

이것은 내가 대답 할 자격이없는 매우 복잡한 문제이지만 많은 언급을 보았습니다. 근본적인 문제는 게임, 퀘스트 및 항목 및 다양한 객체의 "통계"가 비 관계형 의존성을 가질 수 있다는 것입니다. 이 스레드는 많은 도움이 될 수 있습니다.

이 주제에 관한 몇 권의 책을 선택하고 LUA를 규칙 프로세서로 사용하는 것을 살펴볼 수 있습니다.

개인적으로 나는 SQL이 아닌 코드로 이것을 할 것입니다. 각 항목은 인터페이스를 구현하는 자체 클래스 여야합니다 (예 : iitem). IITEM은 해당 품목을 구매하는 것이 괜찮은지 확인하는 OKTOPURCHASE라는 메소드를 갖습니다. 이를 위해, 그것은 당신이 빌드 할 수있는 규칙 모음 (예 : hasprevelypuphased (x), 현재 소유 한 (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 )
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top