Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
прочел еще раз про кастом_вариации и массивы объектов и индексы... так вот, temp таблицы вполне индексируемы. создаете temp таблицу (со всеми нужными индексами) первым get/set-ом. И хороши они тем, что их вакуумить не надо. Т.е. для фиксации фактов единичной транзакции, причем массовых фактов, с индексными поисками - они - самое то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 15:14 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan Black, не поясните, что заставляет использовать такой экзотический способ регистрации изменений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 15:16 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
4321прочел еще раз про кастом_вариации и массивы объектов и индексы... так вот, temp таблицы вполне индексируемы. создаете temp таблицу (со всеми нужными индексами) первым get/set-ом. И хороши они тем, что их вакуумить не надо. Т.е. для фиксации фактов единичной транзакции, причем массовых фактов, с индексными поисками - они - самое то.Идея про временные таблицы неплохая :) попробую на неделе проверить удобство использования и производительность правда, придётся смириться с фактом, что эмуляция Serializable будет не полная, но и то хлеб :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 15:24 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающийDan Black, не поясните, что заставляет использовать такой экзотический способ регистрации изменений?Ничего необычного не вижу в способе регистрации изменений. Есть объект, состояние которого изменяется во времени. Надо отслеживать изменения и иметь возможность получать состояние объекта на произвольный момент времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 15:26 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan Blackпридётся смириться с фактом, что эмуляция Serializable будет не полная, но и то хлеб :)да, из этой эмуляции выпадает всё то, что произвело изменения _до_ начала текущей транзакции, но было закоммиченно _после_ ее начала, причем _до_ первого опроса текущей транзакцией данного исторического значения. Для закрытия этой дыры надо писать еще куда-то и моменты окончания транзакций . Что, как мне видится, довольно сложно. При этом, даже если мы запишем эти данные, получить неизменные данные можно будет только в таблице историй (отсекая поздние). Если же в базе есть не только логгируемые данные - их состояние на момент старта получить уже будет нельзя. (т.е. тогда от честного сериалайзбл не уйти). Может быть записывать в начале транзакции во времянку id-ки всех запущенных транзакций? (покурочить на эту тему pg_stat_activity). И считать "временем старта" нашей тр-ии время этого стартового опроса ид транзакций. Но потребуется четкое требование любую транзакцию начинать с такой записи ид-ков всех незавершенных тр-й. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 15:50 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за участие в дискуссии. Решение с временными таблицами мне видится наиболее применимым не смотря на сложность и ограниченность (ведь хотелось-то обойтись одним-двумя запросами , но не судьба ). Если у кого-то появятся мысли, как решить задачу проще, то велкам! Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 16:00 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
> Ничего необычного не вижу Жаль. 4321 вам уже рассказал, как вы теряете данные. А я расскажу о том, что использовать плоский лог для регистрации изменений связанных данных невозможно. > Есть объект В реляционных СУБД нет объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 16:01 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающийЖаль. 4321 вам уже рассказал, как вы теряете данные. А я расскажу о том, что использовать плоский лог для регистрации изменений связанных данных невозможно. Объясните, где я потеряю данные? А так же интересно почитать про регистрацию изменений связных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 16:16 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan Black Объясните, где я потеряю данные? наверное имелось в виду, что если у вас все данные - именно таким вот образом "логированные "версии", то у вас нет механизма разрешения (да и самого возникновения ) коллизий. Т.е. у вас как-бы параллельно может существовать несколько исторических нитей (цепочек транзакций) изменения данных, ничего не знающие друг о друге кроме исходной точки (момента запуска первых транзакций этих параллельных цепочек). Поскольку "апдейт", вызывающий в нормальной ситуации блокировку изменяемой записи до конца транзакции у вас заменен на инсерт. А он, инсерт, ничего не блокирует (только не отдает свою запись другим транзакциям до коммита, т.ч. другие транзы спокойно пользуют "параллельные версии"). Коллизий напрочь не возникает (т.е. ситуация не то что не эмулирует сериалайзебл, но много хуже Read Commited). Возникают самостоятельные ветки в истории, обрываемые (теряющие значение) коммитом последней "параллельной" транзакции. Если же механизм логгирования дублируется еще и апдейтом в "обычной" таблице - то в зависимости от существования в схеме в т.ч. "нелоггируемых" - т.е. "обычных данных" (поставляющих вам блокировки апдейтуемых транзакциями величин для поддержания логической связности обновлений), или даже при логгировании всех - от порядка опроса данных в процессе разных транзакций вы будете иметь дырки в имитации сериалайзебл режима с точностью до разрыва в порядках опроса "объектов". Т.е. как я сначала говорил - требования несколько противоречивы, (позволяют "расщепление" историй данных). но вполне может быть, что именно это вам и требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 11:28 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
4321Да. Что мне в итоге надо, я получу :) Механизм решения конфликтов есть и работает. (Конфликты - это результат работы процедуры, меня же интересовало как получить "правильные" исходные данные для обработки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 11:49 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
> другие транзы спокойно пользуют "параллельные версии" Да, это и имел в виду. И все будет совсем плохо, если должны меняться связанные данные: апдейты могут пройти из разных транзакций и корректно откатить изменения невозможно. В результате получится куча мусора вместо базы данных. Вот я и спросил: для чего нужно так извращаться? В этом есть какой-то сакральный смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 12:22 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающийдля чего нужно так извращаться? Вижу извращение только в ограничении на вид изоляции транзакций, но ничего с этим сделать не могу. А где Вы видите извращение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 12:37 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan Black 4321Да. Что мне в итоге надо, я получу :) Механизм решения конфликтов есть и работает. если расскажете о механизме генерации и разрешения конфликтов в вашей схеме исторических данных - то это будет интересно. Пока же я вижу, что никаких "конфликтов" у вас возникать не будет, а будут возникать параллельно-независимые "кучи мусора", перекатываемые в параллельных цепочках транзакций и уносимые периодически вникуда. (там что-то типа механизма согласования мультимастер реплик просится - на каждый коммит транзакции) Dan Black(Конфликты - это результат работы процедуры, меня же интересовало как получить "правильные" исходные данные для обработки)конфликты логики - это то, что куча транзакций будет возиться с неактуальными ветками "истории" данных, так и не пошедшими в итоге в дело. Кто у вас, кроме механической очередности стартов, будет определять, какая куча транзакций дожна пойти в такой-вот мусор? а конфликтов-то при этом между транзакциями (из-за блокировки) и не возникнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 12:54 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
> А где Вы видите извращение? Предложенная реализация. Это не история изменений, а модель Теории Хаоса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:09 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Тема дисскуссии ушла в сторону 4321Основная проблема - чтение согласованных данных из разных таблиц при уровне изоляции транзакции Read Commited, желательно без лишних телодвижений. Все данные, которые надо прочитать, при этом хранят историю изменений. Вот и возникла мысль, а возможно ли и рыбку съесть (прочитать актуальные на начало транзакции) и косточкой не подавиться (сделать это, не изменяя уровень изоляции)? Проблема параллельных историй не существует, так как если такое обнаруживается, то происходит либо полный откат транзакции с выдачей ошибки, либо повторный перезапуск транзакции :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:14 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающий> А где Вы видите извращение? Предложенная реализация. Это не история изменений, а модель Теории Хаоса.Предложите свой вариант, думаю, не одному мне будет интересно узнать, что-то новое и полезное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:15 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
> Предложите свой вариант Вот так вот за пять минут взять и нарисовать? :?) Вы не задумывались, почему нигде, ни в свободных продуктах, ни в коммерческих, нет нормальной реализации истории изменений? Задачка только кажется простой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:35 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающий> Предложите свой вариант Вот так вот за пять минут взять и нарисовать? :?) Вы не задумывались, почему нигде, ни в свободных продуктах, ни в коммерческих, нет нормальной реализации истории изменений? Задачка только кажется простой.Ну и кто Вы после этого? Вам сюда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:42 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan BlackПроблема параллельных историй не существует, так как если такое обнаруживается, то происходит либо полный откат транзакции с выдачей ошибки, либо повторный перезапуск транзакции :)ну вот как раз и интересно, зачем вам руками создавать такие же проблемы, что вам создает простой "честный сериалайзебл". Или вы думаете, что рукотворный будет чуть быстрее? Кстати, а как вы проверяете "параллельность" историй данного? Это ведь, пожалуй, самое интересное. Т.е. на выходе, если предыдущее данное "истории" не совпадает с тем, которое было использовано в транзакции - Вы откатываете всю транзакцию? При этом у вас и транзакции длинные, и блокировок меж ними нет? Тогда, пожалуй, достаточно обнаружить единственный коммит другой транзакции в читаемое или хуже того - меняемое данное - и сразу сливать воду - т.е. рестартовать транзакцию с самого начала (сейвпойнт ставить в самом начале, а в гет_валуе и сет_валуе генерировать ерроры битым текстом). Или у вас есть какие-то послабления относительно допустимости использования в транзакции неактуальных (на момент ее окончания) входных данных? Т.е. на разрыв и похеривание веток историй (их части) какого-то подмножества данных? И за счет этого вы хотите обойти "честный сериалайзебл" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:48 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
ПС ах, да я забыл случай, когда величины принимают значения из очень небольшого набора (скажем всего из 2-х значений) . Тогда даже если к моменту завершения транзакции было прокммичено множество параллельных историй, тем не менее вероятность того, что в истории "поучаствовало" правильное данное будет около 1/2. Правда если в транзакции попользовались N данными, и все они меняются независимо, то вероятность придти к такому же состоянию истории, как на момент старта транзакции становится (1/2)**N т.е. уже при N>~3 на такое "улучшение" можно честно плевать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:56 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
4321Обход "честного serializable" и проверка на параллельное измение истории происходит с помощью оптимистической блокировки объекта, с историей изменения которого работает процедура. Получается практически полная эмуляция транзакции Serializable. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 13:58 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
Dan Black 4321Обход "честного serializable" и проверка на параллельное измение истории происходит с помощью оптимистической блокировки объекта, с историей изменения которого работает процедура. Получается практически полная эмуляция транзакции Serializable. - т.е. у вас кроме таблицы историй , есть еще собственно "объекты" (таблица собственно объектов), которые, скажем, что-то типа "SELECT FOR UPDATE-тятся". Причем вы блокируете так все "объекты" _читаемые_ в транзакции? Или я опять что-то не так понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 14:21 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
4321- т.е. у вас кроме таблицы историй , есть еще собственно "объекты" (таблица собственно объектов), которые, скажем, что-то типа "SELECT FOR UPDATE-тятся". Причем вы блокируете так все "объекты" _читаемые_ в транзакции? Или я опять что-то не так понял? Да, есть таблица "объектов", которая служит, в частности, и для блокировок. Блокировка происходит только для объектов, состояние которых изменяется внутри транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 14:42 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
> Ну и кто Вы после этого? Тот, кто знает, как должна быть реализована история изменений. Если Ваш проект под GPL v.3, готов обсудить варианты. Если это коммерческий проект - разгребайте свое дерьмо самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 15:28 |
|
||
|
Как организовать хранение и извление исторических данных?
|
|||
|---|---|---|---|
|
#18+
PostreSQL начинающий> Ну и кто Вы после этого? Тот, кто знает, как должна быть реализована история изменений. Слова, слова... от Вас не заметил ни одного дельного замечания. Один трёп... ;) а теперь ещё бездоказательное высказывания о том "как я крут, что я знаю, как правильно реализуется история изменения, но никому не скажу" (а не скажете, потому что боитесь, что в этом форуме Вашу замечательную правильную модель истории раскритикуют, и она окажется не такой уж и правильной ) Истина рождается в споре... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 15:42 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35268845&tid=2004410]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 400ms |

| 0 / 0 |
