- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
CREATE TABLE calendar
(
caldate date NOT NULL,
"month" integer NOT NULL,
month_txt character varying(10) NOT NULL,
"year" integer NOT NULL,
CONSTRAINT calendar_pkey PRIMARY KEY (caldate)
)
CREATE TABLE holiday
(
id numeric(10,0) NOT NULL DEFAULT nextval('holiday_seq'::regclass),
caldate date NOT NULL,
region integer,
CONSTRAINT holidaypk PRIMARY KEY (id),
CONSTRAINT fk_hday_caldate FOREIGN KEY (caldate)
REFERENCES calendar (caldate) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT holidayfk FOREIGN KEY (region)
REFERENCES region (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
Вот такая вот структура база в проекте в котором я работаю.
Причём помимо таблицы calendar и дублирование там информации, обратите внимание на таблицу holiday в эту таблицу записи ручками вносятся о выходных днях или о праздниках, как впрочем и в таблицу calendar
Ну выходные можно рассчитать а с праздниками что не так ?
Всё говно. И даже небо. И даже алах.
Глупо при разработке программ не предусматривать возможность подобных событий.
Если праздники для одного региона, то просто добавляем флаг IsHoliday. До 3-х регионов, можно еще использовать дополнительные флаги (пр. IsHolidayRu, IsHolidayUa, IsHolidayBy). Больше трех регионов, конечно уже лучше создавать отдельную табличку. Но, во всех 3-х случаях праздники обычно проставляются на весь период времени, до 9999 года и если какой-то закон изменяет нормальный ход событий, то изменяется дата праздника. Зачем вручную постоянно заносить?
Так… Дата является ключом для — внимание — даты! О, конечно! Ведь для чего использовать дату в ключе, как не для даты в значении?
В таблице храним номер месяца даты, название месяца даты и номер года… Тут всё ясно… Триста шестьдесят пять дат — триста шестьдесят пять две тысячи одиннадцатых годов. Ну, а как же? Это ж база данных — так пусть хранит одинаковых данных побольше!
А это что за просчёт? Почему в таблице дат не хранится номер дня в месяце, номер дня в неделе, название дня недели, номер дня в году, номер недели в году, признак високосности года и фамилия проектировщика базы данных для каждой даты?
…
smpl, сочувствую и желаю мужества в работе с проектом. Теперь понимаю, что моя печаль по поводу некоторых достававшихся мне проектов это ничто по сравнению с этой ношей.