>

다음 SQL 테이블이 있습니다 :

| ID | GameId   | PlanId | MinAgeLimit | Amount |
|:--------------|--------|-------------|-------:|
| 1  | Cricket  |   P1   |   10        |   500  |
| 2  | Cricket  |   P2   |   15        |  1000  |
| 3  | Football |   P1   |   10        |   750  |
| 4  | Football |   P2   |   20        |  1000  |
| 5  | Football |   P3   |   22        |  2000  |
| 6  | Chess    |   P2   |   20        |   800  |

이제 다음과 같이 다른 'ReferrerId'에 대한 논리식을 가질 수 있습니다 :

If Referrer=ABC PlanId=P2 에 항목을 표시하지 마십시오. .

     

Referrer=PQR 인 경우 GameId=Cricket 가있는 항목 만 표시 .

     

Referrer=XYZ 인 경우 (GameID=Cricket OR GameID=Chess) AND MinAgeLimit>10 AND AMOUNT>500 가있는 항목 표시

이러한 맞춤 규칙을 저장하기 위해 권장되는 방법은 무엇입니까?

PS : Referrer가 셀프 서비스 포털을 통해 이러한 규칙을 업데이트 할 수있는 인터페이스를 추가로 제공 할 계획이 있으므로 Java 프로그램에서 이러한 규칙을 하드 코딩하고 싶지 않습니다.

  • 답변 # 1

    IMHO 가장 쉬운 방법은 Conditions 를 추가하는 것입니다   Referrer's 에 필드  표.

    CREATE TABLE Referrer 
    (
        ReferrerID  int  PRIMARY KEY,
        ....
        ....
        Conditions  nvarchar(max)
    );
    
    

    물론, 테이블에서 정보를 검색하려면 일종의 동적 저장 프로 시저 또는 함수가 필요합니다.

    CREATE PROCEDURE dbo.SelectReferrerInfo (@ReferrerId int)
    AS
        DECLARE @cmd nvarchar(MAX);
        SET @cmd = 'SELECT
                        ReferrerId,
                        ...,
                        ...,
                        ...
                    FROM
                        dbo.YourTable'
                    + CASE WHEN Conditions IS NOT NULL
                           THEN ' WHERE ' + Conditions
                           END 
                    + ' WHERE ReferrerId = ' + CAST(@ReferrerId as nvarchar(100))
        FROM
            ReferrerTable
        WHERE
            ReferrerID = @ReferrerId;
        EXEC sys.sp_executesql @cmd;
    
    

    참고: SQL Server 구문을 사용했습니다.

  • 답변 # 2

    이것은 일련의 테이블로 구현 될 수 있습니다. 각 소스 열에 대해 각 논리 연산자마다 하나의 열이 있습니다. 이것은 많은 조합으로 이어질 수 있기 때문에 당시에 필요한 열만 배포하는 것이 좋습니다. 이 디자인을 통해 나중에 새로운 열을 포함시킬 수 있습니다.

    결정 테이블 :

    Referrer
    PlanIdNotEqual
    GameIdIn              -- this is just a flag to say whether this condition applies to this referrer
    MinAgeLimitGreaterThan
    AmountGreaterThan
    ...
    further columns to meet additional conditions
    
    

    하나의 리퍼러 조건에 대해 여러 GameId 값이 있으므로 별도의 테이블을 얻습니다.

    DecisionGameIdIn
        Referrer
        GameId
    
    

    그러면 쿼리는 (의사 SQL로)

    select
      <columns>
    from Game
    inner join Decision
    on  (Decision.PlanIdNotEqual is NULL 
         or Decision.PlanIdNotEqual <> Game.PlanId)
    and (Decision.GameIdIn is NULL 
         or Game.GameId in (select GameId from DecisionGameIdIn where Referrer = <current value>))
    and (Decision.MinAgeLimitGreaterThan is NULL 
         or Game.MinAgeLimit > Decision.MinAgeLimitGreaterThan)
    and (Decision.AmountGreaterThan is NULL 
         or Game.Amount > Decision.AmountGreaterThan)
    ... continue for further conditions
    where Decision.Referrer = <the current value>
    
    

    이것은 빠르게 통제 불능 상태가 될 수 있습니다. Decision의 열을 쿼리 논리와 정렬시키는 것은 하나의 문제입니다. 조합 폭발은 또 다른 것입니다. 부울 조건이 과도하면 테이블 스캔을 초래하는 인덱싱 전략을 압도 할 수 있습니다.

  • 이전 응용 프로그램 계층과 데이터베이스 계층간에 버전이 일치하지 않는 DB 설계
  • 다음 oracle - 다음 시나리오에서 커서를 바꾸는 다른 방법이 있습니까?