Обновлять вычисленный рейтинг в SQL-сервере - PullRequest
0 голосов
/ 14 мая 2018

Здесь у меня есть требование, такое как biddin db structor, как

Id   Name       Amount    Bidding_Level
1     Apple      50         L3
2     Mac        30        L2
3     Nokia      10        L1

Здесь мое требование - всякий раз, когда пользователь вводит сумму Bidding_Level Приходит динамически, как если бы любой пользователь вводил сумму как 5 Он будетСтать L1 And all other Like as Nokia L2 Mac L3 Apple L4

1 Ответ

0 голосов
/ 14 мая 2018

Прежде всего, как предположил Дэмиен, кажется, что это значение не следует хранить, а вычислять при необходимости.Когда у вас есть вычисленные столбцы (которые не обновляются автоматически), вы просите дополнительные задачи по обслуживанию (что произойдет, если кто-то изменит название продукта, но сохранит тот же идентификатор? И когда кто-то удалит ставку?)и бессмысленная обработка (вы можете рассчитать уровень ставки и получить другую ставку, прежде чем фактически потребуется текущий уровень ставки).

При этом вы можете сбросить рейтинг ставки с помощью триггера, которыйЭто должно быть после вставок, обновлений или удалений (вы не слишком много объясняете свою бизнес-логику).

CREATE TRIGGER tr_SetBiddingLevel ON Bids AFTER INSERT, UPDATE, DELETE
AS
BEGIN

    -- If the amount was updated, a new row was added or a row was deleted
    IF UPDATE(Amount) OR (
        EXISTS (SELECT 1 FROM deleted) AND
        NOT EXISTS (SELECT 1 FROM inserted))
    BEGIN

        ;WITH NewBidLevels AS
        (
            SELECT
                B.Id,
                NewBidLevel = ROW_NUMBER() OVER (ORDER BY B.Amount ASC)
            FROM
                Bids AS B
        )
        UPDATE B SET
            Bidding_Level = 'L' + CONVERT(VARCHAR(10), N.NewBidLevel)
        FROM
            Bids AS B
            INNER JOIN NewBidLevels AS N ON B.Id = N.Id

    END

END

Обратите внимание, что тигр будет рассматривать все записи таблицы ,так как он должен обновлять все записи для каждого изменения на любую сумму (что очень плохо сказывается на производительности).Вы должны вычислять этот рейтинг каждый раз, когда он необходим.

...