powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Адекватность данных во времени.......
25 сообщений из 60, страница 1 из 3
Адекватность данных во времени.......
    #35828650
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не я первый, не я последний видимо задаю этот вопрос.
Хотелось бы узнать "классические решения" подобных задач.
Организовать базу данных, отображающую текущее состояние дел легко.
Но как только встает вопрос о том, что бы документ напечатанный 2 года назад и сегодня был бы одинаков то простая структура сразу сильно усложняется, и работа с этой структурой соответственно.
Вот простой пример штатного расписания ( чисто теоретический, без подробностей )

tDept - таблица отделов - это дерево (DeptID = ParentID)

tPosition - список должностей

tStaff - таблица "рабочих мест":
DeptID - в каком отделе,
PositionID - какой должности,
SQty - сколько рабочих мест

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

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

Я пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач?

Заранее благодарен.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829018
Hey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сути требуется ведение истории. Обычно она хранится в отдельном месте.

Тут скорее вопрос в другом, вы уверены, что вам нужно знать, где жил кассир 2 года назад ?
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829233
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач?Кардинально другого - никто не предложит. Присто потому что так и решают эту задачу.

Oracle для historical view поступает почти так же.
1) Основная таблица - обычная таблица.
2) К каждой таблице для которой включена история - создается теневая таблица с диапазоном дат, которые определяют значения полей записи в определенный момент времени.

При указании даты на которую надо получить данные - Oracle сам решает какие данные откуда взять.
А с обычной таблицей можно работать как с текущими данными.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829248
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач?
Ну это просто. А вот изменение самой структуры таблицы во времени как отслеживать ?
Я использую EAV с историей.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829258
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heyвы уверены, что вам нужно знать, где жил кассир 2 года назад ?

Позволю себе пояснить за автора, поскольку вопрос интересен и для меня. Дело в том, что существуют системы, где выдвигается требование "повторяемости отчетов". То есть, если есть отчетная форма, возвращаясь к примеру, "Штатное расписание на указанную дату" с параметром - дата составления, то запросив СЕЙЧАС отчет на "01.01.1999", мы должны получить В ТОЧНОСТИ тот же отчет, что был получен на эту дату в 1999 году, несмотря на все последовавшие реорганизации и переезды кассира.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829291
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate

Любопытно, как Вы решаете такой вопрос:

1. Если есть таблица должностей, tPosition (PosID PK, PosName), и мы добавим сюда BeginDate, EndDate, то каким станет первичный ключ, и соответственно внешний ключ из tStaff ?

2. Если первичным ключом станет PosID + BeginDate, и соответственно внешним ключом Staff.PosID + Staff.BeginDate, то это сработает лишь в том случае, если дата возникновения рабочего места совпадает с датой возникновения должности. А как быть, есть должность "охранник" добавили давно, а в конкретный отдел рабочее место охранника ввели позже?
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829792
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heyпо сути требуется ведение истории. Обычно она хранится в отдельном месте.

Тут скорее вопрос в другом, вы уверены, что вам нужно знать, где жил кассир 2 года назад ?

где жил, конечно не важно...... а вот какую должность занимал, какой оклад был и т.д вот это вот важно
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829802
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely
Oracle для historical view поступает почти так же.
1) Основная таблица - обычная таблица.
2) К каждой таблице для которой включена история - создается теневая таблица с диапазоном дат, которые определяют значения полей записи в определенный момент времени.

При указании даты на которую надо получить данные - Oracle сам решает какие данные откуда взять.
А с обычной таблицей можно работать как с текущими данными.

У нас как раз Oracle, не мобли бы вы поподробнее объяснить ( на примере простейшей таблицы )
что за historical view ? ( ну или послать меня к первоисточнику:) )
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35829816
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisherheyвы уверены, что вам нужно знать, где жил кассир 2 года назад ?

Позволю себе пояснить за автора, поскольку вопрос интересен и для меня. Дело в том, что существуют системы, где выдвигается требование "повторяемости отчетов". То есть, если есть отчетная форма, возвращаясь к примеру, "Штатное расписание на указанную дату" с параметром - дата составления, то запросив СЕЙЧАС отчет на "01.01.1999", мы должны получить В ТОЧНОСТИ тот же отчет, что был получен на эту дату в 1999 году, несмотря на все последовавшие реорганизации и переезды кассира.

Абсолютно верно. спасибо.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35830290
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aУ нас как раз Oracle, не мобли бы вы поподробнее объяснить ( на примере простейшей таблицы )
что за historical view ? ( ну или послать меня к первоисточнику:) ) Flashback Data Archive (Oracle Total Recall) .
Появился в версии 11g
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35830355
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely
Flashback Data Archive (Oracle Total Recall) .
Появился в версии 11g

Спасибо, посмотрю. ( хотя у нас 10-я версия оракла )
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35830594
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модkarapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач?
Ну это просто. А вот изменение самой структуры таблицы во времени как отслеживать ?
Я использую EAV с историей.

Если из таблицы поля не удалять (т.е. по сути не удалять данные, без которых старый отчёт не получится), то и старому отчёту болжно быть фиолетово, что в структуре таблицы изменилось. Он просто возьмёт из БД то что ему нужно.

Хуже, когда речь идёт о миграции данных в новую схему. Далеко не всегда находятся ресурсы, чтобы дорабатывать унаследованные отчёты и т.п. модули, которые сейчас уже не используются. Остаётся сохранить старую систему, чтобы при нужде вытянуть из неё архивные данные.

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

В OLTP системе такой подход противоречит с требованию контролировать ссылочную целостность и уникальность ключей из-за дублирования ключа в корректирующих записях. Но если время от времени выгружать данные из OLTP системы (которая отражает только текущее состояние) в историческую БД, из которой генерить всякоразные отчёты, как аналитические, так и оперативные, а так же делать выгрузки в бухгалтерию и т.п., то ни одно значимое изменение в исходных данных не осанется незамеченным. Все ходы будут записаны. Все временные срезы будут доступны.

Наконец "повторяемость" результатов расчёта иногда трактуют неверно. В ряде случаев это означает только то, что на одних и тех же данных, должны получаться одни и те же результаты (тогда и вся эта канитель ни к чему). Если вам нужно просто получить старый отчёт, независимо от того, что БД могла поменяться, то сразу сохраните его в виде файла и не мучайте БД.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35830872
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Присто потому что так и решают эту задачу.

Кто "так и решает"? Обкуренные китайские первоклассники-второгодники? Расскажите, как с этим набором атрибутов Вы намерены реализовать [псевдо]транзакционность изменений и дерево версий (даже простое, не трогая структуру данных)?

> Oracle

Тупят, как это часто бывает.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831303
Фотография nexoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
флэшбэк не потянет "года 2 назад". а применение стартдаты и конецдаты нормальная практика. транзакционность в пл/скл блоке-коде выделяешь. завел нового человечка, старые данные получили значение конецдаты по текущему времени, а новый человек получил стартдату (прим. конецдата обычно имеет значение будущего времени для корректности select).

кто стартдата конецдата
инженер1 01.01.2000 31.12.2001
новый 01.01.2002 01.01.2100

select
данные
from
таблица
where
id=идентификатор
and
sysdate /*или нужная старая дата*/ between startdate and enddate
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831660
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один гуру по имени nexoma? Наверное, тоже ораклоид?

> транзакционность в пл/скл блоке-коде выделяешь

В течение месяца сто юзеров в пятидесяти филиалах активно редактировали одни и те же данные сложной структуры, причем, логически связанные данные менялись в течение всей недели произвольным образом (у юзеров разные приоритеты и разная производительность). Через месяц выяснилось, что половина изменений была сделана неправильно. Расскажите, пожалуйста, какая транзакционность в каком коде поможет Вам откатить неправильные изменения?
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831719
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня на старой работе стояла база oracle 10g. Вопрос с историей решался так. Ключ состоял из айдишника и версии записи и было поле last - признак последней версии. При редактировании какой-либо записи, last присваивали 0, выставляли дату удаления, и создавали новую, у которой last=1, версия на 1 больше и дата создания sysdate. Таким образом можно было вытащить данные за любой промежуток времени, просмотреть хронологию изменения договора и вообще чего угодно.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831725
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Ключ состоял из айдишника и версии записи

Криво. Зачем версию тащить в ключ?

> можно было вытащить данные за любой промежуток времени

Этого не достаточно. Нужно иметь возможность получать актуальные данные на любой момент времени. Скажем, если DM прекратила существование 01.01.2002, а оператор отразил эти изменения только через три недели, ни в одной связи с 01.01.2002 DM участвовать не должна.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831772
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> Ключ состоял из айдишника и версии записи

Криво. Зачем версию тащить в ключ?

> можно было вытащить данные за любой промежуток времени

Этого не достаточно. Нужно иметь возможность получать актуальные данные на любой момент времени. Скажем, если DM прекратила существование 01.01.2002, а оператор отразил эти изменения только через три недели, ни в одной связи с 01.01.2002 DM участвовать не должна. 1. Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей. Вторая составляющая как раз чтобы разные версии одной и той же записи имели уникальный ключ. 2. Такой ситуации быть не может, потому что из приложения при редактировании вызываются хранимые процедуры, которые автоматически гасят текущую версию и создают новую. Поэтому на конкретный момент времени база - точная копия той, что была когда-то. И чисто практически могу сказать, что никогда не было ситуации чтобы я не мог извлеч нужные мне данные.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831891
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей.

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

> Такой ситуации быть не может

Дорого куплю телепатический модуль от Вашей софтинки.

> на конкретный момент времени база - точная копия той, что была когда-то

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

> не было ситуации чтобы я не мог извлеч нужные мне данные

Значит, просто не было сложных задач.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35831943
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisher
1. Если есть таблица должностей, tPosition (PosID PK, PosName), и мы добавим сюда BeginDate, EndDate, то каким станет первичный ключ, и соответственно внешний ключ из tStaff ?

Первичным ключом станет PosID + BeginDate.
А внешнего ключа в таблице tStaff не будет.
т.е. в смысле "ограничения" (FK constraint) не будет.
Будет "смысловой" внешний ключ. наши даты определяют время "жизни" (валидности) конкретной строки. В связанной таблице тоже существует пара дат(нач. конец). Так вот "логический" внешний ключ определяет, что время жизни "дочерней" записи не может выходить за рамки времени жизни "родительской" записи. Вот эта логика и должна "гарантироваться" триггерами.
Вот в этом то и сложность, прежде чем изменить какую-либо запись надо будет проверять много других таблиц.... ведь от таблицы tStaff потом будут зависеть tEmployee........
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35832154
daunito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей.

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

> Такой ситуации быть не может

Дорого куплю телепатический модуль от Вашей софтинки.

> на конкретный момент времени база - точная копия той, что была когда-то

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

> не было ситуации чтобы я не мог извлеч нужные мне данные

Значит, просто не было сложных задач. Про первичный ключ я имею ввиду (1,1) (1,2), где первое поле собственно сам ключ, а второе - версия. Если убрать версию, то из чего тогда будет состоять ключ? Насчет актуальности не выехал, приведи пример, пожалуйста. А задачи решались очень сложные. Вся информация из базы хранилась на бумаге в архивах в 3 зданиях. Несколько десятков миллиардов томов. Для составления отчетов держали целый отдел SQL программеров.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35832610
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Если убрать версию, то из чего тогда будет состоять ключ?

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

> Насчет актуальности не выехал

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

> Несколько десятков миллиардов томов.

Простите за столь категоричную оценку, но ничего глупее не могу себе представить. Базы данных и существуют как альтернатива данным на бумаге.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35832735
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daunito Вся информация из базы хранилась на бумаге в архивах в 3 зданиях. Несколько десятков миллиардов томов. Миллиардов? Вы ошибаетесь на несколько (немало) порядков, имхо.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35833555
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab,
1. Исправление ошибок вообще не проблема.
2. Самое сложное - изменение именно структуры данных когда меняется n-арность отношений (был атом стал список). Программа должна поддерживать как новую так и старую струтктуру.
3. Хранилище проблему не решает - ведь его стр-ра тоже может меняться во времени - тут скорее проблема только усугубляется.
4. Хранить готовые отчеты конечно можно, но нужен-то новый отчет на старых данных.
Такое впечатление, что необходим инструмент встроенный в СУБД, который будет хранить версии БД вместе с версиями софта.
...
Рейтинг: 0 / 0
Адекватность данных во времени.......
    #35833693
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_мод
2. Самое сложное - изменение именно структуры данных когда меняется n-арность отношений (был атом стал список). Программа должна поддерживать как новую так и старую струтктуру.


А что здесь сложного? Прежний атом остается, список добавляется, прежний програмный код остается, новый добавляется, и указывается, с какого периода его задействовать.

Было:

ID NAME PHONE_NUM1ИВАНОВ12-34-56

Отчет форма Ф-1: SELECT NAME, PHONE_NUM FROM T1

С 01.01.2009 стало:

ID NAME PHONE_NUM1ИВАНОВ12-34-56

ID PHONE_NUM_NEW112-34-56165-43-21

Отчет форма Ф-1:

IF date > 01.01.2009 // границы нововведений структуры можно отмечать в специальных классах-селекторах, или опять же завести времязависимую таблицу с перечнем алгоритмов (классов, методов) и сроками их актуальности, и сделать селектор на ее основе...
THEN SELECT NAME, PHONE_NUM_NEW FROM T1, T2... новый текст
ELSE прежний (inherited, CASE - по вкусу)
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Адекватность данных во времени.......
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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