|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
Всем привет. У меня есть сомнения по поводу моей проектировки БД, поэтому решил посоветоваться. Есть 2 таблицы: 1. Workers - содержит инфо о все работниках фирмы (kod,fio,stavka,address,phone). 2. salary - содержит инфо про начисление зарплаты (kod,fio_kod,month,year,d1,d2,d3,d4,d5,...,d31,All,money). (Несущественные поля я опущу, что бы не загружать лишним). d(i) - это кол-во часов, которые работник отработал i-того числа в месяце month и году year. all - суммарное кол-во часов. money - деньги, которые работник заработал. Надеюсь, что все понятно. Проблема заключается в том, как правильно хранить статистику. Сейчас она хранится в этойже самой таблице Salary вместе с данными текущего месяца, просто month и year у нее другие. 1. Что будет, если, допустим, работника AAA уволят из штата? Соответственно потеряется все инфо о том, как он работал( Записи в Salary останутся, но для кого они велись определить будем невозможно). 2. Что будет, если пользователь захочет в 5 месяце перерасчитать зарплату за 4 месяц?? (Допустим вышли непонятки с кол-вом отработанных часов, работник недоводен и, например, 3.05 заново производят перерасчет за 4 месяц). В общем, кому есть что сказать - поделитесь опытом. Буду рад любым коииентариям. Если что-то непонятно - уточню. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2003, 22:19 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
Замечания после беглого просмотра: 1. Поле Salary.All избіточно и может нарушать логическую целостность - т.е. Сумма всех d может оказаться не равной All. 2. Под полем Workers.stavka в дальнейшем надо понимать "Текущая ставка" и завести поле Salary.stavka, под которым будем понимать "Ставка, которая была у этого работника в таком-то месяце такого-то года". После чего поле Salary.money тоже становиться избыточным. 3. Создать внешний ключ для запрета удаления записей из Workers, если есть связанные с ними записи в Salary ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2003, 22:38 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
1. Поле Salary.All избіточно и может нарушать логическую целостность - т.е. Сумма всех d может оказаться не равной All. Поле Salary.All как раз и рассчитывается, как сумма все d(i). 2. Под полем Workers.stavka в дальнейшем надо понимать "Текущая ставка" и завести поле Salary.stavka, под которым будем понимать "Ставка, которая была у этого работника в таком-то месяце такого-то года". После чего поле Salary.money тоже становиться избыточным. На счет Salary.money - значение этого поля отлично от Workers.stavka: Workers.Stavka - номинальный оклад Salary.money - сколько работник реально получил вза месяц. А на счет Salary.stavka - это может быть дельным. 3. Создать внешний ключ для запрета удаления записей из Workers, если есть связанные с ними записи в Salary ДА это так, но работник уволен, поэтому он не должен отображаться в Workers. А получается, что если работнику хотя бы раз начисляли ЗП, то удалить его нельзя. А это неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2003, 01:11 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
1. Для поддержки актуальности поля Salary.All придется написать триггер, который будет его модифицировать при update любого поля Salary.d*. А если его нет, то соответствуещее актуальное значение легко получается простым суммированием Salary.d*. 2. Ставка может быть различной в разные месяцы. Поэтому в Workers можно хранить текущую, а в Salary - соотвествующую месяцу. Тогда мы всегда можем вычислить актуальную для конкретного месяца зарплату на основании ставки хрянящейся в Salary и суммы отработанного времени. 3. Завести флаг "Уволен" в таблице Workers и не показывать эти записи если не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2003, 02:01 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
2 lasta: \r ДА это так, но работник уволен, поэтому он не должен отображаться в Workers.\r А получается, что если работнику хотя бы раз начисляли ЗП, то удалить его нельзя. А это неправильно.\r --\r 3. Завести флаг "Уволен" в таблице Workers и не показывать эти записи если не надо. \r \r Я также согласен с "Youry" и только могу добавить, что удалять сотрудника из БД - это несколько неправильно с точки зрения бизнеса, т.к есть пара причин по к-рым информацию об уволенном сотруднике лучше хранить какое-то время в БД компании. Помимо флага возможен еще вариант - основные данные (таблица Workers ) уволенных сотрудников переносятся в другую таблицу, например, Fired_Workers , а остальные данные связанные с ними типа з/п (таблица salary ) удаляются. Но это опять же если никогда не возникнет ситуации, когда потребуется информация о том, сколько платили зарплаты уволенному сотруднику ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 09:47 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
2lasta Какая то структура у тебя получается.... учебная, что ли. Две таблицы - и зарплата считается. Ставка может меняться и не с 1го числа. Человек может быть в командировке или на больничном. Сверхурочные по другому тарифу. Наличие персональных надбавок, премий и т.д. и т.п. Зарплата она вообще штука специфичная, ибо зависит от многих факторов. Налоговое законодательство например, или "творческий поиск" руководства. Или у тебя задача такая упрощенная, или схема должна быть гораздо сложнее. ВСЕ ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2003, 10:43 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
Схема рассчета действительно сильно упрощенная. Мне интересно, следует ли все данные хранить в одной таблице, или данные, которые уже не актуальны (зарплата за прошлый год), следует переносить в отдельную таблицу. Я, можно сказать новичок, и хотел поинтересоваться про уже готовые методы, применяемые в аналогичных ситуациях. Хочется сразу писать хорошо! lasta ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 00:21 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
2lasta Мне интересно, следует ли все данные хранить в одной таблице, или данные, которые уже не актуальны (зарплата за прошлый год), следует переносить в отдельную таблицу. ИМХО, у каждого метода есть свои плюсы и минусы. Лишь бы работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:20 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
Ок, все спасибо, буду разбираться ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 17:01 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
а у меня болезненная реакция на автор писал:d1,d2,d3,d4,d5,...,d31 как по мне это пережиток Fox, по крайней мере мне достались базы с похожей структурой. лучше уже сделать отдельную таблицу с полями (работник, год, месяц, день, кол_отраб_часов) и избыточности не будет.. и работать легче с этим. Репликант писал:есть пара причин по к-рым информацию об уволенном сотруднике лучше хранить какое-то время в БД компании может и не пара.. и достаточно долгое время. Н-р: самое минимальное - 1 год для персонификации, а максимум... если не ошибаюсь данные зарплаты должны храниться что-то около 40 лет?? (поправте меня.. ) по крайней мере у меня сейчас ситуация когда люди приходят за справками по зарплате за 1996 год. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 18:29 |
|
Как правильно хранить статистику???
|
|||
---|---|---|---|
#18+
2Наутилус Я на Fox программировал ровно 1 семестр у универе и то только потому, что препод был (и есть. и будет) полным профаном по базам и ничего кроме Fox видеть не хотел. Просто D1,d2,....,d31 - это был лучший способ для меня хранить инфо об отработке по дням. Lasta ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 00:33 |
|
|
start [/forum/topic.php?fid=32&fpage=176&tid=1546786]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
280ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 231ms |
total: | 594ms |
0 / 0 |