|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Нужно организовать ведение истории для некоторых данных...Например, есть таблица в полями ФАМИЛИЯ, ИМЯ. Потом человек меняет фамилию и это должно быть учтено в БД....и это нужно сделать для многих других данных (для многих таблиц). В последствии работа ведется как обычно с новыми данными, но должна быть возможность получить старые данные..... Как это обычно делают? Как нужно для этого организовывать таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2003, 18:35 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Если в обязательном порядке нужно хранить всю историю изменений - имхо, проще под это дело завести отдельные таблицы. Другой вопрос, как идентифицировать измененный объект - скажем, изменил человек фамилию, (но человек-то остался тот же), это дело забили где-то в отделе кадров и все эти изменения должны расползстись по всей системе. Тут два пути решения есть - либо навешивать каскадные обновления (что может быть весьма геморройно в сколь-нибудь большой системе), либо заводить уникальный номер, который принадлежит одному человеку и никогда не меняется. Тогда данные об актуальном ФИО запрашиваются по id. Если нужна история изменения - то запрашивается она. Второй путь, понятно дело, мне нравится гораздо больше. Может еще какие пути решения есть, но тода вам о них расскажет кто-то другой... ;о) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2003, 19:06 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
http://www.msaccess.ru/Raznoe_BigPrgOriginal.html Не смотрите, что про Акцесс - в данной статье предложен довольно универсальный принцип построения справочников ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2003, 21:03 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Прошелся по ссылке. В общем-то неплохая статья. Проблемы Автора с первичными ключами скорее всего возникли из-за ссылочной целостности. Действительно, нельзя переопределить индекс, если по нему есть внешние ключи. Про справочники - толково. Про проблему "отрицательных остатков" - бред. Возникший из-за подхода Автора к Складу, как к Бухгалтерии. Журналы, регистры и пр. - на мой взгляд, то же бред. Нельзя описывать базу бухгалтерскими терминами. Но надо уметь показать базу бухгалтеру - в его терминах. Кладовщику - в его. Экономисту - в его. Мозги Автора внушают доверие. О событийной ориентированности Додумался-таки о необходимости формализации параметров. Но не дошел до того, что критические параметры надо показывать в режиме реального времени, а не при пересчете каких-то сводных таблиц. От которых надо стараться убегать. Самое главное - мне показалось, что Автор слабо знаком с теорией проектирования баз данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2003, 23:02 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
можно создать дополнительные таблицы так называемые логи, куда писать дату изменения, ID объекта и новое значение. А заполнение этих таблиц повесить на триггеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 12:11 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Привет всем! Наконец-то появилась достаточно абстрактная (а то учет уже надоел, мне по-крайней мере), интересная и полезная тема, применимая ко многим областям :) 2 manumba: Нужно организовать ведение истории для некоторых данных...Например, есть таблица в полями ФАМИЛИЯ, ИМЯ. Потом человек меняет фамилию и это должно быть учтено в БД....и это нужно сделать для многих других данных (для многих таблиц). В последствии работа ведется как обычно с новыми данными, но должна быть возможность получить старые данные..... Как это обычно делают? Как нужно для этого организовывать таблицы? Да - отдельные таблицы под старые и под новые данные . По-крайней мере такое у меня было в опыте пару раз так и делали, модель удовлетворила всех и прекрасно работает до сих пор. Так что полностью согласен Циничным Котом, но только IMHO 2-й путь НЕ лучше - он единственно возможный , т.е уникальный ИД на всю жизнь, а каскадные изменения - это только способ обеспечения пользовательской целостности в масшатабах всей системы - тоже отдельная подтема. В 1-м варианте можно хранить исторические данные и кто их записал. Во 2-м варианте - также и что(какие атрибуты), но это уже посложнее. Если 1-й вариант вариант, то как это можно реализовать в общих чертах: Сущность Текущие Данные - это текущие, самые последние данные о лице: Код: plaintext 1. 2. 3.
Сущность Исторические Данные - это все исторические данные о лице, т.е все измения фактов или записей в таблице Текущие Данные : Код: plaintext 1. 2. 3. 4.
Примечания: * Вместо суррогатного ключа ИД_Записи в Исторические Данные можно также использовать натуральный композитный ключ например (ИД_Лица, ДатаИзмения,...) * Вместо ИД_Пользователя, меняющего записи может быть ИД_Сотрудника Т.е логика такова - при очередном изменении строка из Текущие Данные с помощью триггера переносится в таблицу Исторические Данные , при этом триггер сначала проверяет, что хотя бы один столбец изменил значение ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 16:17 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
А где граница между "историческими" данными и "неисторическими". Вот остаток на счете это "историческое" данное ? А курс ? Тоже хранить в основной таблице только текущее значение, а историю в отдельной ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 17:12 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Да, наверное придется делать для каждой таблицы (для которой нужно вести историю) - дубликат.... Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 18:25 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
ф> Остаток на счете - не "историческое", а текущее значение. А вот динамика движения средств на счете и курс - "исторические" =========== Один ID навсегда - это даже не дискутируется. ========== Я недавно базу писал - учет оплаты электроэнергии населением. Во, блин, "историй" было. На каждой квартире - история квартиросъемщиков. На каждом квартиросъемщике - история изменения льгот. На каждую льготу - история методов ее расчета. Плюс история изменения тарифов. Само собой - история оплат. Хотя, конечно, это не история, а Главная табла. На каждом квартире - история замены счетчиков. История проверок счетчиков. История сверок расчетов. История проверок счетчиков. И все отчеты нужны на любой месяц. К счастью, не на любую дату. Все пришлось сделать через таблы с граничными параметрами. Т.е хранились только даты изменения параметров и сами параметры. Из прЫнципа ничего не денормализовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 19:43 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
ф> Остаток на счете - не "историческое", а текущее значение. А вот динамика движения средств на счете и курс - "исторические" =========== Один ID навсегда - это даже не дискутируется. ========== Я недавно базу писал - учет оплаты электроэнергии населением. Во, блин, "историй" было. На каждой квартире - история квартиросъемщиков. На каждом квартиросъемщике - история изменения льгот. На каждую льготу - история методов ее расчета. Плюс история изменения тарифов. Само собой - история оплат. Хотя, конечно, это не история, а Главная табла. На каждом квартире - история замены счетчиков. История проверок счетчиков. История сверок расчетов. История проверок счетчиков. И все отчеты нужны на любой месяц. К счастью, не на любую дату. Все пришлось сделать через таблы с граничными параметрами. Т.е хранились только даты изменения параметров и сами параметры. Из прЫнципа ничего не денормализовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2003, 19:43 |
|
Ведение истории для данных.....
|
|||
---|---|---|---|
#18+
Подобная задача более характерна для хранилищ данных (Data Warehouses). И это - правильно, т.к. транзакционная система должна обеспечивать оперативный учет. Но, создание DW - не всегда оправдано, дорого и т.п. Тем не менее, есть варианты такого рода (все зависит от исходных предпосылок): 1. Модернизировать существующую БД. 2. Создать архивную БД для хранения исторических значений. Для варианта 2, естественно, никаких ограничений по глубине истории не должно быть (разве что наложены искусственно), т.е. те самые таблицы истории. Выгода - любые запросы к этой БД практически не влияют на работу оперативной системы, БД может располагаться на другом сервере или даже на другой платформе. Для варианта 1 два пути: -- в теле БД создать архивную, т.е. совместить в. 2 с оперативной БД. Вроде - все хорошо, но возникнут проблемы с производительностью, т.к., возможно, запросы к историческим данным могут быть очень ресурсоемкими и будут тормоза при штаной обработке транзакций (insert, update). -- если глубина исторических значений ограничена несколькими значениями и используется не слишком часто, то добавляются поля в нужные таблицы: - OldValue1 - DataChange1 ::: - OldValueN - DataChangeN ЗЫ Все, естественно, определяется индивидуальными предпосылками и конечными (решаемыми) задачами. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2003, 09:54 |
|
|
start [/forum/topic.php?fid=32&fpage=182&tid=1547000]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 235ms |
total: | 360ms |
0 / 0 |