powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как реализовать "исторического изменения" объекта в БД
14 сообщений из 14, страница 1 из 1
Как реализовать "исторического изменения" объекта в БД
    #39860265
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Товарищи!

Скажите пожалуйста, при проектировании такой БД:
Есть Объект , есть Владелец Объекта и есть Отчёт по Объекту .

Как сделать, чтобы при смене у Объекта его Владельца :
В базе бы сохранялось для Отчётов по Объекту , ну или для других связей с Объектом на данный момент, что его Владелец такой-то?

Т.е. при построении Отчёта за период когда был другой Владелец , чтобы это было отражено.

Предварительно есть несколько вариантов, как это реализовывать, но чтобы не наступать на грабли, хочу свериться с теми, кто знает верное решение :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Object (
    id           SERIAL,
    objName      CHAR(50)
)

Owner (
    id           SERIAL,
    ownName      CHAR(50)
)

//1. Первый вариант - хранить просто активную связь Владелец-Объект и в отчётах указатель на данный ключ:
OwnerObject (
    id           SERIAL,
    ownID        BIGINT UNSIGNED,
    objID        BIGINT UNSIGNED,
    /* Для уникального объекта только одна запись с isActive=1, 
       при вставке предыдущие для данного objID устанавливать в 0 */
    isActive     TINYINT UNSIGNED DEFAULT 1, 
) 
Report (
    id           SERIAL,
    objOwnID     BIGINT UNSIGNED -> FK OwnerObject(id),
    repPeriod    DATETIME,
    repData      ......
)

//2. Второй вариант - просто, Владелец - это просто поле для Объекта, а в Отчёте указывать и objID и ownID
Report (
    id           SERIAL,
    objID        BIGINT UNSIGNED,
    ownID        BIGINT UNSIGNED,
    repPeriod    DATETIME,
    repData      ......
)


Ещё что-то в голову приходило.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860278
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

если Report хранит состояние объекта на определённую дату, то вариант 2
то есть вы будете хранить тупо факт того, что было в определённый момент времени
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860307
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, спасибо!
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860371
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

ИМХО, второй вариант имеет проблемы с целостностью данных. Нет идеи как построить внешний ключ? У меня нет. В конце концов проблема всплывёт.
Ну и предложение. Сделать таблицу "История Владельцев Объекта", где будет дата.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860521
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIИМХО, второй вариант имеет проблемы с целостностью данных. Нет идеи как построить внешний ключ? У меня нет. В конце концов проблема всплывёт.
Ну и предложение. Сделать таблицу "История Владельцев Объекта", где будет дата.
А проблемы с целлостностью почему? Т.к. могут быть у отчёта (objID,ownID) такие, которые на самом деле между собой не связаны?

А в первом варианте, там как раз промежуточная таблица - это история связей между Владельцем и Объектом, и на эту связь делается у отчёта ключ, это в плане целостности имеет проблемы?
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860524
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

Если отчет включает несколько смен объектом владельца, как будете собирать что включать в отчет а что нет?

Отчет за период, а где даты в ваших вариантах?

Оба ваших варианта неправильные, вот вам пара других вариантов:

Сначала плохой - можно в OwnerObject добавить
поля date_from и date_to, date_from - дата создания записи, date_to - для действующей записи константа например 01.01.4000 года (или какого нибудь другого сильно далекого года), когда у объекта меняется владелец старая запись закрывается присваиванием в date_to текущей даты, при этом date_from новой действующей записи должна быть равна date_to предыдущей плюс минимальный квант времени, для типа дата это скорее всего будет секунда (если будет несколько изменений в одну секунду будут проблемы:)).

Нормальный вариант - создать таблицу OwnerObjectHist, при изменении владельца объекта, старое состояние вставляется в таблицу истории изменений с датой до которой оно действовало, в OwnerObject текущее действующее состояние, естественно в таблице OwnerObjectHist свой id со своей последовательностью и внешний ключ на таблицу OwnerObject.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860526
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotА проблемы с целлостностью почему?
Потому что вы не то протоколировать собираетесь, протоколировать нужно "первичку".
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860555
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevЕсли отчет включает несколько смен объектом владельца, как будете собирать что включать в отчет а что нет?
Ну, тут подразумевается, что смена владельца она очень нечастая. И отчёт строится и его результаты полученные на отчётный момент сохраняются, высчитывать их потом из первички не надо. Там сам отчёт формируемый к отчётному периоду и есть первичка. Т.е. условно заполняются поля отчёта на указанный период и когда отчёт закрывается, то все его заполнения и есть отчёт.

И соответственно если у данного отчёта за указанный (repPeriod) период связь с данным ownID - то нас в будущем вполне устраивает по заданному объекту получиться все отчёты с результатами, и в каждый период достаточно знать кто является владельцем данного отчёта.

Жесть как сложно написал. Масло маслом намазал и ещё маслица сверху добавил :)

По поводу добавления данных о временном периоде "владения" тем или иным объектом - эта информация не интересует. Главное в отчёте за данный период чтобы была информация кто владелец (связь отчёта по objOwnID например), и для заполнения текущих отчётов по объектам у владельца (это запись objID,ownID с isActive=1 в OwnerObject)


Второй предложенный вариант - он интересен, только я детали некоторые не понял. В итоге отчёт каждый должен ссылаться на запись в OwnerObjectHist или на OwnerObject?
Вроде в таком случае таблица OwnerObject - лишняя? Зачем она?
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860569
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotЖесть как сложно написал. Масло маслом намазал и ещё маслица сверху добавил :)
Не то слово.

kormotПо поводу добавления данных о временном периоде "владения" тем или иным объектом - эта информация не интересует. Главное в отчёте за данный период чтобы была информация кто владелец (связь отчёта по objOwnID например), и для заполнения текущих отчётов по объектам у владельца (это запись objID,ownID с isActive=1 в OwnerObject)
У тебя таблица OwnerObject лишняя, выкинь ее вообще или как минимум выброси из нее isActive, в отчет помещай не ссылку на нее, а просто objID и ownID.

kormotВторой предложенный вариант - он интересен, только я детали некоторые не понял. В итоге отчёт каждый должен ссылаться на запись в OwnerObjectHist или на OwnerObject?
Вроде в таком случае таблица OwnerObject - лишняя? Зачем она?
Текущие актуальные отчеты строятся на основе текущих актуальных данных, они хранятся в операционной таблице, ретроспективные строятся либо на исторической таблице либо на объединении операционной и исторической таблиц, в зависимости от того как вести историческую таблицу.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860696
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevУ тебя таблица OwnerObject лишняя, выкинь ее вообще или как минимум выброси из нее isActive, в отчет помещай не ссылку на нее, а просто objID и ownID.
А выше же, второй вариант изначальный у меня - он же так и есть, отчёты с указанием для каждого objID и ownID, но ниже сказали что он имеет проблемы с целостностью данных?
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39860801
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

ну послушай, всё же просто. В таблице OwnerObject у objID=1 ownID=2. А в таблице Report objID=1 ownID=1. Никакой синхронизации на уровне базы. И не важно часто меняется собственник или не часто. Можно попробовать сделать внешний ключ (OwnerObject<->Report) по двум полям. Тогда база будет целостной. Но опять вопрос - как быть со старыми отчётами? Информация по истории, допустим, хранится, в отдельном файле. Но таблица Report ничего об этом не знает.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39861467
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotИ отчёт строится и его результаты полученные на отчётный момент сохраняются, высчитывать их потом из первички не надо.
Под это подходит: "Второй вариант - просто, Владелец - это просто поле для Объекта, а в Отчёте указывать и objID и ownID".

На момент построения отчёта вы сохраняете факт того, кто является владельцем объекта.
Данные же вы не планируете терять, чтобы через год не понимать, кто был владельцем объекта в прошлом? :)
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39861470
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIkormot,

ну послушай, всё же просто. В таблице OwnerObject у objID=1 ownID=2. А в таблице Report objID=1 ownID=1. Никакой синхронизации на уровне базы. И не важно часто меняется собственник или не часто. Можно попробовать сделать внешний ключ (OwnerObject<->Report) по двум полям. Тогда база будет целостной. Но опять вопрос - как быть со старыми отчётами? Информация по истории, допустим, хранится, в отдельном файле. Но таблица Report ничего об этом не знает.
Какая ещё синхронизации на уровне базы, целостность?

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

И целостность не нарушается, и синхронизация никакая не нужна.
...
Рейтинг: 0 / 0
Как реализовать "исторического изменения" объекта в БД
    #39861534
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotА выше же, второй вариант изначальный у меня - он же так и есть, отчёты с указанием для каждого objID и ownID, но ниже сказали что он имеет проблемы с целостностью данных?
Если верить тому что ты озвучил, тебя не интересует история кто когда и сколько владел объектом, грубо говоря OwnerObject используется только как текущая конфигурация и история по ней не сохраняется, проблемы с целостностью в том, что ты не сможешь выпустить отчет за прошлый период, информации о владельцах объектов за тот период просто нет, если по каким то причинам забыли запустить отчет ранее и захотят его получить в настоящий момент он может содержать неверную информацию. Исходя из твоих хотелок второй вариант выглядит вполне подходящим, OwnerObject либо не использовать вообще, либо использовать как конфигурационную текущую настройку, поскольку история изменений тебе на самом деле не нужна.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как реализовать "исторического изменения" объекта в БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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