|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
Добрый день Товарищи! Скажите пожалуйста, при проектировании такой БД: Есть Объект , есть Владелец Объекта и есть Отчёт по Объекту . Как сделать, чтобы при смене у Объекта его Владельца : В базе бы сохранялось для Отчётов по Объекту , ну или для других связей с Объектом на данный момент, что его Владелец такой-то? Т.е. при построении Отчёта за период когда был другой Владелец , чтобы это было отражено. Предварительно есть несколько вариантов, как это реализовывать, но чтобы не наступать на грабли, хочу свериться с теми, кто знает верное решение :) Код: 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.
Ещё что-то в голову приходило. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 12:59 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormot, если Report хранит состояние объекта на определённую дату, то вариант 2 то есть вы будете хранить тупо факт того, что было в определённый момент времени ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 13:22 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
skyANA, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 13:41 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormot, ИМХО, второй вариант имеет проблемы с целостностью данных. Нет идеи как построить внешний ключ? У меня нет. В конце концов проблема всплывёт. Ну и предложение. Сделать таблицу "История Владельцев Объекта", где будет дата. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 15:31 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
KreatorXXIИМХО, второй вариант имеет проблемы с целостностью данных. Нет идеи как построить внешний ключ? У меня нет. В конце концов проблема всплывёт. Ну и предложение. Сделать таблицу "История Владельцев Объекта", где будет дата. А проблемы с целлостностью почему? Т.к. могут быть у отчёта (objID,ownID) такие, которые на самом деле между собой не связаны? А в первом варианте, там как раз промежуточная таблица - это история связей между Владельцем и Объектом, и на эту связь делается у отчёта ключ, это в плане целостности имеет проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 19:21 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormot, Если отчет включает несколько смен объектом владельца, как будете собирать что включать в отчет а что нет? Отчет за период, а где даты в ваших вариантах? Оба ваших варианта неправильные, вот вам пара других вариантов: Сначала плохой - можно в OwnerObject добавить поля date_from и date_to, date_from - дата создания записи, date_to - для действующей записи константа например 01.01.4000 года (или какого нибудь другого сильно далекого года), когда у объекта меняется владелец старая запись закрывается присваиванием в date_to текущей даты, при этом date_from новой действующей записи должна быть равна date_to предыдущей плюс минимальный квант времени, для типа дата это скорее всего будет секунда (если будет несколько изменений в одну секунду будут проблемы:)). Нормальный вариант - создать таблицу OwnerObjectHist, при изменении владельца объекта, старое состояние вставляется в таблицу истории изменений с датой до которой оно действовало, в OwnerObject текущее действующее состояние, естественно в таблице OwnerObjectHist свой id со своей последовательностью и внешний ключ на таблицу OwnerObject. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 19:31 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormotА проблемы с целлостностью почему? Потому что вы не то протоколировать собираетесь, протоколировать нужно "первичку". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 19:33 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
iOracleDevЕсли отчет включает несколько смен объектом владельца, как будете собирать что включать в отчет а что нет? Ну, тут подразумевается, что смена владельца она очень нечастая. И отчёт строится и его результаты полученные на отчётный момент сохраняются, высчитывать их потом из первички не надо. Там сам отчёт формируемый к отчётному периоду и есть первичка. Т.е. условно заполняются поля отчёта на указанный период и когда отчёт закрывается, то все его заполнения и есть отчёт. И соответственно если у данного отчёта за указанный (repPeriod) период связь с данным ownID - то нас в будущем вполне устраивает по заданному объекту получиться все отчёты с результатами, и в каждый период достаточно знать кто является владельцем данного отчёта. Жесть как сложно написал. Масло маслом намазал и ещё маслица сверху добавил :) По поводу добавления данных о временном периоде "владения" тем или иным объектом - эта информация не интересует. Главное в отчёте за данный период чтобы была информация кто владелец (связь отчёта по objOwnID например), и для заполнения текущих отчётов по объектам у владельца (это запись objID,ownID с isActive=1 в OwnerObject) Второй предложенный вариант - он интересен, только я детали некоторые не понял. В итоге отчёт каждый должен ссылаться на запись в OwnerObjectHist или на OwnerObject? Вроде в таком случае таблица OwnerObject - лишняя? Зачем она? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 20:53 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormotЖесть как сложно написал. Масло маслом намазал и ещё маслица сверху добавил :) Не то слово. kormotПо поводу добавления данных о временном периоде "владения" тем или иным объектом - эта информация не интересует. Главное в отчёте за данный период чтобы была информация кто владелец (связь отчёта по objOwnID например), и для заполнения текущих отчётов по объектам у владельца (это запись objID,ownID с isActive=1 в OwnerObject) У тебя таблица OwnerObject лишняя, выкинь ее вообще или как минимум выброси из нее isActive, в отчет помещай не ссылку на нее, а просто objID и ownID. kormotВторой предложенный вариант - он интересен, только я детали некоторые не понял. В итоге отчёт каждый должен ссылаться на запись в OwnerObjectHist или на OwnerObject? Вроде в таком случае таблица OwnerObject - лишняя? Зачем она? Текущие актуальные отчеты строятся на основе текущих актуальных данных, они хранятся в операционной таблице, ретроспективные строятся либо на исторической таблице либо на объединении операционной и исторической таблиц, в зависимости от того как вести историческую таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 21:42 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
iOracleDevУ тебя таблица OwnerObject лишняя, выкинь ее вообще или как минимум выброси из нее isActive, в отчет помещай не ссылку на нее, а просто objID и ownID. А выше же, второй вариант изначальный у меня - он же так и есть, отчёты с указанием для каждого objID и ownID, но ниже сказали что он имеет проблемы с целостностью данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 09:04 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormot, ну послушай, всё же просто. В таблице OwnerObject у objID=1 ownID=2. А в таблице Report objID=1 ownID=1. Никакой синхронизации на уровне базы. И не важно часто меняется собственник или не часто. Можно попробовать сделать внешний ключ (OwnerObject<->Report) по двум полям. Тогда база будет целостной. Но опять вопрос - как быть со старыми отчётами? Информация по истории, допустим, хранится, в отдельном файле. Но таблица Report ничего об этом не знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2019, 11:54 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormotИ отчёт строится и его результаты полученные на отчётный момент сохраняются, высчитывать их потом из первички не надо. Под это подходит: "Второй вариант - просто, Владелец - это просто поле для Объекта, а в Отчёте указывать и objID и ownID". На момент построения отчёта вы сохраняете факт того, кто является владельцем объекта. Данные же вы не планируете терять, чтобы через год не понимать, кто был владельцем объекта в прошлом? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 13:01 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
KreatorXXIkormot, ну послушай, всё же просто. В таблице OwnerObject у objID=1 ownID=2. А в таблице Report objID=1 ownID=1. Никакой синхронизации на уровне базы. И не важно часто меняется собственник или не часто. Можно попробовать сделать внешний ключ (OwnerObject<->Report) по двум полям. Тогда база будет целостной. Но опять вопрос - как быть со старыми отчётами? Информация по истории, допустим, хранится, в отдельном файле. Но таблица Report ничего об этом не знает. Какая ещё синхронизации на уровне базы, целостность? Отчёты должны содержать информацию о том, что в прошлом отчётном периоде владелец объекта был иной, чем в текущем. Вариант хранить ownID в Report прекрасно решает эту задачу. И целостность не нарушается, и синхронизация никакая не нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 13:07 |
|
Как реализовать "исторического изменения" объекта в БД
|
|||
---|---|---|---|
#18+
kormotА выше же, второй вариант изначальный у меня - он же так и есть, отчёты с указанием для каждого objID и ownID, но ниже сказали что он имеет проблемы с целостностью данных? Если верить тому что ты озвучил, тебя не интересует история кто когда и сколько владел объектом, грубо говоря OwnerObject используется только как текущая конфигурация и история по ней не сохраняется, проблемы с целостностью в том, что ты не сможешь выпустить отчет за прошлый период, информации о владельцах объектов за тот период просто нет, если по каким то причинам забыли запустить отчет ранее и захотят его получить в настоящий момент он может содержать неверную информацию. Исходя из твоих хотелок второй вариант выглядит вполне подходящим, OwnerObject либо не использовать вообще, либо использовать как конфигурационную текущую настройку, поскольку история изменений тебе на самом деле не нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2019, 14:08 |
|
|
start [/forum/topic.php?fid=32&msg=39860521&tid=1539909]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 445ms |
0 / 0 |