хранение данных в байт-коде в RDBMS - PullRequest
0 голосов
/ 29 августа 2018

У меня есть следующий DDL

create table repeat_group(
    id int,
    start_date date.
    end_date date, 
    createby int,
    createdon timestamp not null default current_timestamp,
    updatedby int,
    updatedon timestamp,
    primary key(id)
);

Таблица представляет группу классов, которые должны повторяться в рабочие дни между start_date и end_date. Я хочу сохранить дни, в которые группа будет повторяться, в столбце этой таблицы.

Я придумал три решения:

  1. Создайте 7 столбцов для каждого дня недели и сохраните флаг с именем recurring_day. Это создаст много пустых значений.

  2. Составьте отдельную таблицу и отнесите ее как отношение один ко многим.

  3. Сохраните дни в некотором коде (например, bytecode) следующим образом: имя столбца: recussing_days char(7). Это будет хранить 7-символьную строку, такую ​​как 0000010. Этот код означает, что класс будет повторяться в каждую субботу между start_date и end_date.

Я хочу спросить, какое решение является наиболее эффективным, учитывая, что третье решение потребует вычислений. Также, если есть какое-либо другое эффективное решение.

Спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Это зависит от того, что вы подразумеваете под «эффективными» и как будут использоваться ваши данные.

Если вы стремитесь к удобочитаемости, у меня будет один столбец для каждого дня недели. Разработчик, который пытается выяснить, проводится ли курс по понедельникам, просто должен взглянуть на колонку «Понедельник»; Все запросы будут очень наглядными и простыми для понимания. Однако тот факт, что в ваших дневных столбцах будут редкие данные с низким количеством элементов, означает, что они не будут индексированными; если вы храните миллионы строк, это может стать проблемой.

Если вы стремитесь к абсолютной скорости, я бы использовал целое число для хранения дней и использовал побитовую арифметику; большинство движков СУБД действительно хороши в этом, и целочисленное поле может быть более «дружественным к индексу», потому что у вас, вероятно, будет приличный разброс значений. Однако запросы менее разборчивы, и вы можете получить глупые ошибки (начинается ли неделя в воскресенье или в понедельник?).

Это очень быстро, потому что каждая комбинация дат соответствует разному уникальному целому числу, которое, в свою очередь, позволяет эффективно индексировать столбец. Первоначальный расчет (превращение «понедельник и вторник, а не среда и (четверг или пятница) в целое число») происходит только один раз и выполняется очень быстро. Однако сравнение этого целого числа с миллионами записей в вашей таблице "классов" (я получил "миллионы" из вашего комментария, но это кажется очень большим числом ...) - это трудоемкий бит.

Я, конечно, не буду хранить ваш битовый флаг в строке - таким образом вы потеряете преимущество встроенной битовой логики.

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

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