0

Version1 : 「FEE」テーブルがあります

FEE
-Id
-VariableAmount
-FixedAmount
-CurrencyCode

出金やシステム外からユーザーの銀行口座への出金などを行うと、1回の取引ごとに変動額+定額の手数料が発生します。

Version2 : 一定の料金ルールで指定した条件を満たした場合に課金したい、例

Charge $0 when < $200 

Charge $3 when >= $200

Charge $x when >= $Y

Web アプリでハードコードすることもできますが、後で変更できるようにしたいのですが、これらの条件をデータベースに保存するときにどのように設計しますか?

料金 1.* FEE_RULE?? データベースには何を保存しますか?

4

5 に答える 5

2

このビジネス ロジックは、引き出しの実行を担当するストアド プロシージャにいつでも配置できます。そうすれば、ロジックを変更したいときに、Web アプリを再デプロイする必要はありません。

于 2013-01-13T02:27:11.110 に答える
2

あなたが説明しているのはルールエンジンです。SQL Server には組み込みはありませんが、MSDN に独自の構築方法を説明した記事があります。1 つのルールだけでは少し過剰に設計されているように思われますが、アプリケーションには他のルールも含まれている可能性があります。 詳細をご覧ください。

于 2013-01-12T22:22:59.457 に答える
0
SET ANSI_WARNINGS ON;
GO

--DROP TABLE dbo.FeeInterval
CREATE TABLE dbo.FeeInterval (
    FeeIntervalID INT IDENTITY(1,1),    
        CONSTRAINT PK_FeeInterval PRIMARY KEY (FeeIntervalID),

    StartValue NUMERIC(18,2) NOT NULL,
        CONSTRAINT CK_FeeInterval_StartValue CHECK (StartValue > 0),
    -- If EndValue IS NOT NULL Then the interval is TxValue BETWEEN [StartValue, EndValue]
    -- Else (EndValue IS NULL) Then the interval is TxValue >= StartValue
    -- Also, you should check is this intervals are continuous (using a trigger)
    -- and only the last EndValue IS NULL
    EndValue NUMERIC(18,2) NULL, -- Allow null,
        CONSTRAINT CK_FeeInterval_StartDate_EndDate CHECK (StartValue < EndValue),
    VariableAmount NUMERIC(18,2) NOT NULL, 
    FixedAmount NUMERIC(18,2) NOT NULL
);
-- + CREATE INDEX ...
GO

--DROP TABLE dbo.[Transaction] 
CREATE TABLE dbo.[Transaction] (
    TransactionID INT IDENTITY(1,1),
        CONSTRAINT PK_Transaction PRIMARY KEY (TransactionID),
    TransactionDate DATE NOT NULL
        CONSTRAINT DF_Transaction_TransactionDate DEFAULT GETDATE(),
    -- You should check (using a trigger) if there is an applicable fee for this TxnValue 
    --      If the last EndValue IS NOT NULL Then TxnValue BETWEEN MIN(StartDate) AND MAX(EndValue) 
    --      Else (the last Endvalue IS NULL Then TxnValue >= MIN(StartDate)
    TxnValue NUMERIC(18,2) NOT NULL
    -- Also, you should store the FeeIntervalID used for every transaction
    -- FeeIntervalID INT NOT NULL 
    -- and (maybe) VariableAmount/FixedAmount/TxnPlusCosts NUMERIC(18,2) NOT NULL
)
GO

INSERT dbo.FeeInterval (StartValue, EndValue, VariableAmount, FixedAmount)
SELECT 0.01, 200,       0.8,    0.1    UNION ALL -- 0.01 because data type is NUMERIC(,2)
SELECT 201,  300,       0.65,   0.1    UNION ALL
SELECT 301,  NULL,      0.4,    0.1;
GO

INSERT dbo.[Transaction] (TxnValue)
SELECT 0.01 UNION ALL
SELECT 50 UNION ALL
SELECT 200 UNION ALL
SELECT 250 UNION ALL
SELECT 350 UNION ALL
SELECT -0.01; -- Wrong value
GO

--DROP FUNCTION dbo.GetApplicableFee
CREATE FUNCTION dbo.GetApplicableFee(@TxnValue NUMERIC(18,2))
RETURNS TABLE
AS
RETURN
SELECT  s.FeeIntervalID, s.VariableAmount, s.FixedAmount, @TxnValue + s.VariableAmount + s.FixedAmount AS TxnPlusCosts
FROM (
    SELECT  i.FeeIntervalID, i.VariableAmount, i.FixedAmount,
            i.StartValue, i.EndValue,
            ROW_NUMBER() OVER(ORDER BY i.StartValue DESC) RowNum
    FROM    dbo.FeeInterval i
) s
WHERE   @TxnValue BETWEEN s.StartValue AND s.EndValue AND s.RowNum > 1
OR      @TxnValue >= s.StartValue AND s.RowNum = 1
GO

SELECT  *,
        CASE WHEN f.FeeIntervalID IS NOT NULL THEN 'TxnValue with applicable fee' ELSE 'Wrong TxnValue' END AS [Description]
FROM    dbo.[Transaction] txn
OUTER APPLY dbo.GetApplicableFee(txn.TxnValue) f
-- or
SELECT  *, 
        (SELECT f.TxnPlusCosts FROM dbo.GetApplicableFee(txn.TxnValue) f) AS TxnPlusCosts
FROM    dbo.[Transaction] txn

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-01-13T11:48:51.127 に答える
0

Oracleフィルター式を使用して、アプリケーションを変更せずにデータベースを介して提案したものを実装できると思います...このチュートリアルは、この目的に役立ちます http://docs.oracle.com/cd/B12037_01/server.101/b10821/式概念.htm

于 2014-03-06T07:12:31.437 に答える
0

私のアプローチは、最も単純な形で、以下のようなものになります。

USE tempdb
GO
IF OBJECT_ID('tempdb.dbo.Transactions') IS NOT NULL DROP TABLE Transactions

SELECT TOP 500 TxnVal = ABS(CHECKSUM(NEWID())) % 1000
INTO Transactions
FROM sys.columns

;WITH Fee (Id, VariableAmountFloor, VariableAmountCeiling, VariableAmount, FixedAmount, CurrencyCode) AS
(
    SELECT 1, 0,    200,        0.8,    0.1, 'x'    UNION ALL
    SELECT 2, 201,  300,        0.65,   0.1, 'x'    UNION ALL
    --  NB: have chosen 2147483647 as the ceiling because it is the maximum value of the INT type
    --  You will probably have some sort of float
    SELECT 3, 301,  2147483647, 0.4,    0.1, 'x'
)
SELECT   T.TxnVal
        ,VariableFee    = F.VariableAmount
        ,FixedFee       = F.FixedAmount
        ,TxnPlusCosts   = T.TxnVal + F.VariableAmount + F.FixedAmount
FROM Transactions   T
JOIN Fee            F ON T.TxnVal BETWEEN F.VariableAmountFloor AND F.VariableAmountCeiling
于 2013-01-13T05:53:54.637 に答える