Подходящий способ хранения такой информации - PullRequest
1 голос
/ 09 февраля 2012

Я должен сохранить следующую информацию в базе данных, которая будет использоваться сборкой .NET. Они представляют времена, когда определенный цвет активен:

КРАСНЫЙ: с 16:30 до 18:30 с понедельника по пятницу, включая праздничные дни
ЯНТАРЬ: 09:00 - 16:30 и 18:30 - 20:30 с понедельника по пятницу, включая праздничные дни и 16:30 - 18:30 Сб и Вс
ЗЕЛЕНЫЙ: 00:00 - 09:00 и 20:30 - 24:00 с понедельника по пятницу, включая праздничные дни и 00:00 - 16:30 * 18:30 - 24:00 Сб и вс

Я изначально выбрал схему базы данных примерно так:

Имя столбца ID Pk Null? Тип данных Шифрование гистограммы по умолчанию Альг Соль

RED_WEEKDAY_START 14 Y NUMBER Нет
RED_WEEKDAY_END 15 Y NUMBER Нет
RED_WEEKEND_START 16 Y NUMBER Нет
RED_WEEKEND_END 17 Y NUMBER Нет
AMBER_WEEKDAY_START 18 Д НОМЕР Нет
AMBER_WEEKDAY_END 19 Y NUMBER Нет
AMBER_WEEKEND_START 20 Y NUMBER Нет
AMBER_WEEKEND_END 21 Y NUMBER Нет
GREEN_WEEKDAY_START 22 Y NUMBER Нет
GREEN_WEEKDAY_END 23 Y NUMBER Нет
GREEN_WEEKEND_START 24 Y NUMBER Нет
GREEN_WEEKEND_END 25 Y NUMBER Нет

Однако есть пара проблем с этим:

  • Не работает с выходными (вообще)
  • Допускается только один период времени для каждого цвета (например, зеленый делится в будние дни)

Итак, как лучше хранить данные такого типа?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Пять столбцов

Colour | Day | StartTime | EndTime | AppliesOnBankHolidays

(КРАСНЫЙ: 16:30 - 18:30 с понедельника по пятницу, включая праздничные дни) переводится как

RED|Mon|16:00|18:30|True
RED|Tue|16:00|18:30|True
RED|Wed|16:00|18:30|True
RED|Thu|16:00|18:30|True
RED|Fri|16:00|18:30|True

AMBER: 09:00 - 16:30 и 18:30 - 20:30 с понедельника по пятницу, включая праздничные дни, и 16:30 - 18:30 сб. И вс. Переводится как

AMBER|Mon|09:00|16:30|True
AMBER|Tue|09:00|16:30|True
AMBER|Wed|09:00|16:30|True
AMBER|Thu|09:00|16:30|True
AMBER|Fri|09:00|16:30|True
AMBER|Mon|18:30|20:30|True
AMBER|Tue|18:30|20:30|True
AMBER|Wed|18:30|20:30|True
AMBER|Thu|18:30|20:30|True
AMBER|Fri|18:30|20:30|True
AMBER|Sat|16:30|18:30|False
AMBER|Sun|16:30|18:30|False

И я оставлю третью строку в качестве упражнения!

Не стесняйтесь нормализовать даты и цвета, если вы действительно хотите сэкономить место.Для вопроса о банковских выходных требуется еще одна таблица выходных, к которой вы можете присоединиться в любом используемом запросе:

PSEUDO SQL

SELECT t.Colour, t.StartTime, t.EndTime
FROM Times t 
WHERE Day(Today)==t.Day AND NOT (t.AppliesOnBankHolidays==FALSE AND IsBankHoliday(Today)) 
0 голосов
/ 09 февраля 2012

Я бы немного нормализовал это.Сначала у меня будет таблица, идентифицирующая «цвета»:

fldColorID          | int
fldColorName        | varchar(28)
fldColorDescription | varchar(128)   (might not be necessary)

Затем добавьте таблицу с указанием времени начала / окончания, которое применимо:

fldSpanID               | int
fldStartTime            | datetime
fldEndTime              | endtime
fldIsHoliday            | bit
fldSpanDescription      | varchar(128)   (necessary from a human readability point)
fldColorID              | int  (FK)

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

0 голосов
/ 09 февраля 2012

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

...