Дизайн базы данных; Как хранить недели эффективно? - PullRequest
1 голос
/ 18 декабря 2011

Мне нужно создать таблицу для хранения количества часов, которое человек будет работать каждую неделю над каждой задачей. Таблица будет выглядеть так:

[TaskID] [User] [Week 1] [Week 2] ....... [Week 52]  [Year] 

Итак, мой вопрос, не столкнусь ли я с проблемой производительности при таком дизайне базы данных? Я всегда могу найти правильную ссылку, какая это неделя. например, неделя 2 = 3 января 2011 г. - 9 января 2011 г.

А как лучше всего справиться с високосным годом? как 26 декабря 2011 года - 1 января 2012 года. Думаю, я могу считать это все еще последней неделей 2011 года.

Любые советы / предложения будут с благодарностью.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 18 декабря 2011

Это очень денормализованные данные, и не рекомендуется. Данные предназначены для роста вниз , а не из . Примерно так было бы желательно:

create table YourWeeks
(
    TaskID int identity(1, 1) not null,
    User varchar(100) not null,
    Week varchar(100) not null,
    WeekEnum int not null,
    Year int not null,
    constraint ck_weeknum check (WeekEnum between 1 and 52)
)
go

А чтобы справиться с високосными годами, вам может понадобиться ссылка на внешний ключ, например:

create table Years
(
    Year int not null,
    IsLeapYear bit not null
)
go

alter table YourWeeks
add constraint fk_weeks foreign key (Year) references Years (Year)
go
2 голосов
/ 18 декабря 2011

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

Вам бы лучше иметь такую ​​структуру:

TaskID
User
WeekNumber
Year
Hours

Что касается вашего другого вопроса ... «високосный год» не имеет ничего общего с указанными вами датами. Но мы не можем обязательно ответить, как справиться с этим; это скорее бизнес-правило - что бизнес считает началом первой недели?

2 голосов
/ 18 декабря 2011

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

ПОЛЬЗОВАТЕЛИ

[id] [name]

ЗАДАЧ

[id] [description]

ЧАСЫ

[id] [task_id] [user_id] [year] [week_no] [hours]
1 голос
/ 19 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...