|
|
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Не я первый, не я последний видимо задаю этот вопрос. Хотелось бы узнать "классические решения" подобных задач. Организовать базу данных, отображающую текущее состояние дел легко. Но как только встает вопрос о том, что бы документ напечатанный 2 года назад и сегодня был бы одинаков то простая структура сразу сильно усложняется, и работа с этой структурой соответственно. Вот простой пример штатного расписания ( чисто теоретический, без подробностей ) tDept - таблица отделов - это дерево (DeptID = ParentID) tPosition - список должностей tStaff - таблица "рабочих мест": DeptID - в каком отделе, PositionID - какой должности, SQty - сколько рабочих мест В нынешнем виде эта структура "моментальной" базы данных т.е. здесь не видно 1. Какова была структура предприятия 2 года назад. ( со всеми вытекающими вопросами - как назывался такой-то отдел 2 года назад, когда переименовали отдел, когда бухгалтерию перевели из подчинения директора в подчинение финансового отдела и т.д) 2. Когда рабочее место "кассира" перевели из бухгалтерии во вновь созданный отдел "обслуживания клиентов" и т.д. т.е. уже к одной таблице отелов много вопросов, не говоря уже о том, что она является "справочником" для таблицы "рабочих мест" Я пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 00:37 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
по сути требуется ведение истории. Обычно она хранится в отдельном месте. Тут скорее вопрос в другом, вы уверены, что вам нужно знать, где жил кассир 2 года назад ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 10:21 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач?Кардинально другого - никто не предложит. Присто потому что так и решают эту задачу. Oracle для historical view поступает почти так же. 1) Основная таблица - обычная таблица. 2) К каждой таблице для которой включена история - создается теневая таблица с диапазоном дат, которые определяют значения полей записи в определенный момент времени. При указании даты на которую надо получить данные - Oracle сам решает какие данные откуда взять. А с обычной таблицей можно работать как с текущими данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:25 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач? Ну это просто. А вот изменение самой структуры таблицы во времени как отслеживать ? Я использую EAV с историей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:27 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
heyвы уверены, что вам нужно знать, где жил кассир 2 года назад ? Позволю себе пояснить за автора, поскольку вопрос интересен и для меня. Дело в том, что существуют системы, где выдвигается требование "повторяемости отчетов". То есть, если есть отчетная форма, возвращаясь к примеру, "Штатное расписание на указанную дату" с параметром - дата составления, то запросив СЕЙЧАС отчет на "01.01.1999", мы должны получить В ТОЧНОСТИ тот же отчет, что был получен на эту дату в 1999 году, несмотря на все последовавшие реорганизации и переезды кассира. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:31 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
karapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate Любопытно, как Вы решаете такой вопрос: 1. Если есть таблица должностей, tPosition (PosID PK, PosName), и мы добавим сюда BeginDate, EndDate, то каким станет первичный ключ, и соответственно внешний ключ из tStaff ? 2. Если первичным ключом станет PosID + BeginDate, и соответственно внешним ключом Staff.PosID + Staff.BeginDate, то это сработает лишь в том случае, если дата возникновения рабочего места совпадает с датой возникновения должности. А как быть, есть должность "охранник" добавили давно, а в конкретный отдел рабочее место охранника ввели позже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:43 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
heyпо сути требуется ведение истории. Обычно она хранится в отдельном месте. Тут скорее вопрос в другом, вы уверены, что вам нужно знать, где жил кассир 2 года назад ? где жил, конечно не важно...... а вот какую должность занимал, какой оклад был и т.д вот это вот важно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 14:12 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Bely Oracle для historical view поступает почти так же. 1) Основная таблица - обычная таблица. 2) К каждой таблице для которой включена история - создается теневая таблица с диапазоном дат, которые определяют значения полей записи в определенный момент времени. При указании даты на которую надо получить данные - Oracle сам решает какие данные откуда взять. А с обычной таблицей можно работать как с текущими данными. У нас как раз Oracle, не мобли бы вы поподробнее объяснить ( на примере простейшей таблицы ) что за historical view ? ( ну или послать меня к первоисточнику:) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 14:14 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisherheyвы уверены, что вам нужно знать, где жил кассир 2 года назад ? Позволю себе пояснить за автора, поскольку вопрос интересен и для меня. Дело в том, что существуют системы, где выдвигается требование "повторяемости отчетов". То есть, если есть отчетная форма, возвращаясь к примеру, "Штатное расписание на указанную дату" с параметром - дата составления, то запросив СЕЙЧАС отчет на "01.01.1999", мы должны получить В ТОЧНОСТИ тот же отчет, что был получен на эту дату в 1999 году, несмотря на все последовавшие реорганизации и переезды кассира. Абсолютно верно. спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 14:16 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
karapetyan_aУ нас как раз Oracle, не мобли бы вы поподробнее объяснить ( на примере простейшей таблицы ) что за historical view ? ( ну или послать меня к первоисточнику:) ) Flashback Data Archive (Oracle Total Recall) . Появился в версии 11g ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 17:06 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Bely Flashback Data Archive (Oracle Total Recall) . Появился в версии 11g Спасибо, посмотрю. ( хотя у нас 10-я версия оракла ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 17:34 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
_модkarapetyan_aЯ пока решаю подобные вопросы добавляя 2 поля типда DateTime: BeginDate, EndDate. т.е. Время валидности данной записи, но тогда использование таких таблиц ( тем более связанных друг с другом ) сильно усложняется........ может кто подскажет другие варианты решений подобных задач? Ну это просто. А вот изменение самой структуры таблицы во времени как отслеживать ? Я использую EAV с историей. Если из таблицы поля не удалять (т.е. по сути не удалять данные, без которых старый отчёт не получится), то и старому отчёту болжно быть фиолетово, что в структуре таблицы изменилось. Он просто возьмёт из БД то что ему нужно. Хуже, когда речь идёт о миграции данных в новую схему. Далеко не всегда находятся ресурсы, чтобы дорабатывать унаследованные отчёты и т.п. модули, которые сейчас уже не используются. Остаётся сохранить старую систему, чтобы при нужде вытянуть из неё архивные данные. Вообще говоря, одной даты (или одного диапазона дат) может быть недостаточно. Например, что делать, если нужно исправить ошибку в данных? При одной дате (или паре дат), мы можем заморозить первоначальный отчёт, но не сможем получить исправленный отчёт и наоборот. В этой ситуации полезно разделить операционный и отчётный периоды. Т.е. нужно регистрировать когда состоялся исторический факт и когда он внесён или исправлен (путём внесения дополнительной корректирующей записи) в системе. Тогда мы сможем создавать отчёт и в первоначальном виде, отсекая факты, внесённые в систему позднее, и создавать отчёт за тот же период, но с учётом поздних корректировок. В OLTP системе такой подход противоречит с требованию контролировать ссылочную целостность и уникальность ключей из-за дублирования ключа в корректирующих записях. Но если время от времени выгружать данные из OLTP системы (которая отражает только текущее состояние) в историческую БД, из которой генерить всякоразные отчёты, как аналитические, так и оперативные, а так же делать выгрузки в бухгалтерию и т.п., то ни одно значимое изменение в исходных данных не осанется незамеченным. Все ходы будут записаны. Все временные срезы будут доступны. Наконец "повторяемость" результатов расчёта иногда трактуют неверно. В ряде случаев это означает только то, что на одних и тех же данных, должны получаться одни и те же результаты (тогда и вся эта канитель ни к чему). Если вам нужно просто получить старый отчёт, независимо от того, что БД могла поменяться, то сразу сохраните его в виде файла и не мучайте БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 21:32 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
> Присто потому что так и решают эту задачу. Кто "так и решает"? Обкуренные китайские первоклассники-второгодники? Расскажите, как с этим набором атрибутов Вы намерены реализовать [псевдо]транзакционность изменений и дерево версий (даже простое, не трогая структуру данных)? > Oracle Тупят, как это часто бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2009, 11:26 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
флэшбэк не потянет "года 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2009, 20:36 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Еще один гуру по имени nexoma? Наверное, тоже ораклоид? > транзакционность в пл/скл блоке-коде выделяешь В течение месяца сто юзеров в пятидесяти филиалах активно редактировали одни и те же данные сложной структуры, причем, логически связанные данные менялись в течение всей недели произвольным образом (у юзеров разные приоритеты и разная производительность). Через месяц выяснилось, что половина изменений была сделана неправильно. Расскажите, пожалуйста, какая транзакционность в каком коде поможет Вам откатить неправильные изменения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 14:08 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
у меня на старой работе стояла база oracle 10g. Вопрос с историей решался так. Ключ состоял из айдишника и версии записи и было поле last - признак последней версии. При редактировании какой-либо записи, last присваивали 0, выставляли дату удаления, и создавали новую, у которой last=1, версия на 1 больше и дата создания sysdate. Таким образом можно было вытащить данные за любой промежуток времени, просмотреть хронологию изменения договора и вообще чего угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 15:12 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
> Ключ состоял из айдишника и версии записи Криво. Зачем версию тащить в ключ? > можно было вытащить данные за любой промежуток времени Этого не достаточно. Нужно иметь возможность получать актуальные данные на любой момент времени. Скажем, если DM прекратила существование 01.01.2002, а оператор отразил эти изменения только через три недели, ни в одной связи с 01.01.2002 DM участвовать не должна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 15:25 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
guest_20040621> Ключ состоял из айдишника и версии записи Криво. Зачем версию тащить в ключ? > можно было вытащить данные за любой промежуток времени Этого не достаточно. Нужно иметь возможность получать актуальные данные на любой момент времени. Скажем, если DM прекратила существование 01.01.2002, а оператор отразил эти изменения только через три недели, ни в одной связи с 01.01.2002 DM участвовать не должна. 1. Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей. Вторая составляющая как раз чтобы разные версии одной и той же записи имели уникальный ключ. 2. Такой ситуации быть не может, потому что из приложения при редактировании вызываются хранимые процедуры, которые автоматически гасят текущую версию и создают новую. Поэтому на конкретный момент времени база - точная копия той, что была когда-то. И чисто практически могу сказать, что никогда не было ситуации чтобы я не мог извлеч нужные мне данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 16:28 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
> Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей. Первичный ключ по определению уникален и суррогатен, так что никаких повторений в принципе быть не может. > Такой ситуации быть не может Дорого куплю телепатический модуль от Вашей софтинки. > на конкретный момент времени база - точная копия той, что была когда-то Дружище, я пытаюсь Вас подвести к простой мысли о том, что актуальность базы данных бывает двух видов: 1. база не актуальна потому, что при проектировании бараны-архитекторы не удосужились различать актуальность данных внутренних и внешних источников и 2. база не актуальна потому, что слишком большой объем работы для поддежки ее актуальности. Других состояний у базы данных не бывает. > не было ситуации чтобы я не мог извлеч нужные мне данные Значит, просто не было сложных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 19:22 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher 1. Если есть таблица должностей, tPosition (PosID PK, PosName), и мы добавим сюда BeginDate, EndDate, то каким станет первичный ключ, и соответственно внешний ключ из tStaff ? Первичным ключом станет PosID + BeginDate. А внешнего ключа в таблице tStaff не будет. т.е. в смысле "ограничения" (FK constraint) не будет. Будет "смысловой" внешний ключ. наши даты определяют время "жизни" (валидности) конкретной строки. В связанной таблице тоже существует пара дат(нач. конец). Так вот "логический" внешний ключ определяет, что время жизни "дочерней" записи не может выходить за рамки времени жизни "родительской" записи. Вот эта логика и должна "гарантироваться" триггерами. Вот в этом то и сложность, прежде чем изменить какую-либо запись надо будет проверять много других таблиц.... ведь от таблицы tStaff потом будут зависеть tEmployee........ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2009, 20:59 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
guest_20040621> Если не тащить версию, то первичный ключ может быть одинаковым у 40 записей. Первичный ключ по определению уникален и суррогатен, так что никаких повторений в принципе быть не может. > Такой ситуации быть не может Дорого куплю телепатический модуль от Вашей софтинки. > на конкретный момент времени база - точная копия той, что была когда-то Дружище, я пытаюсь Вас подвести к простой мысли о том, что актуальность базы данных бывает двух видов: 1. база не актуальна потому, что при проектировании бараны-архитекторы не удосужились различать актуальность данных внутренних и внешних источников и 2. база не актуальна потому, что слишком большой объем работы для поддежки ее актуальности. Других состояний у базы данных не бывает. > не было ситуации чтобы я не мог извлеч нужные мне данные Значит, просто не было сложных задач. Про первичный ключ я имею ввиду (1,1) (1,2), где первое поле собственно сам ключ, а второе - версия. Если убрать версию, то из чего тогда будет состоять ключ? Насчет актуальности не выехал, приведи пример, пожалуйста. А задачи решались очень сложные. Вся информация из базы хранилась на бумаге в архивах в 3 зданиях. Несколько десятков миллиардов томов. Для составления отчетов держали целый отдел SQL программеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2009, 06:13 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
> Если убрать версию, то из чего тогда будет состоять ключ? Обычный суррогатный идентификатор. Версия в ключе не допускает параллельных версий сущности, которые объективно существуют в разных экземплярах базы данных. Ваша реализация предполагает единый независимый генератор версий либо кривые "диапазонные" суррогаты версий для каждого экземпляра базы данных. > Насчет актуальности не выехал Для любой базы данных можно гарантировать актуальность только тех данных, в отношении которых владелец выступает вендором, т. е. самостоятельно их генерирует. У данных всех внешних источников актуальность имеет другую природу. А поскольку невозможно представить себе базу данных без ссылок на внешние данные, то и говорить об актуальности можно очень условно и с кучей оговорок. > Несколько десятков миллиардов томов. Простите за столь категоричную оценку, но ничего глупее не могу себе представить. Базы данных и существуют как альтернатива данным на бумаге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2009, 15:30 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
daunito Вся информация из базы хранилась на бумаге в архивах в 3 зданиях. Несколько десятков миллиардов томов. Миллиардов? Вы ошибаетесь на несколько (немало) порядков, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2009, 17:24 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
mcureenab, 1. Исправление ошибок вообще не проблема. 2. Самое сложное - изменение именно структуры данных когда меняется n-арность отношений (был атом стал список). Программа должна поддерживать как новую так и старую струтктуру. 3. Хранилище проблему не решает - ведь его стр-ра тоже может меняться во времени - тут скорее проблема только усугубляется. 4. Хранить готовые отчеты конечно можно, но нужен-то новый отчет на старых данных. Такое впечатление, что необходим инструмент встроенный в СУБД, который будет хранить версии БД вместе с версиями софта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2009, 11:10 |
|
||
|
Адекватность данных во времени.......
|
|||
|---|---|---|---|
|
#18+
_мод 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 - по вкусу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2009, 11:51 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35828650&tid=1543381]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 496ms |

| 0 / 0 |
