|
|
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинArm79пропущено... Да ну, не все так плохо. select top 1 from (select from history union select from source) t where t.last_update >= @date order by date desc Смысл тогда разделять на 2 таблицы, если в каждом запросе делать union? Ну не все же запросы требуют историчности. Если все, тогда смысла в двух таблицах нет, согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:53 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt, Вы про область применения ничего не сказали. Допустим есть абсолютно полная история абсолютно всего, - что дальше?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:54 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123Сами себе противоречите, - если ничего не менялось, нафига копировать? противоречия нет: в первом случае я говорил, чтобы на каждый чих копировать все взаимосвязанные сущности (включая и те, которые не менялись). В во втором - в историю уходят только измененные записи одной сущности. Это не так затратно. Хотя логика выборки будет посложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:55 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Arm79Вопрос сформулирован некорректно. Все элементы в БД в любой момент времени должны находиться в согласованном состоянии. Так что в общем случае при ведении истории для ВСЕЙ БД нужно при любом изменении любой сущности делать копию всех остальных связанных сущностей. Соответственно, решение ужасно затратное как по дисковому пространству, так и по производительности. Как раз не вижу причин делать копию всех связанных сущностей. Достаточно иметь прозрачный идентификатор. Arm79Для начала, чем не устраивает решение иметь таблицу истории для каждой сущности отдельно и делать, как уже упоминалось выше по топику, на каждый делете/апдейт копирование удаленных записей в триггере в историческую таблицу? Исключено. Все операции с данными производятся на стороне приложения в слое доступа к данным. Arm79В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц. Да, придётся вести копии изменённых данных в исторической таблице, прозрачный ИД и пару дат актуальности (от сих, до сих). Усложняются выборки зависимых данных. Ещё более усложняются выборки отчётных данных, с расчётами. Вот как раз сейчас оцениваем сложность. Время и финансирование конечно есть, но и они имеют свои пределы. Если слишком сложно, надо искать другой путь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:59 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
17-77* связи идут по сквозному ИД, а конкретная редакция сведений достается по результатам расчета текущей даты актуальности -вот тут и требуется оптимизация запросов Если есть пара дат, то запрос достаточно тривиальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:08 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
EvLaUyЯ помню, что в книге http://www.ozon.ru/context/detail/id/2808650/ в одной из последних глав рассматривается теория - как спроектировать БД с возможностью ретроспективы и есть примеры на Cache. Почитайте, если найдете, может, увидите что-то для себя полезное. Спасибо за наводку, гляну. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:09 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttguest_20040621> Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична Тогда вы фигней занимаетесь. Держите нужное количество архивных копий, это будет на порядки дешевле редизайна и поддержки. Ну хорошо, давайте рассмотрим такой вариант. В приложении есть кнопка "Ретроспектива". Как решить задачу по нажатию на кнопку? Где-то в подвале загорается красная лампочка и бригада админов начинает интенсивно шевелиться? При нажатии на кнопку выпадает менюшка "Ретроспектива - на вчера, на позавчера, на неделю назад, на начало месяца, на начало квартала", в зависимости от выбора приложение переключается на одну из пяти заранее развернутых баз. С заказчиком надо говорить на уровне цифр - " приложение со срезом на текущий момент - разработать и поддерживать стоит N, с 5 заранее обговоренными срезами - 1,5*N, со срезом на любую дату - 10*N. Выбирайте". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:12 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoВ БД куча других объектов, в том числе и реализующих прикладную логику. За прикладную логику в БД у нас бьют по рукам. Обоснование должно быть такое, что по-другому просто ну никак. Пока таких случаев не было. anvanoИногда при доработках вообще меняются алгоритмы расчета тех или иных величин, то есть на одних и тех же исходных данных, лежащих в таблице вчера выдавалось одно расчитываемое значение, а сегодня выдаётся другое. Поэтому алгоритмы расчётов не меняются, а создаются новые. anvanoТо есть кроме ретроспективного хранения данных придется еще хранить все изменения КОДА базы данных, реализующего бизнес логику. Включая ошибки, да. Ибо какая-то ошибка в коде могла приводить к совершенно другим результатам каких-то расчетов. Вы же хотите увидеть именно те результаты, которые видели вчера? А не те, которые отображаются сегодня после исправления этой ошибки? База данных хранит данные, поэтому ретроспектива касается только хранения данных. Гораздо большая проблема в миграциях при возникающих доработках, это может сломать всю ретроспективу. anvanoА еще логика бывает не только в БД зашита, а еще и в клиентском ПО, то есть надо еще и клиентское ПО брать соответствующей версии, чтобы увидеть в точности то, что вывидели "вчера". Логика в БД -- моветон. На счёт версий согласен. С ретроспективой дальнейшая разработка может сильно усложнится. Может в конце концов придётся отказаться от этой затеи, но надо получить соответствующий опыт. По крайне мере это всё оплачивается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:15 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttЕсли есть пара дат, то запрос достаточно тривиальный. это один из способов организации даты актуальности, но его минус в том, что надо всегда находит предыдущую запись и закрывать в ней конечную дату актуальности - следовательно при массированной вставке записей будет работать медленней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:16 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123hVostt, Вы про область применения ничего не сказали. Допустим есть абсолютно полная история абсолютно всего, - что дальше?! Область применения чего? Если интересно что это за приложение, это довольно таки сложный CRM. Просмотр ретроспективы нужен клиенту. Эту функциональность УЖЕ продали за большие деньги. Теперь надо делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
17-77это один из способов организации даты актуальности, но его минус в том, что надо всегда находит предыдущую запись и закрывать в ней конечную дату актуальности - следовательно при массированной вставке записей будет работать медленней Массивные операции с данными исключены. С системой работают только люди. Если в компанию наберут толпу китайцев, которые будут колбасить в режиме Batch, тогда это означает, что компания много работает, ещё больше зарабатывает, можно и серверов воткнуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:18 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttКак раз не вижу причин делать копию всех связанных сущностей. я тоже. hVosttИсключено. Все операции с данными производятся на стороне приложения в слое доступа к данным. Увы, не исключено. По опыту - если нужна высокая скорость работы с БД, то логика должна быть в БД. Тяжелые ORM только замедляют работу, хотя дают удобство. Как минимум, устраняются затраты на пересылку данных по сети. hVosttДа, придётся вести копии изменённых данных в исторической таблице, прозрачный ИД и пару дат актуальности (от сих, до сих). Усложняются выборки зависимых данных. Ещё более усложняются выборки отчётных данных, с расчётами. Вот как раз сейчас оцениваем сложность. Время и финансирование конечно есть, но и они имеют свои пределы. Если слишком сложно, надо искать другой путь. Не спорю. Вопрос оптимизации. Вот Кот Матроскин дал пример денормализующей оптимизации - иметь два типа запроса - один в актуальную часть, второй - в историю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:22 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttИсключено. Все операции с данными производятся на стороне приложения в слое доступа к данным. мой вариант подходит под это: репозиторий, метод сохранения например, туда передается экземпляр сущности с новыми данными - метод ищет предыдущую запись - закрывает в ней конечную дату актуальности, вставляет новую, одна транзакция, с многопоточностью - надо знать требования и думать hVosttДа, придётся вести копии изменённых данных в исторической таблице, прозрачный ИД и пару дат актуальности (от сих, до сих). Усложняются выборки зависимых данных. Ещё более усложняются выборки отчётных данных, с расчётами. Вот как раз сейчас оцениваем сложность. Время и финансирование конечно есть, но и они имеют свои пределы. Если слишком сложно, надо искать другой путь. ну от этой сложности можно абстрагироваться - выделив ее в отдельный слой, который с одной стороны потребляет БД, а с другой стороны отдает базу как будто она без истории джоины да, станут сложнее, условия по дате актуальности в джоине должны всегда выдавать одну зависимую запись, соответственно, если за день может быть несколько новых редакций - надо с учетом времени, с оптимизациями по скорости - попробовать перевести на int/long тики не уверен что ORM переварит такие запросы самостоятельно и на раз-два-три, надо курить документацию если в редакции сведений есть ссылка на другую сущность с историей - надо прописывать основной (сквозной) ИД той другой сущности, а не на ИД какой либо ее редакции, иначе будет фантомное движение в прошлое/будущее при переходе по этой связи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:49 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Arm79Увы, не исключено. По опыту - если нужна высокая скорость работы с БД, то логика должна быть в БД. Тяжелые ORM только замедляют работу, хотя дают удобство. Как минимум, устраняются затраты на пересылку данных по сети. Не согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 12:51 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttНе согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям. По опыту своей работы - полностью поддерживаю hVostt. Еще Карл Маркс писал, что прогресс невозможен без разделения труда. Уж не знаю, насколько это справедливо с точки зрения исторического материализма, но вот в программировании этот принцип работает на 99% (не пишу 100, чтобы какой-нибудь буквоед и зануда не прицепился с каким-то сугубо частным примером, бывают любители). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:01 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
17-77мой вариант подходит под это: репозиторий, метод сохранения например, туда передается экземпляр сущности с новыми данными - метод ищет предыдущую запись - закрывает в ней конечную дату актуальности, вставляет новую, одна транзакция, с многопоточностью - надо знать требования и думать Да, этим будет заниматься репозиторий. Скорее всего реализаций репозитория будет 2. Один для живых данных, другой для ретроспективы. В терминах СУБД, это похоже на две разных вьюхи (хотя не совсем так). 17-77ну от этой сложности можно абстрагироваться - выделив ее в отдельный слой, который с одной стороны потребляет БД, а с другой стороны отдает базу как будто она без истории Вот это было бы идеально, к этому стремимся. 17-77джоины да, станут сложнее, условия по дате актуальности в джоине должны всегда выдавать одну зависимую запись, соответственно, если за день может быть несколько новых редакций - надо с учетом времени, с оптимизациями по скорости - попробовать перевести на int/long тики Думаете, int/long ощутимо улучшат ситуацию по сравнению с датами? 17-77не уверен что ORM переварит такие запросы самостоятельно и на раз-два-три, надо курить документацию С ORM как-нибудь справимся :) Чего-то только мы из него не выжимали, в противовес всем заявлениям, что дескать ORM медленный. Это далеко не так. 17-77если в редакции сведений есть ссылка на другую сущность с историей - надо прописывать основной (сквозной) ИД той другой сущности, а не на ИД какой либо ее редакции, иначе будет фантомное движение в прошлое/будущее при переходе по этой связи Это можно заложить в архитектуру базовой таблицы (набор полей, которым обладают все таблицы, в программной реализации это выражено как базовый класс в иерархии). Вручную SQL практически не пишем, стараемся этого избегать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:02 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttДа, этим будет заниматься репозиторий. Скорее всего реализаций репозитория будет 2. Один для живых данных, другой для ретроспективы. В терминах СУБД, это похоже на две разных вьюхи (хотя не совсем так). ну так тоже можно, в моем случае юзер вносил дату актуальности в виде фильтра и постоянно перескакивал с одной на другую, поэтому хранить в отдельных таблицах, объединять и т.п. - тогда все это на мой взгляд было лишним усложнением hVosttДумаете, int/long ощутимо улучшат ситуацию по сравнению с датами? предположение, я не лазил глубоко в особенности СУБД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:11 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
EvLaUyhVosttНе согласен. Но не будет обсуждать, почему логика в базе данных это плохо по всем статьям. По опыту своей работы - полностью поддерживаю hVostt. Еще Карл Маркс писал, что прогресс невозможен без разделения труда. Уж не знаю, насколько это справедливо с точки зрения исторического материализма, но вот в программировании этот принцип работает на 99% (не пишу 100, чтобы какой-нибудь буквоед и зануда не прицепился с каким-то сугубо частным примером , бывают любители). Дык у фирмы 1С все свалено в одну большую кучу дерьмища, у них не каждый релиз их же программы свою базу открыть сможет:) , но это не помешало им растиражировать свою программу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:11 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123Дык у фирмы 1С все свалено в одну большую кучу дерьмища, у них не каждый релиз их же программы свою базу открыть сможет:) , но это не помешало им растиражировать свою программу. это называется ма́́ркетинг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:13 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин Это означает, грубо говоря, держать две копии всех запросов - "с историческими таблицами" и "без исторических таблиц", поскольку вариативность во FROM поддерживается достаточно плохо. Смотря кем. Плохо она поддерживается только в СУБД. Если запросы идут с аппсервера или с клиента, "вариативность во from" поддерживается просто на ура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 13:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
> При нажатии на кнопку выпадает менюшка "Ретроспектива - на вчера, на позавчера, на неделю назад :) Спасибо, Кот, это пять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:49 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Вам нужен встроенный в СУБД Git чтоли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:29 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt Ну хорошо, давайте рассмотрим такой вариант. В приложении есть кнопка "Ретроспектива". Как решить задачу по нажатию на кнопку?Запускается скрипт/процедура по восстановлению исторической базы на время заданное пользователем. После чего происходит переконнент на эту базу. Проблема в том, что восстановление может занимать заметное время (минуты/часы) - какой объем вашей базы? Также надо будет разобраться с протоколом - если историческая база используется, то один из вас будет обломан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:48 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttЗдравствуйте! Интересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов, естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных. При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных. Смотри здесь. http://en.wikipedia.org/wiki/Temporal_database ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 18:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38751369&tid=1540795]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 410ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...