|
|
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Создаю БД, в которой содержится таблица для учета рабочего времени - сколько дней отработал тот или иной сотрудник в конкретный месяц. В таблице "Учет рабочего времени" создаю поля: "ID-сотрудника", "ФИО", "Месяц", "Год", "Список отработанного количества часов". Первые четыре поля понятно что будут хранить и как, а пятое поле предполагаю заполнять примерно следующим образом: "8,8,8,8,8,В,В,А,6,6,8,8,В,В,8,8,...", где числа - это количество отработанного времени в определенный день, "В" - обозначение выходных дней, "А" - административный отпуск(порядковый номер каждого элемента в строке представляет собой день месяца). Но такую методику хранения данных, мягко говоря, можно назвать только "очень странной", т.к. если при работе через сам SQL Server по случайной или преднамеренной ошибке пользователь для января вместо 31 значения введет 41, то все рухнет. Плюс к этому, данный принцип нарушает некоторое количество правил проектирования БД, что не есть хорошо. Немного подумал и решил поискать в SQL реализацию такого понятия программирования, как "Динамический список" - структура данных переменной длинны, но в SQL если "думать по-топорному" он реализуется с помощью добавления дополнительных полей в таблицу - 31 поле только для хранения дат - это через чур. Больше ничего придумать не могу. Может кто сталкивался с такой проблемой? Как решали, какой тип данных использовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 02:52 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
333Mixim333но в SQL если "думать по-топорному" он реализуется с помощью добавления дополнительных полей в таблицу - 31 поле только для хранения дат - это через чур. Больше ничего придумать не могу. Не думайте по-топорному, думайте реляционно. Года Год201020112012 Месяцы Месяцы12...12 Календарь Годмесяцдень201111201112...2011131201121... Работники IDФИО1Петров2Иванов Табель отработки IDГодмесяцденьОтработка1201111Праздник1201112Праздник...120111138 часов120111146 часов К этому, разумеется, справочник праздниоков и перенесенных рабочих дней для каждого года. Выходные формы - вытягивание чисел в столбцы - перекрестными запросами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 08:47 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Программист-ЛюбительОтработка Праздник Суммировать отработанные часы при такой схеме будет тот ещё... веселье. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 11:48 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Это условная схема, упрощенная для лучшей наглядности. Разумеется, в физической модели в одном поле не может лежать и число часов и строка "праздник". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 13:12 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
чё-то бред какй-то. 1. в праздники тоже работают. 2. праздник - он для всех праздник. так что если уж пишете количество отработанных часов, надо писать 0 или фактическое. и удалять оттуда признак праздника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 16:57 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Тащемта Работники IDFIO1Петров2Иванов Типы дней TIDNAME1Рабочий2Выходной Отработанные дни IDTIDDATEHOURS122011-01-096.5112011-01-108112011-01-118212011-01-108.5212011-01-117.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2011, 17:05 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Ejhi Работники IDFIO1Петров2Иванов Типы дней TIDNAME1Рабочий2Выходной Отработанные дни IDTIDDATEHOURS122011-01-096.5112011-01-108112011-01-118212011-01-108.5212011-01-117.5 Программист-ЛюбительТабель отработки IDГодмесяцденьОтработка1201111Праздник1201112Праздник...120111138 часов120111146 часов В принципе и так можно сделать, НО по-моему прослеживается некоторая избыточность данных... Ладно, допустим в компании работают 100 сотрудников и необходимо хранить их табели в течении 10 лет(условность), делаем небольшие подсчеты: 100сотрудников*10лет*364дня=364000 записи=>ладно, требуется более-менее нормальный объем памяти для хранения такого! Теперь допустим, что работников у нас не 100, а 10000. Выполняем те же расчеты и получаем 36'400'000=>примерно переводим необходимую память для хранения этого в байты и получаем базу объемом в несколько гигабайт(десятков гигабайт) и это если сотрудников только 10000 и нет других таблиц, а если их 100'000 или 1'000'000(возьмем какую-нибудь очень крупную транснациональную компанию) и т.д., то это никакого винчестера не хватит для хранения БД! Теперь возьмем, что БД строится не таким образом, а как хотелось мне(если бы это было доступно)-усложняется процесс разработки-несмоненно "да", однако мы избавляемся от дублирования четырех полей(ID, фамилия, имя,...) и соответственно экономим не хило память-оно нам надо-желательно, стоит ли "игра свеч"-по-моему вполне. Видимо придется накладывать одно ограничение - в базе могут храниться не данные за каждый день в виде списка, а суммарное количество отработанного времени за каждый месяц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 15:19 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Веский аргумент к нарушению нормализации данных - экономия объема дисков. Почем там ноне эти терабайты ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 15:40 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
333Mixim333однако мы избавляемся от дублирования четырех полей(ID, фамилия, имя,...)Какое ещё дублирование, его нет в правильной модели. 333Mixim333Выполняем те же расчеты и получаем 36'400'000=>примерно переводим необходимую память для хранения этого в байты и получаем базу объемом в несколько гигабайт(десятков гигабайт) и это если сотрудников только 10000 и нет других таблиц, а если их 100'000 или 1'000'000(возьмем какую-нибудь очень крупную транснациональную компанию) и т.д., то это никакого винчестера не хватит для хранения БД! Во первых, для 36'400'000 записей не потребуются десятки гигабайт, байтов на запись десятки, соответственно, нужно будет гигабайт на диске. Во вторых, количество дисков давно уже определяется не требуемым размером, а требуемой производительностью. Сервер на 1'000'000 сотрудников загрузят десятком тысяч запросов в секунду, и ему потребуется сотня-другая дисков, а на них найдётся сотня гигов для табеля :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 16:14 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
333Mixim333, По поводу объема данных. Предположим худший вариант: сотрудники пашут без выходных и праздников 365 дней в году. Тогда за 10 лет 1000 сотрудников займут 3 650 000 записей в таблице "Отработанные дни". Пусть поле ID (ИД сотрудника) будет int - 4 байта. Поле TID (тип дня) - tinyint - 1 байт. Поле HOURS можно заменить на MINUTES в smallint - 2 байта. И поле DATE типа date - 3 байта. Итого: (4 + 1 + 2 + 3) х 3 650 000 = 36 500 000 байт ~ 30 МБ Конечно, это не считая индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 16:17 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Сейчас попробовал сгенерить такую табличку на 1000 сотрудников на 10 лет. Вышло 3652000 записей. Правда вместо date получилось только smalldatetime. Но общий объем таблицы составил ~70 МБ. Так что боятся больших объемов не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 16:36 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
333Mixim333Создаю БД, в которой ... ...Видимо придется накладывать одно ограничение - в базе могут храниться не данные за каждый день в виде списка, а суммарное количество отработанного времени за каждый месяц. Ваши дальнейшие действия покажЕте ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 16:52 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
>Какое ещё дублирование, его нет в правильной модели В правильной - нет, а в предложенных - есть. Ума не приложу, зачем с упорством, достойным лучшего применения, пихать признак праздника в список фактической отработки. За одну и ту же дату два разных чела могут этот признак иметь с разными значениями? А если вообще никто не работал - уже нельзя сказать, был праздник или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2011, 23:45 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовУма не приложу, зачем с упорством, достойным лучшего применения, пихать признак праздника в список фактической отработки. За одну и ту же дату два разных чела могут этот признак иметь с разными значениями? А если вообще никто не работал - уже нельзя сказать, был праздник или нет? Разумно. Тогда можно вынести все даты в справочник Календарь: DIDTIDDATE112011-01-01212011-01-01 И объем таблицы Отработанные дни сократится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 10:36 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
EjhiDIDTIDDATE112011-01-01212011-01-0 2 Поправил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 10:46 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
EjhiТогда можно вынести все даты в справочник Календарь Ну или как вариант - сделать отдельную табличку с датами праздников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 15:47 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовEjhiТогда можно вынести все даты в справочник Календарь Ну или как вариант - сделать отдельную табличку с датами праздников. С датами будних дней, объявленных выходными и праздниками и датами выходных, объявленных рабочими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 18:15 |
|
||
|
Хранение данных о каждом дне каждого месяца
|
|||
|---|---|---|---|
|
#18+
Кстати, праздник совершенно не значит, что никому не нужно работать. К примеру, бухгалтерия на Новый год гуляет, а аварийно-диспетчерская служба - работает под бой курантов. У одних нули будут, у других - восьмерки (или как там круглосуточные смены организованы - по может, по 12 часов?). Смешение восьмерок и отметок о выходных идет еще из древних обычаев заполнения бумажного табеля, для наглядности - чтобы не оставалось пустых клеток. В базах данных это совершенно ненужный подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2011, 23:28 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37458320&tid=1542003]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 505ms |

| 0 / 0 |
