Каков рекомендуемый способ хранения нескольких значений OrderBy в базе данных? - PullRequest
0 голосов
/ 17 января 2019

У меня есть список предметов с подсписком предметов с подсписком предметов (всего 3 уровня).

Основной уровень сортируется с помощью jQueryUI (за рамками этого вопроса, поэтому эта функциональность не показана). Основной уровень не сортируется, но УРОВЕНЬ x.x можно перемещать вверх и вниз вдоль axis-y, а затем можно выполнить отдельную сортировку на уровне x.x.x. axis-y находится на месте, чтобы предотвратить возможность падения УРОВНЯ 1 на УРОВЕНЬ 2.1.3 (если это произойдет, мы будем как Чак Норрис и сможем делить на ноль, но я отвлекся).

Мой вопрос заключается в том, что является наилучшей практикой: иметь каждый уровень со своим собственным столбцом sort by в базе данных или использовать один столбец для всего, что нужно отсортировать?

Мария 10.х в игре.

UPDATE Для контекста это будет список мероприятий. Вы нажимаете на стрелку, и список откроет меню, поэтому первичным ключом будет идентификатор активности.

UPDATE Я предоставляю запрос, с которым я работаю с самого начала. Я пока не получил указаний, но надеюсь, что этот запрос может помочь.

SELECT DISTINCT
  a c.coreID,
  c.coreLabel,
  a.phaseOrderBy,
  a.weekOrderby,
  a.dayOrderBy,
  c.groupID,
  a.woAID,
  a.phaseID,
  (CASE
    WHEN p.phaseID is null
    THEN CONCAT('NONE')
    ELSE p.phaseLabel
    END) as phaseLabel,
  a.weekID,
  a.dayID,
  (CASE
    WHEN w.weekLabel is null
    THEN CONCAT('NONE')
    ELSE W.weekLabel
    END) as weekLabel,
  c.uc,
  c.um
FROM
  activity a
  LEFT JOIN phase p ON p.phaseID = a.phaseID
  LEFT JOIN core c ON c.coreID = a.coreID
  LEFT JOIN week w ON w.weekid = a.weekID
WHERE
  c.orgID = :orgID AND
  c.userID = :userID
ORDER BY
  c.coreLabel
  , a.phaseOrderBy
  -- , a.phaseID
  , a.weekOrderBy
  -- , a.weekID
  , a.dayOrderBy
  -- , a.dayID

У меня также есть другая скрипка, которая может помочь проиллюстрировать функциональность, которую я пытаюсь выполнить: jsFiddle с реализованной сортировкой

Вот dbFiddle

UPDATE Вот пример того, как должны выглядеть данные при выполнении запроса. Это позволит мне правильно перебрать данные, чтобы получить нужный мне вывод. Я также включаю ссылку на Google Doc (только для чтения) здесь .

На рисунке ниже (1 розовый цвет) и (2 желтый цвет) - известные выборки данных, а столбцы (3), (4) и (5) - требуемый порядок по порядку.

screen shot of sample data set

ДРУГОЕ ОБНОВЛЕНИЕ Создание этого скриншота было отличным упражнением и действительно заставило меня задуматься о данных (спасибо, Рик!).

Данные в woaid - это просто PK, и я должен был их рандомизировать - я просто не думал об этом, поэтому я извиняюсь за путаницу, которую это могло вызвать.

Сценарий: допустим, пользователь перетаскивает элемент дня, соответствующий woaid = 19, из coreid = 444 в coreid = 232 / phaseID = 19 / weekID = 1 и хочет, чтобы этот элемент был последним, отображаемым под неделей нового местоположения (это был единственный элемент в его старом месте, так что обычно это просто «1»). Его идентификатор dayOrderBy будет изменен с 1 на 4 (это coreID, phaseID, weekID также будет соответственно обновлен). При следующем посещении страницы должен отображаться правильный порядок сортировки И местоположение, означающее, что день, соответствующий woaid = 19, теперь должен отображаться как 4-й элемент в coreid = 232 / phaseID = 19 / weekID = 1 / dayID = 7 (dayID не делает ' изменить, только orderByDayID изменится).

1 Ответ

0 голосов
/ 18 января 2019

Если вопрос о ORDER BY, я вижу 2 подхода:

План A: Построить запрос (особенно часть ORDER BY) динамически, затем выполнить его. Это позволяет вам использовать любой столбец, который нужен пользователю.

План B: иметь выражение CASE или IF() для вычисления одного значения для упорядочения. Пример:

ORDER BY 
    CASE WHEN ... THEN phaseOrderBy
         WHEN ... THEN weekOrderBy
         ...
    END

Или ...

ORDER BY
    IF(..., phaseOrderBy, IF(..., weekOrderBy, ... ))

На основе предоставленного изображения любой из них даст желаемый порядок:

ORDER BY coreID, phaseOrderBy, weekOrderBy

или просто

ORDER BY woAID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...