powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Создание архива.
23 сообщений из 23, страница 1 из 1
Создание архива.
    #34926458
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый всем вечер.

При проектировании системы столкнулся с вопросом создания архива. Вкратце: допустим есть система учета персонала фирмы. Данные по работающим сотрудникам хранятся в БД. Когда сотрудник увольняется, данные о нем не удаляются из базы, а помещаются в архив: а вдруг он снова вернется. Потом по необходимости данные из этого архива можно вытаскивать. Цель этой затеи: четко разграничивать актуальные и "просто исторические" данные, чтобы не ворочать большими объемами ненужных данных.
Как такое реализовать? Самый простой вариант: сделать копию схемы актуальной базы и заполнять ее архивными данными. Но тут возникают накладки со связями. Простой пример: работает в конторе Коля Пружинкин, проживающий в Ивановском районе. Потом он увольняется, и записи о нем (включая и район проживания) переносятся в архивную БД. Через полгода Коля снова приходит, его запись вытаскивается из архива, чтобы быть положенной в актуальную БД, но...такого района в городе уже нет (реформы горсовета)... Как быть?

Подскажите, спецы!
...
Рейтинг: 0 / 0
Создание архива.
    #34926465
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно поинтересоваться прогнозируемым объемом "архивных" данных системы учета персонала фирмы?
...
Рейтинг: 0 / 0
Создание архива.
    #34926513
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunRiderЦель этой затеи:
Прорва ненужного геморроя.
...
Рейтинг: 0 / 0
Создание архива.
    #34926933
Фотография Calm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПрорва ненужного геморроя.
+1

Используем кадровую систему, в которой работающих 10+ тыч кадров, сколько уволенных - никто не считал. Отличаются они одним полем в одной таблице. Горя не знаем.
...
Рейтинг: 0 / 0
Создание архива.
    #34927420
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Calm
Используем кадровую систему, в которой работающих 10+ тыч кадров, сколько уволенных - никто не считал. Отличаются они одним полем в одной таблице. Горя не знаем.

А если там достаточно большая иерархия отношений? Т.е. на сотрудника оформлен СПД (субъект предпринимательской деятельности), зарегистрированный во всевозможных администрациях, пенсионных фондах и т.д., у кажого из которых свои реквизиты и куча сопутствующей информации. Насколько я понял поставленную мне задачу, то целью архива было уменьшить объем данных, доступных для работы.

Т.е. SELECT * FROM Employee будет выбирать не из тысяч сотрудников, как работающих сейчас, так и работавших когда-либо, а только из работающих ныне.
Если без архива, то я сходу вижу пока 2 варинта:

1) можно ввести поле isDismissed в таблице Employee, но насколько понизится эффективность запроса SELECT * FROM Employee WHERE isDismissed = false по сравнению с предыдущим запросом?

2) Можно сделать отдельную табличку, например, ActualEmployees, в которой просто хранить id работающих сотрудников. И тогда при выборе работающих нужно будет делать join. Тоже, насколько это понизит быстродействие? И начиная с каких размеров таблиц?

Предполагается использовать СУБД Oracle 10.x
...
Рейтинг: 0 / 0
Создание архива.
    #34927427
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621Можно поинтересоваться прогнозируемым объемом "архивных" данных системы учета персонала фирмы?

Даже приблизительно не представляю...
...
Рейтинг: 0 / 0
Создание архива.
    #34927542
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunRiderНасколько я понял поставленную мне задачу, то целью архива было уменьшить объем данных, доступных для работы.

Может вы плохо поняли поставленную задачу?
SunRider
1) можно ввести поле isDismissed в таблице Employee, но насколько понизится эффективность запроса SELECT * FROM Employee WHERE isDismissed = false по сравнению с предыдущим запросом?

Рекомендую ознакомиться с такой штукой, как индексы в частности и темой оптимизации запросов вообще, чтобы не усложнять себе и другим жизнь.
SunRider
Предполагается использовать СУБД Oracle 10.x
Тем более. У этой СУБД отличный оптимайзер. Главное правильно спроектировать базу, а он уж сам разберется, как ему оптимальнее отбирать данные по критериям. И сделает он это на порядок оптимальнее, эффективнее, удобнее и дешевле, чем если вы будете заморачиваться кустарными архивами.
...
Рейтинг: 0 / 0
Создание архива.
    #34927644
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а секционирование (partitioning) здесь нельзя ли куда-нибудь влепить?
...
Рейтинг: 0 / 0
Создание архива.
    #34927665
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginа секционирование (partitioning) здесь нельзя ли куда-нибудь влепить? :-)
...
Рейтинг: 0 / 0
Создание архива.
    #34927806
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunRiderА если там достаточно большая иерархия отношений? Т.е. на сотрудника оформлен СПД (субъект предпринимательской деятельности), зарегистрированный во всевозможных администрациях, пенсионных фондах и т.д., у кажого из которых свои реквизиты и куча сопутствующей информации.
И? Правильно ли я понял, что Вы собираетесь на каждого сотрудника вбивать свою запись в таблицы администраций, пенсионных фондов итд?

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

Поймите: кто-то должен принимать ответственные решения. Если человек, который десять лет назад программировал что-то на Клиппере, сейчас сказал Вам - да, и еще наверное надо архив, покумекай на эту тему - это не ответственность, это "благие пожелания", которые сами знаете куда ведут.

SunRiderТ.е. SELECT * FROM Employee
Напугали :)

SunRider1) можно ввести поле isDismissed в таблице Employee, но насколько понизится эффективность запроса SELECT * FROM Employee WHERE isDismissed = false по сравнению с предыдущим запросом?
Зависит от кучи факторов, в том числе от того, в каких попугаях Вы считаете эффективность. В ряде случаев - нинасколько.

SunRider2) Можно сделать отдельную табличку, например, ActualEmployees, в которой просто хранить id работающих сотрудников.
Определенно лишние траты. Зачем делать таблицу там, где достаточно индекса?

SunRiderПредполагается использовать СУБД Oracle 10.x
Честно говоря, вашему руководству стоило бы доверить проектирование базы кому-нибудь, кто хотя бы читал Кайта.
...
Рейтинг: 0 / 0
Создание архива.
    #34927927
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гoлдун
Может вы плохо поняли поставленную задачу?


Уточнил. Задача преследует 2 основные цели:
1) Оптимизация работы БД.
2) Реализация идеологических воззрений руководства (неактуальные данные должны каким-то образом быть отделены от акутальных).

так что, вроде как, я не ошибался ;)
...
Рейтинг: 0 / 0
Создание архива.
    #34928066
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer SunRiderА если там достаточно большая иерархия отношений? Т.е. на сотрудника оформлен СПД (субъект предпринимательской деятельности), зарегистрированный во всевозможных администрациях, пенсионных фондах и т.д., у кажого из которых свои реквизиты и куча сопутствующей информации.
И?
Это я к тому, что запросы могут быть достаточно сложными, на много таблиц и со сложными условиями.
softwarerПравильно ли я понял, что Вы собираетесь на каждого сотрудника вбивать свою запись в таблицы администраций, пенсионных фондов итд?
Ну нет кончено :) Тут же отношение много-к-одному (сотрудник-конкретная инстанция).
softwarerсказал Вам - да, и еще наверное надо архив, покумекай на эту тему
Почти что так :) А как могло требование создание архива, будучи поставленным изначально, изменить процесс проектирования?
softwarer
SunRiderТ.е. SELECT * FROM Employee
Напугали :)

Ну, данных-то может быть много ;)
softwarer
SunRider1) можно ввести поле isDismissed в таблице Employee, но насколько понизится эффективность запроса SELECT * FROM Employee WHERE isDismissed = false по сравнению с предыдущим запросом?
Зависит от кучи факторов, в том числе от того, в каких попугаях Вы считаете эффективность

Время обработки запроса - я о таком "попугае".
softwarer
Определенно лишние траты. Зачем делать таблицу там, где достаточно индекса?

в смысле - индекса?
softwarerЧестно говоря, вашему руководству стоило бы доверить проектирование базы кому-нибудь, кто хотя бы читал Кайта.
Ну не всем же сразу профессионалами быть, надо когда-нибудь и как-нибудь понемногу учиться, правда ж? :)
...
Рейтинг: 0 / 0
Создание архива.
    #34928192
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg beluginа секционирование (partitioning) здесь нельзя ли куда-нибудь влепить? :-)

А чо, я что-то неправильно понял? Если например сделать функцию относительно даты увольнение и давноуволенных запихать в отдельную секцию как-нибудь?

Я просто с этим не работал реально и не очень представляю как это делается, а интересно...
...
Рейтинг: 0 / 0
Создание архива.
    #34928396
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin alexeyvg beluginа секционирование (partitioning) здесь нельзя ли куда-нибудь влепить? :-)
А чо, я что-то неправильно понял? Если например сделать функцию относительно даты увольнение и давноуволенных запихать в отдельную секцию как-нибудь?

Я просто с этим не работал реально и не очень представляю как это делается, а интересно...Влеплять всё, о чём узнали - это плохой метод проектирования архитектуры БД :-)

Для таблицы в 10 или 100 К записей секционирование принесёт усложнение разработки и поддержки и замедление корости работы.

Простой флаг isDismissed позволит отделить работающих от уволенных.

Запросы в ОЛТП - системе будут, очевидно, содержать какие-то критерии отбора записей (например, получение записи по ИД), и по ним будет всё эффективно работать без всякого секционирования и рабиения.

Запросы в аналитике будут быстрые, т.к. записей мало.

Кроме того, действия всё равно нужно делать как по работающим, так и по уволенным сотрудникам.
...
Рейтинг: 0 / 0
Создание архива.
    #34928459
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Даже приблизительно не представляю...

Даже для Газпрома с его количеством бездельников Ваша задача не актуальна. Введите дополнительный признак состояния - этого достаточно более чем.
...
Рейтинг: 0 / 0
Создание архива.
    #34928536
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunRiderЭто я к тому, что запросы могут быть достаточно сложными, на много таблиц и со сложными условиями.
Безусловно. Но на объем данных это влияет крайне мало, страх "десятков тысяч записей" страшнее не выглядит. А в том, что касается сложностей... чем больше у Вас будет "архивных" таблиц, тем больше будет мест, где придется решать, интересуют ли данные из "активной" таблицы, из "архивной" или же из обеих.

SunRiderПочти что так :) А как могло требование создание архива, будучи поставленным изначально, изменить процесс проектирования?
Вопрос не в этом. Просто это было брякнуто из общих соображений, и не следует расценивать это как нечто ценное и тем более как руководство к действию.

Ключевое требование в этой задаче - оно затронуто в Вашем первом письме - это версионность практически всех данных. Люди приходят, уходят и возвращаются; люди меняют должности переходят между отделами; меняется штатное расписание/оргструктура и так далее. Вот над этим надо думать, думать долго и хорошо (а лучше - смотреть готовые решения и потом думать).

SunRiderНу, данных-то может быть много ;)
Сколько?

SunRiderВремя обработки запроса - я о таком "попугае".
Такой запрос скорее всего пойдет в FIRST_ROWS по индексу - брать первые 25-50 записей в соответствии с order by - и лишнего времени не займет.

SunRiderв смысле - индекса?
В смысле. Собственно, смотрите того же Кайта, он пишет много лучше, чем я :)

SunRiderНу не всем же сразу профессионалами быть, надо когда-нибудь и как-нибудь понемногу учиться, правда ж? :)
Правда, хотя учиться эффективнее в команде с более опытными людьми. И Вас, если обратите внимание, никто не упрекает. А вот вашему руководству это действительно минус - если, конечно, система хоть немного нужна :)
...
Рейтинг: 0 / 0
Создание архива.
    #34928586
SunRider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerПравда, хотя учиться эффективнее в команде с более опытными людьми. И Вас, если обратите внимание, никто не упрекает. А вот вашему руководству это действительно минус - если, конечно, система хоть немного нужна :)
Так Вы не подумайте, что все лежит на моих плечах. Просто сейчас у меня поисковое задание, результаты которого потом будут обсуждаться с более опытными людьми.
...
Рейтинг: 0 / 0
Создание архива.
    #34928679
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, достаточно флагов типа dismissed в нужных таблицах, триггеров, которые эти флаги будут ставить, и добавления условий WHERE not dismissed в нужные индексы. Возможно, понадобится еще создать вьюхи вместо некоторых таблиц, чтобы на клиенте лишнего не показывалось.
Все остальное - от лукавого :) Наверное, хотят распилить бабло - благо - контора большая.
...
Рейтинг: 0 / 0
Создание архива.
    #34929553
Фотография DVE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мораль про избыточность и нереляционность просьба не читать

делаю всегда так

простой пример

Сотрудник
N системный номер
Name ФИО
FD дата+время начала версии реализации объекта
TD дата+время конца версии реализации объекта

1 Пупкина Маша 01.01.2000 12:06:53 12.05.2003 23:59:59 // зарегистрирована в системе
1 Пупкина Маша 13.05.2003 00:00:00 01.01.3000 00:00:00 // поменяла фамилию и до сих пор работает
1 Васильев Максим 01.01.2000 12:06:53 07.12.2004 23:59:59 // зарегистрирована в системе
// после уволен!

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

НА любую дату смотрите срез!

where дата_время between fd and td


На тему роста количества записей и оптимизации проблем нет!
стройте правильные индексы и правильно пишите запросы.

Можно идти по пути денормализации, те иметь таблицу только с последней актуальной информацией

текущая фио, текущая должность ............

, а данные с историей так и идут своим чередом.

я склоняюсь рассматривать реализацию с точки зрения временной шкалы и все тут.
и это можно применять практически ко всем объектам.
...
Рейтинг: 0 / 0
Создание архива.
    #34929566
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DVE
Не очень понимаю, какую мораль можно прочитать по поводу сверхстандартного SCD2.

В Вашем рассказе опущен самый интересный момент. Допустим, Маша работает в отделе АСУ, который с 01.01.2002 называется департаментом ИТ. Это переименование не должно требовать глобального изменения данных сотрудников - для чего Маша должна ссылаться не на версию отдела АСУ, а на отдел в целом, на стержневой идентификатор....
...
Рейтинг: 0 / 0
Создание архива.
    #34929570
Фотография DVE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer DVE
Не очень понимаю, какую мораль можно прочитать по поводу сверхстандартного SCD2.

В Вашем рассказе опущен самый интересный момент. Допустим, Маша работает в отделе АСУ, который с 01.01.2002 называется департаментом ИТ. Это переименование не должно требовать глобального изменения данных сотрудников - для чего Маша должна ссылаться не на версию отдела АСУ, а на отдел в целом, на стержневой идентификатор....



структура предприятия

Код: plaintext
1.
2.
1 АСУ            01.01.1900 - 31.12.2001 23:59:59
1 департамент ИТ 01.01.2002 - 01.01.3000


и не требует ничего!!!
а маша как работала в департаменте s\N = 1 так и работает!
...
Рейтинг: 0 / 0
Создание архива.
    #34929572
Фотография DVE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНе очень понимаю, какую мораль можно прочитать по поводу сверхстандартного SCD2.


просьба была для тех кто с ним не знаком
...
Рейтинг: 0 / 0
Создание архива.
    #34929582
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> делаю всегда так

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


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