powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение данных о каждом дне каждого месяца
18 сообщений из 18, страница 1 из 1
Хранение данных о каждом дне каждого месяца
    #37458230
333Mixim333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаю БД, в которой содержится таблица для учета рабочего времени - сколько дней отработал тот или иной сотрудник в конкретный месяц. В таблице "Учет рабочего времени" создаю поля: "ID-сотрудника", "ФИО", "Месяц", "Год", "Список отработанного количества часов". Первые четыре поля понятно что будут хранить и как, а пятое поле предполагаю заполнять примерно следующим образом: "8,8,8,8,8,В,В,А,6,6,8,8,В,В,8,8,...", где числа - это количество отработанного времени в определенный день, "В" - обозначение выходных дней, "А" - административный отпуск(порядковый номер каждого элемента в строке представляет собой день месяца). Но такую методику хранения данных, мягко говоря, можно назвать только "очень странной", т.к. если при работе через сам SQL Server по случайной или преднамеренной ошибке пользователь для января вместо 31 значения введет 41, то все рухнет. Плюс к этому, данный принцип нарушает некоторое количество правил проектирования БД, что не есть хорошо.
Немного подумал и решил поискать в SQL реализацию такого понятия программирования, как "Динамический список" - структура данных переменной длинны, но в SQL если "думать по-топорному" он реализуется с помощью добавления дополнительных полей в таблицу - 31 поле только для хранения дат - это через чур. Больше ничего придумать не могу.
Может кто сталкивался с такой проблемой? Как решали, какой тип данных использовали?
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37458320
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
333Mixim333но в SQL если "думать по-топорному" он реализуется с помощью добавления дополнительных полей в таблицу - 31 поле только для хранения дат - это через чур. Больше ничего придумать не могу.
Не думайте по-топорному, думайте реляционно.

Года
Год201020112012

Месяцы
Месяцы12...12

Календарь
Годмесяцдень201111201112...2011131201121...

Работники
IDФИО1Петров2Иванов

Табель отработки
IDГодмесяцденьОтработка1201111Праздник1201112Праздник...120111138 часов120111146 часов

К этому, разумеется, справочник праздниоков и перенесенных рабочих дней для каждого года.

Выходные формы - вытягивание чисел в столбцы - перекрестными запросами.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37458694
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительОтработка Праздник
Суммировать отработанные часы при такой схеме будет тот ещё... веселье.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37458908
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Это условная схема, упрощенная для лучшей наглядности. Разумеется, в физической модели в одном поле не может лежать и число часов и строка "праздник".
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37459562
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё-то бред какй-то.
1. в праздники тоже работают.
2. праздник - он для всех праздник.
так что если уж пишете количество отработанных часов, надо писать 0 или фактическое. и удалять оттуда признак праздника.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37459581
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тащемта

Работники
IDFIO1Петров2Иванов

Типы дней
TIDNAME1Рабочий2Выходной

Отработанные дни
IDTIDDATEHOURS122011-01-096.5112011-01-108112011-01-118212011-01-108.5212011-01-117.5
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461314
333Mixim333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, фамилия, имя,...) и соответственно экономим не хило память-оно нам надо-желательно, стоит ли "игра свеч"-по-моему вполне.
Видимо придется накладывать одно ограничение - в базе могут храниться не данные за каждый день в виде списка, а суммарное количество отработанного времени за каждый месяц.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461386
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Веский аргумент к нарушению нормализации данных - экономия объема дисков. Почем там ноне эти терабайты ?
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461485
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
333Mixim333однако мы избавляемся от дублирования четырех полей(ID, фамилия, имя,...)Какое ещё дублирование, его нет в правильной модели.
333Mixim333Выполняем те же расчеты и получаем 36'400'000=>примерно переводим необходимую память для хранения этого в байты и получаем базу объемом в несколько гигабайт(десятков гигабайт) и это если сотрудников только 10000 и нет других таблиц, а если их 100'000 или 1'000'000(возьмем какую-нибудь очень крупную транснациональную компанию) и т.д., то это никакого винчестера не хватит для хранения БД! Во первых, для 36'400'000 записей не потребуются десятки гигабайт, байтов на запись десятки, соответственно, нужно будет гигабайт на диске.

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

Сервер на 1'000'000 сотрудников загрузят десятком тысяч запросов в секунду, и ему потребуется сотня-другая дисков, а на них найдётся сотня гигов для табеля :-)
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461492
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 МБ

Конечно, это не считая индексов.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461530
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас попробовал сгенерить такую табличку на 1000 сотрудников на 10 лет. Вышло 3652000 записей. Правда вместо date получилось только smalldatetime. Но общий объем таблицы составил ~70 МБ.

Так что боятся больших объемов не нужно.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37461564
ZezaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
333Mixim333Создаю БД, в которой ...

...Видимо придется накладывать одно ограничение - в базе могут храниться не данные за каждый день в виде списка, а суммарное количество отработанного времени за каждый месяц. Ваши дальнейшие действия покажЕте ?
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37462080
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Какое ещё дублирование, его нет в правильной модели
В правильной - нет, а в предложенных - есть.

Ума не приложу, зачем с упорством, достойным лучшего применения, пихать признак праздника в список фактической отработки.
За одну и ту же дату два разных чела могут этот признак иметь с разными значениями?
А если вообще никто не работал - уже нельзя сказать, был праздник или нет?
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37462363
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей ВаскецовУма не приложу, зачем с упорством, достойным лучшего применения, пихать признак праздника в список фактической отработки.
За одну и ту же дату два разных чела могут этот признак иметь с разными значениями?
А если вообще никто не работал - уже нельзя сказать, был праздник или нет?

Разумно. Тогда можно вынести все даты в справочник Календарь:

DIDTIDDATE112011-01-01212011-01-01

И объем таблицы Отработанные дни сократится.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37462390
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EjhiDIDTIDDATE112011-01-01212011-01-0 2

Поправил
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37463104
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EjhiТогда можно вынести все даты в справочник Календарь
Ну или как вариант - сделать отдельную табличку с датами праздников.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37463395
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовEjhiТогда можно вынести все даты в справочник Календарь
Ну или как вариант - сделать отдельную табличку с датами праздников.
С датами будних дней, объявленных выходными и праздниками и датами выходных, объявленных рабочими.
...
Рейтинг: 0 / 0
Хранение данных о каждом дне каждого месяца
    #37464128
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, праздник совершенно не значит, что никому не нужно работать. К примеру, бухгалтерия на Новый год гуляет, а аварийно-диспетчерская служба - работает под бой курантов. У одних нули будут, у других - восьмерки (или как там круглосуточные смены организованы - по может, по 12 часов?).

Смешение восьмерок и отметок о выходных идет еще из древних обычаев заполнения бумажного табеля, для наглядности - чтобы не оставалось пустых клеток. В базах данных это совершенно ненужный подход.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение данных о каждом дне каждого месяца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]