2012-02-07 2 views
1

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

В моей текущей модели хранятся дополнительные поля данных в каждой записи развертывания.

В 90% случаев эти данные не будут меняться во время развертывания, но будут случаи, когда это произойдет. На данный момент я просто заканчиваю текущее развертывание и создаю новый, обновляя соответствующие данные.

Staff Table 
----------------------------- 
| ID | First Name | Surname | 
----------------------------- 
| 1 | Bob  | Brown | 
----------------------------- 
Deployments Table 
------------------------------------------------------------ 
| Sta | End | Staff_ID | Reg Pay | Temp Pay | Other Fields | 
------------------------------------------------------------ 
| Jan | Mar | 1  | 3  | 3  | Other data | 
| Jul | Sep | 1  | 3  | 5  | Other data | 
| Sep | Dec | 1  | 5  | 5  | Other data | 
------------------------------------------------------------ 

Пример: Уровень оплаты Боба равен 3. Сначала он был развернут в январе 2011 года на регулярном уровне оплаты. Его развертывание заканчивается в марте 2011 года (и поэтому перестает показывать в реестре с этой даты).

В июле он повторно развернут, но на этот раз более высокий уровень оплаты, чем его обычный уровень.
В сентябре его регулярное положение продвигается так, чтобы соответствовать его уровню оплаты развертывания (т. Е. Когда его развертывание закончится, он продолжит уровень 5).

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

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

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

Мой вопрос: Я стреляю себе в ногу?

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

ответ

0

Я обнаружил хороший трюк, который вы можете играть на своих временных таблицах: добавьте специальный столбец, который я вызываю преемственность ID из-за отсутствия лучшего термина. Этот столбец равен первичному ключу записи, который открывает группу связанных записей, представляющих один и тот же элемент или действие, которое вы моделируете, - в вашем случае - развертывание. Скажем, основные ключи трех строк в вашем примере 1, 2 и 3. Тогда идентификатор непрерывности первой записи будет 1; идентификаторы непрерывности двух других записей будут равны 2, так как они представляют одно и то же развертывание, а первая запись, относящаяся к развертыванию, который они представляют, имеет первичный ключ 2.

С колонкой идентификаторов непрерывности, вы может помещать дополнительные поля в вашу временную таблицу и иметь возможность легко ответить на вопросы о том, что произошло с вашим развертыванием: учитывая идентификатор одной из записей в группе (скажем, самый последний), вы можете легко запросить начало и даты окончания, для истории предмета с течением времени, для состояния предмета в определенное время и т. д.

+0

Спасибо за подсказку. Я думаю, что это может облегчить жизнь. – Alex

Смежные вопросы