powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Путешествия в прошлое
25 сообщений из 121, страница 3 из 5
Путешествия в прошлое
    #38751345
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинArm79пропущено...


Да ну, не все так плохо.
select top 1 from (select from history union select from source) t where t.last_update >= @date order by date desc

Смысл тогда разделять на 2 таблицы, если в каждом запросе делать union?
Ну не все же запросы требуют историчности. Если все, тогда смысла в двух таблицах нет, согласен.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751348
prog123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Вы про область применения ничего не сказали. Допустим есть абсолютно полная история абсолютно всего, - что дальше?!
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751350
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prog123Сами себе противоречите, - если ничего не менялось, нафига копировать?
противоречия нет: в первом случае я говорил, чтобы на каждый чих копировать все взаимосвязанные сущности (включая и те, которые не менялись). В во втором - в историю уходят только измененные записи одной сущности. Это не так затратно. Хотя логика выборки будет посложнее.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751355
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Вопрос сформулирован некорректно. Все элементы в БД в любой момент времени должны находиться в согласованном состоянии. Так что в общем случае при ведении истории для ВСЕЙ БД нужно при любом изменении любой сущности делать копию всех остальных связанных сущностей. Соответственно, решение ужасно затратное как по дисковому пространству, так и по производительности.

Как раз не вижу причин делать копию всех связанных сущностей. Достаточно иметь прозрачный идентификатор.

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

Исключено. Все операции с данными производятся на стороне приложения в слое доступа к данным.

Arm79В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц.

Да, придётся вести копии изменённых данных в исторической таблице, прозрачный ИД и пару дат актуальности (от сих, до сих). Усложняются выборки зависимых данных. Ещё более усложняются выборки отчётных данных, с расчётами. Вот как раз сейчас оцениваем сложность. Время и финансирование конечно есть, но и они имеют свои пределы. Если слишком сложно, надо искать другой путь.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751369
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77* связи идут по сквозному ИД, а конкретная редакция сведений достается по результатам расчета текущей даты актуальности -вот тут и требуется оптимизация запросов

Если есть пара дат, то запрос достаточно тривиальный.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751371
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUyЯ помню, что в книге http://www.ozon.ru/context/detail/id/2808650/ в одной из последних глав рассматривается теория - как спроектировать БД с возможностью ретроспективы и есть примеры на Cache. Почитайте, если найдете, может, увидите что-то для себя полезное.

Спасибо за наводку, гляну.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751375
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttguest_20040621> Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична

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

Ну хорошо, давайте рассмотрим такой вариант. В приложении есть кнопка "Ретроспектива". Как решить задачу по нажатию на кнопку? Где-то в подвале загорается красная лампочка и бригада админов начинает интенсивно шевелиться?

При нажатии на кнопку выпадает менюшка "Ретроспектива - на вчера, на позавчера, на неделю назад, на начало месяца, на начало квартала",
в зависимости от выбора приложение переключается на одну из пяти заранее развернутых баз.
С заказчиком надо говорить на уровне цифр - " приложение со срезом на текущий момент - разработать и поддерживать стоит N,
с 5 заранее обговоренными срезами - 1,5*N, со срезом на любую дату - 10*N. Выбирайте".
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751380
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvanoВ БД куча других объектов, в том числе и реализующих прикладную логику.

За прикладную логику в БД у нас бьют по рукам. Обоснование должно быть такое, что по-другому просто ну никак. Пока таких случаев не было.

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

Поэтому алгоритмы расчётов не меняются, а создаются новые.

anvanoТо есть кроме ретроспективного хранения данных придется еще хранить все изменения КОДА базы данных, реализующего бизнес логику. Включая ошибки, да. Ибо какая-то ошибка в коде могла приводить к совершенно другим результатам каких-то расчетов. Вы же хотите увидеть именно те результаты, которые видели вчера? А не те, которые отображаются сегодня после исправления этой ошибки?

База данных хранит данные, поэтому ретроспектива касается только хранения данных. Гораздо большая проблема в миграциях при возникающих доработках, это может сломать всю ретроспективу.

anvanoА еще логика бывает не только в БД зашита, а еще и в клиентском ПО, то есть надо еще и клиентское ПО брать соответствующей версии, чтобы увидеть в точности то, что вывидели "вчера".

Логика в БД -- моветон. На счёт версий согласен. С ретроспективой дальнейшая разработка может сильно усложнится. Может в конце концов придётся отказаться от этой затеи, но надо получить соответствующий опыт. По крайне мере это всё оплачивается
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751381
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли есть пара дат, то запрос достаточно тривиальный.
это один из способов организации даты актуальности, но его минус в том, что надо всегда находит предыдущую запись и закрывать в ней конечную дату актуальности - следовательно при массированной вставке записей будет работать медленней
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prog123hVostt,

Вы про область применения ничего не сказали. Допустим есть абсолютно полная история абсолютно всего, - что дальше?!

Область применения чего? Если интересно что это за приложение, это довольно таки сложный CRM. Просмотр ретроспективы нужен клиенту. Эту функциональность УЖЕ продали за большие деньги. Теперь надо делать
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751385
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77это один из способов организации даты актуальности, но его минус в том, что надо всегда находит предыдущую запись и закрывать в ней конечную дату актуальности - следовательно при массированной вставке записей будет работать медленней

Массивные операции с данными исключены. С системой работают только люди. Если в компанию наберут толпу китайцев, которые будут колбасить в режиме Batch, тогда это означает, что компания много работает, ещё больше зарабатывает, можно и серверов воткнуть.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751393
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКак раз не вижу причин делать копию всех связанных сущностей.
я тоже.
hVosttИсключено. Все операции с данными производятся на стороне приложения в слое доступа к данным.
Увы, не исключено. По опыту - если нужна высокая скорость работы с БД, то логика должна быть в БД. Тяжелые ORM только замедляют работу, хотя дают удобство. Как минимум, устраняются затраты на пересылку данных по сети.

hVosttДа, придётся вести копии изменённых данных в исторической таблице, прозрачный ИД и пару дат актуальности (от сих, до сих). Усложняются выборки зависимых данных. Ещё более усложняются выборки отчётных данных, с расчётами. Вот как раз сейчас оцениваем сложность. Время и финансирование конечно есть, но и они имеют свои пределы. Если слишком сложно, надо искать другой путь.
Не спорю. Вопрос оптимизации. Вот Кот Матроскин дал пример денормализующей оптимизации - иметь два типа запроса - один в актуальную часть, второй - в историю.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751424
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИсключено. Все операции с данными производятся на стороне приложения в слое доступа к данным.
мой вариант подходит под это: репозиторий, метод сохранения например, туда передается экземпляр сущности с новыми данными - метод ищет предыдущую запись - закрывает в ней конечную дату актуальности, вставляет новую, одна транзакция, с многопоточностью - надо знать требования и думать

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

джоины да, станут сложнее, условия по дате актуальности в джоине должны всегда выдавать одну зависимую запись, соответственно, если за день может быть несколько новых редакций - надо с учетом времени, с оптимизациями по скорости - попробовать перевести на int/long тики

не уверен что ORM переварит такие запросы самостоятельно и на раз-два-три, надо курить документацию

если в редакции сведений есть ссылка на другую сущность с историей - надо прописывать основной (сквозной) ИД той другой сущности, а не на ИД какой либо ее редакции, иначе будет фантомное движение в прошлое/будущее при переходе по этой связи
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751426
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Увы, не исключено. По опыту - если нужна высокая скорость работы с БД, то логика должна быть в БД. Тяжелые ORM только замедляют работу, хотя дают удобство. Как минимум, устраняются затраты на пересылку данных по сети.

Не согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751439
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНе согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям.
По опыту своей работы - полностью поддерживаю hVostt. Еще Карл Маркс писал, что прогресс невозможен без разделения труда. Уж не знаю, насколько это справедливо с точки зрения исторического материализма, но вот в программировании этот принцип работает на 99% (не пишу 100, чтобы какой-нибудь буквоед и зануда не прицепился с каким-то сугубо частным примером, бывают любители).
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751443
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77мой вариант подходит под это: репозиторий, метод сохранения например, туда передается экземпляр сущности с новыми данными - метод ищет предыдущую запись - закрывает в ней конечную дату актуальности, вставляет новую, одна транзакция, с многопоточностью - надо знать требования и думать

Да, этим будет заниматься репозиторий. Скорее всего реализаций репозитория будет 2. Один для живых данных, другой для ретроспективы. В терминах СУБД, это похоже на две разных вьюхи (хотя не совсем так).


17-77ну от этой сложности можно абстрагироваться - выделив ее в отдельный слой, который с одной стороны потребляет БД, а с другой стороны отдает базу как будто она без истории

Вот это было бы идеально, к этому стремимся.

17-77джоины да, станут сложнее, условия по дате актуальности в джоине должны всегда выдавать одну зависимую запись, соответственно, если за день может быть несколько новых редакций - надо с учетом времени, с оптимизациями по скорости - попробовать перевести на int/long тики

Думаете, int/long ощутимо улучшат ситуацию по сравнению с датами?

17-77не уверен что ORM переварит такие запросы самостоятельно и на раз-два-три, надо курить документацию

С ORM как-нибудь справимся :) Чего-то только мы из него не выжимали, в противовес всем заявлениям, что дескать ORM медленный. Это далеко не так.


17-77если в редакции сведений есть ссылка на другую сущность с историей - надо прописывать основной (сквозной) ИД той другой сущности, а не на ИД какой либо ее редакции, иначе будет фантомное движение в прошлое/будущее при переходе по этой связи

Это можно заложить в архитектуру базовой таблицы (набор полей, которым обладают все таблицы, в программной реализации это выражено как базовый класс в иерархии). Вручную SQL практически не пишем, стараемся этого избегать.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751458
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДа, этим будет заниматься репозиторий. Скорее всего реализаций репозитория будет 2. Один для живых данных, другой для ретроспективы. В терминах СУБД, это похоже на две разных вьюхи (хотя не совсем так).
ну так тоже можно, в моем случае юзер вносил дату актуальности в виде фильтра и постоянно перескакивал с одной на другую, поэтому хранить в отдельных таблицах, объединять и т.п. - тогда все это на мой взгляд было лишним усложнением

hVosttДумаете, int/long ощутимо улучшат ситуацию по сравнению с датами?
предположение, я не лазил глубоко в особенности СУБД
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751461
prog123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EvLaUyhVosttНе согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям.
По опыту своей работы - полностью поддерживаю hVostt. Еще Карл Маркс писал, что прогресс невозможен без разделения труда. Уж не знаю, насколько это справедливо с точки зрения исторического материализма, но вот в программировании этот принцип работает на 99% (не пишу 100, чтобы какой-нибудь буквоед и зануда не прицепился с каким-то сугубо частным примером , бывают любители).

Дык у фирмы 1С все свалено в одну большую кучу дерьмища, у них не каждый релиз их же программы свою базу открыть сможет:) , но это не помешало им растиражировать свою программу.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751470
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prog123Дык у фирмы 1С все свалено в одну большую кучу дерьмища, у них не каждый релиз их же программы свою базу открыть сможет:) , но это не помешало им растиражировать свою программу.

это называется ма́́ркетинг
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751478
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин Это означает, грубо говоря, держать две копии всех запросов - "с историческими таблицами" и "без исторических таблиц", поскольку вариативность во FROM поддерживается достаточно плохо.
Смотря кем. Плохо она поддерживается только в СУБД. Если запросы идут с аппсервера или с клиента, "вариативность во from" поддерживается просто на ура.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751795
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> При нажатии на кнопку выпадает менюшка "Ретроспектива - на вчера, на позавчера, на неделю назад

:) Спасибо, Кот, это пять.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751871
soulsurfer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужен встроенный в СУБД Git чтоли?
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751891
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt Ну хорошо, давайте рассмотрим такой вариант. В приложении есть кнопка "Ретроспектива". Как решить задачу по нажатию на кнопку?Запускается скрипт/процедура по восстановлению исторической базы на время заданное пользователем. После чего происходит переконнент на эту базу.
Проблема в том, что восстановление может занимать заметное время (минуты/часы) - какой объем вашей базы?
Также надо будет разобраться с протоколом - если историческая база используется, то один из вас будет обломан.
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751937
Фотография DormidontLoewe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗдравствуйте!

Интересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов, естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных.

При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных.

Смотри здесь.
http://en.wikipedia.org/wiki/Temporal_database
...
Рейтинг: 0 / 0
Путешествия в прошлое
    #38751985
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
soulsurferВам нужен встроенный в СУБД Git чтоли?

Ну типа.
...
Рейтинг: 0 / 0
25 сообщений из 121, страница 3 из 5
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Путешествия в прошлое
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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