Создавая для более быстрого, ГДЕ запросы на стол UNION? - PullRequest
0 голосов
/ 10 января 2019

Я делаю запрос, данные которого используются для построения навигатора дерева в нашем приложении (на самом деле я переделываю старый медленный сложный запрос в нашей базе кода). В иерархии есть 5 шагов: Клиент -> Местоположение -> Область -> Активы -> Площадь, и в каждой из этих таблиц есть столбец «активный», который будет использоваться для целей фильтрации.

Итак, вот мой вопрос - какой путь лучше выбрать с активными столбцами для фильтра?

Прямо сейчас я возвращаюсь к столу вот так

path         text        type        active
''           customer1   customer    1
customer1    location1   location    1
customer1    location2   location    0

Так, что если пользователь не хочет видеть неактивные местоположения, я бы отфильтровал с WHERE type='location' AND active!=0. Тем не менее, я подумал, что, возможно, было бы лучше создать активный столбец для каждого отдельного уровня и просто поставить 1 для строк, которые не являются определенным типом, например,

path         text        customerActive    locationActive   areaActive
''           customer1        1                  1               1
customer1    location1        1                  1               1
customer1    location2        1                  0               1

так что тогда, если бы я хотел только активные местоположения, я бы сделал WHERE locationActive = 1.

Один из этих методов быстрее или лучше, чем другой? Есть ли консенсус по таким ситуациям?

Вот текущий код SQL, генерирующий таблицу первого типа

(SELECT 
    '' AS `path`,
        `listcustomers`.`name` AS `text`,
        'customer' AS `type`,
        `listcustomers`.`idx` AS `id`,
        `listcustomers`.`active` AS `active`,
        IF(`listcustomers`.`active`, 'tree/CustomerActive.png', 
'tree/CustomerInactive.png') AS `icon`
FROM
    `listcustomers`) UNION (SELECT 
    `listcustomers`.`name` AS `path`,
        `listlocations`.`name` AS `text`,
        'location' AS `type`,
        `listcustomers`.`idx` AS `id`,
        `listcustomers`.`active` AS `active`,
        IF(`listlocations`.`active`, 'tree/LocationActive.png', 
'tree/LocationInactive.png') AS `icon`
FROM
    `listlocations`
JOIN `listcustomers` ON `listcustomers`.`idx` = 
`listlocations`.`parentCustomerId`) UNION (SELECT 
    CONCAT_WS('/', `listcustomers`.`name`, `listlocations`.`name`),
        `listareas`.`name` AS `text`,
        'areas' AS `type`,
        `listareas`.`idx` AS `id`,
        `listareas`.`active` AS `active`,
        IF(`listareas`.`active`, 'tree/AreaActive.png', 
'tree/AreaInactive.png') AS `icon`
FROM
    `listareas`
JOIN `listlocations` ON `listlocations`.`idx` = 
`listareas`.`parentLocationId`
JOIN `listcustomers` ON `listcustomers`.`idx` = 
`listlocations`.`parentCustomerId`) UNION (SELECT 
    CONCAT_WS('/', `listcustomers`.`name`, `listlocations`.`name`, 
`listareas`.`name`) AS `path`,
        `listassets`.`name` AS `text`,
        'assets' AS `type`,
        `listassets`.`idx` AS `id`,
        `listassets`.`active` AS `active`,
        IF(`listassets`.`active`, 'tree/assetActive.png', 
'tree/assetInactive.png') AS `icon`
FROM
    `listassets`
JOIN `listareas` ON `listareas`.`idx` = `listassets`.`parentAreaId`
JOIN `listlocations` ON `listlocations`.`idx` = 
`listareas`.`parentLocationId`
JOIN `listcustomers` ON `listcustomers`.`idx` = 
`listlocations`.`parentCustomerId`) UNION (SELECT 
    CONCAT_WS('/', `listcustomers`.`name`, `listlocations`.`name`, 
`listareas`.`name`, `listassets`.`name`) AS `path`,
        `listprojects`.`name` AS `text`,
        'projects' AS `type`,
        `listprojects`.`idx` AS `id`,
        `listprojects`.`active` AS `active`,
        NULL AS `icon`
FROM
    `listprojects`
JOIN `listassets` ON `listassets`.`idx` = `listprojects`.`parentAssetId`
JOIN `listareas` ON `listareas`.`idx` = `listassets`.`parentAreaId`
JOIN `listlocations` ON `listlocations`.`idx` = 
`listareas`.`parentLocationId`
JOIN `listcustomers` ON `listcustomers`.`idx` = 
`listlocations`.`parentCustomerId`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...