Фильтрация на основе необязательных данных - PullRequest
0 голосов
/ 30 января 2019

У меня есть система обмена сообщениями с тремя таблицами: Event_Types, Messages и Event_Subscription.Все сообщения имеют тип события, и каждый тип события может иметь 0 или более подписок.В таблице подписки на события есть набор столбцов, которые можно использовать для дальнейшей фильтрации входящих сообщений. Поэтому, если я установил для Src ненулевое значение в Event_Subscription, я говорю, что я хочу только сообщения с этими типами событий из этогоконкретный источник.

В настоящее время наш запрос является записывающим, так что для каждого столбца мы проверяем, является ли он пустым, а если нет, то фильтруем сообщение по этому столбцу.Я вполне уверен, что это не будет работать хорошо, тем более что в нашей действующей версии prod будет 11 различных столбцов для фильтрации.

Мой вопрос: есть ли более эффективный способ фильтрации таблицы сообщений?по таблице подписки на событие?


пример

IF OBJECT_ID('tempdb..#event_types') IS NOT NULL
    DROP TABLE #event_types

IF OBJECT_ID('tempdb..#messages') IS NOT NULL
    DROP TABLE #messages

IF OBJECT_ID('tempdb..#event_subscription') IS NOT NULL
    DROP TABLE #event_subscription


CREATE TABLE #event_types
(
    PK_EventTypeID INT IDENTITY(1, 1) PRIMARY KEY,
    EventTypeName VARCHAR(50)
)



CREATE TABLE #messages
(
    PK_MessageID INT IDENTITY(1, 1) PRIMARY KEY,
    FK_EventTypeID INT NOT NULL,
    Src VARCHAR(50),
    [Version] VARCHAR(50)
)


CREATE TABLE #event_subscription
(
    PK_EventSubscriptionID INT IDENTITY(1, 1) PRIMARY KEY,
    FK_EventTypeID INT NOT NULL,
    SubScriberID INT NOT null,
    Src VARCHAR(50) null,
    [Version] VARCHAR(50) null
)


INSERT INTO #event_types ( EventTypeName )
VALUES ('Insert'), ('Update'), ('Delete')


INSERT INTO #event_subscription
(
    FK_EventTypeID,
    SubScriberID,
    Src,
    [Version]
)
VALUES
( 1, 1000, null, null ), /* all inserts */
( 2, 1001, 'System A', '1.0.0' ) /*All updates from System A with version 1.0.0*/



INSERT INTO #messages ( FK_EventTypeID, Src, Version )
VALUES
( 1, 'System A', '1.0.0' ),
( 1, 'System B', '2.0.0' ),
( 2, 'System A', '1.0.0' ),
( 2, 'System B', '2.0.0' )


SELECT *
FROM #messages m
    INNER JOIN #event_types et
        ON m.FK_EventTypeID = et.PK_EventTypeID
    INNER JOIN #event_subscription es
        ON m.FK_EventTypeID = es.FK_EventTypeID
WHERE (es.Src IS NULL OR m.Src = es.Src)
    AND (es.[Version] IS NULL OR m.[Version] = es.[Version])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...