powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как реализовывают версионные системы?
10 сообщений из 10, страница 1 из 1
Как реализовывают версионные системы?
    #39179701
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Уважаемые!

Хочу спросить вашего совета.

Допустим у меня есть Организации, Сотрудники и Документы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Table ORG (
   id        SERIAL,
   orgName   CHAR(20)
)

Table Sotrudniki (
   id        SERIAL,
   sotrName  CHAR(20),
   isActive  TINYINT
)

Table Doc (
   id        SERIAL,
   docTitle  CHAR(20),
   docDate   BIGINT UNSIGNED
)



И эти "сущности" между собой связаны таким образом, что у Сотрудника в Организации есть определённая должность.
И у документов есть подписанты, это тоже конкретный сотрудник находящийся в конкретной должности:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Table orgSotrudnik (
   id        SERIAL,
   orgID     SERIAL,
   sotrID    SERIAL,
   dolzhnost CHAR(20),
   FK(orgID)  => Org(id),
   FK(sotrID) => Sotrudniki(id)
)

Table docPodpisant (
   id        SERIAL,
   docID     SERIAL,
   sotrID    SERIAL,
   FK(docID)  => Doc(id),
   FK(sotrID) => Sotrudniki(id)
)



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

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

С другой стороны хочется чтобы оставалась связность данных. Тут напридумывалось масса вариантов, таких как:
- Отдельная таблица с историей должностей сотрудника, которая наполняется тригером при внесении строк в таблицу связи orgSotrudnik :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
orgSotrudnik_History (
   id        SERIAL,
   orgID     SERIAL,
   sotrID    SERIAL,
   dolzhnost CHAR(20),
   FK(orgID)  => Org(id),
   FK(sotrID) => Sotrudniki(id)
)


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

Вобщем прошу совета матёрых и умных!

Также прошу учесть, что вопрос задаётся по БД MySQL, поэтому просьба учитывать её возможности.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39179706
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39179709
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Google "периодические атрибуты".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39179775
kormot,
И почему у Вас сотрудник привязан к должности? Должность отдельно, сотрудник отдельно. Связь между ними - через таблицу назначений (aka кадровые приказы о назначении в должность). Так же, как это у Вас сделано для подписантов документов.

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

Кстати, подписанты тоже могут меняться.
Например:
- Может оказаться, что нужно кого-то добавить к визирующим,
- кого-то убрать (добавили с какого-то перепугу)...
- Человек может перейти на другую должность или уволиться так и не завизировав договор
- После увольнения сотрудника его обязанности будет выполнять другой человек
- и т.д.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39179809
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийkormot,
И почему у Вас сотрудник привязан к должности? Должность отдельно, сотрудник отдельно. Связь между ними - через таблицу назначений (aka кадровые приказы о назначении в должность). Так же, как это у Вас сделано для подписантов документов.
Станислав, да я так на самом деле и делаю, просто писать отдельную таблицу для иллюстрации в посте лениво было :)

Станислав С...кийПри этом, как уже было сказано, должен быть интервал работы в должности (вступления в должность, увольнения с должности). При переходе на новую должность старая должность закрывается (заполняется дата увольнения с должности актуальной датой, можно через триггер)
За это уточнение спасибо, ценно, запомню и учту.

Станислав С...кийКстати, подписанты тоже могут меняться.
Например:
- Может оказаться, что нужно кого-то добавить к визирующим,
- кого-то убрать (добавили с какого-то перепугу)...
- Человек может перейти на другую должность или уволиться так и не завизировав договор
- После увольнения сотрудника его обязанности будет выполнять другой человек
- и т.д.
С этим вроде нет противоречий в представленной схеме. Уникального индекса в docPodpisant ни одного не указывал.
Это уже вопрос конкретных программных реализаций. У меня вопрос больше по теории.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39180533
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotЭто уже вопрос конкретных программных реализаций. У меня вопрос больше по теории.
Теория, вкратце, заключается в том, что если достаточно буквально перенести в базу структуру реальности, результат окажется вполне применимым с точки зрения получения нужных ответов. Деталь ставят в изделие не просто так, а по комплектовочной ведомости. Сотрудник занимает должность не просто, а по приказу. И так далее.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39198559
Relict_35
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SCD Type 2 вам надо реализовать.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39198855
Set666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот один из вариантов:
У тебя должно быть три таблицы сотрудники, должности и таблица связка много ко многим, должность - сотрудник. В документах используй id таблицы связки, таким образом по этому id связки легко вытащишь сотрудника и должность на момент подписания договора, можно ещё два поля добавить в связку дата вступления в должность и дату снятия с должности, что бы можно было вычислить должность сотрудника, на какой то момент времени.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39199682
474
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotС одной стороны есть решение очевидное - это денормализация, когда у каждого документа просто в текстовые поля забивается содержимое данных сотрудника и его должности на момент когда он является подписантом.
И это самое правильное решение, которые избавит вас от головной боли при дальнейшей работе с документами.
...
Рейтинг: 0 / 0
Как реализовывают версионные системы?
    #39200402
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
474И это самое правильное решение, которые избавит вас от головной боли при дальнейшей работе с документами.
Особенно при кейсе "Оказалось, мы в его фамилии сделали опечатку и обнаружили это только сейчас".

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


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