|
|
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Интересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов, естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных. При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 15:42 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Это недешевая фича, как с точки зрения разработки, так и с точки зрения производительности (данных больше, ключи больше, и т.п.), целую систему с таким функционалом делают редко. Какие-то элементы - да, бывает. Rocket scienc'а в общем-то никакого нет, просто много геморроя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 15:51 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, Жаль... А я думал, может есть готовая к употреблению методология. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 16:16 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt А я думал, может есть готовая к употреблению методология. Бакапы, логи. Вы платите только за лишнее дисковое пространство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 16:24 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttА я думал, может есть готовая к употреблению методология. Есть. "Flashback query" называется. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 16:29 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЕсть. "Flashback query" называется. Не, ретроспективные запросы -- это возможности конкретной СУБД, хотя было бы круто, если можно было бы включить "ретроспективный режим" на всё подключение (например, указать временной штамп прям в строке соединения), то это бы решало задачу. Но в целом интересует именно решение на уровне схемы базы данных, в отрыве от конкретной СУБД (может с некоторыми оговорками, допустим, чтобы это работало как минимум в MS SQL, Oracle, Postgre SQL). Я себе это как вижу. В каждой таблице добавить поле типа HistoryId, которое ссылается на оригинальную запись. При любом изменении записи, создаётся копия со значением HistoryId, указывающую на оригинал. На уровне организации доступа к данным, записи с заполненным полем HistoryId игнорируются. В режиме ретроспективы, всегда берётся самая свежая запись, с датой изменения меньше указанного временного штампа. Не понятно только как толком восстанавливать связи, с учётом ретроспективы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257Бакапы, логи. Вы платите только за лишнее дисковое пространство. Вопросы использования дискового пространства и производительности в данном случае второстепенны. Озвучена задача, чтобы в программе в любой момент времени можно было посмотреть состояние системы в указанный момент времени. Совсем старые записи можно архивировать (допустим, годовые). Больше интересует просмотр состояния в течение года/полугода. А бекапы, логи, -- это совсем другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:21 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttхотя было бы круто, если можно было бы включить "ретроспективный режим" на всё подключение (например, указать временной штамп прям в строке соединения), то это бы решало задачу. Oracle ConceptsPackaged applications, like report generation tools that only do queries, can run in Flashback Query mode by using logon triggers . Applications can run transparently without requiring changes to code . Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:28 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt, одним HistoryID Вы не отделаетесь - надо вводить периоды актуальности для каждой записи. И тогда да, при обновлении Вы закрываете период актуальности текущей записи и создаете новую с открытым периодом. Проблема еще в том, что не получится пользоваться внешними ключами "из коробки" - придется их заменять на ручные constraint'ы (и таким образом лишать оптимизатор дополнительной информации). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:29 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинПроблема еще в том, что не получится пользоваться внешними ключами "из коробки" - придется их заменять на ручные constraint'ы Ну почему же не получится... У одного из моих пользователей есть такая безумная система: в каждом первичном ключе есть поле версии, соответственно связи вторичных ключей идут id+версия. Куча вьюшек превращают update любой записи в insert записи с новой версией + копирование всех дочерних записей с новой версией. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:38 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин одним HistoryID Вы не отделаетесь - надо вводить периоды актуальности для каждой записи. И тогда да, при обновлении Вы закрываете период актуальности текущей записи и создаете новую с открытым периодом.Ну старые версии можно скидывать в дополнительные таблицы, оставляя основное приложение неизменным, а для ретроспективных запросов объединять историческую таблицу с базовой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:51 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt Озвучена задача, чтобы в программе в любой момент времени можно было посмотреть состояние системы в указанный момент времени. И решением этой задачи будет восстановление системы с бакапа на определенный момент времени - базовый фунционал любого админа. Никаких изменений в коде (стало быть никаких багов, ни для ретроспективных запросов, ни для боевой программы). Минусом будет только время на восстановление для большой базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 17:59 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttЗдравствуйте! Интересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов, естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных. При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных. В какой области по-вашему это наиболее востребовано? У меня есть то, что вам нужно:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 19:12 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Вот оно это путешествие в прошлое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 19:30 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovhVosttхотя было бы круто, если можно было бы включить "ретроспективный режим" на всё подключение (например, указать временной штамп прям в строке соединения), то это бы решало задачу. Oracle ConceptsPackaged applications, like report generation tools that only do queries, can run in Flashback Query mode by using logon triggers . Applications can run transparently without requiring changes to code . О, круто! Жаль, что только для Oracle. В моём случае это наименее предпочтительная СУБД :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 19:41 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
> надо вводить периоды актуальности для каждой записи И периодами актуальности вы не отделаетесь, Кот. Четыре даты - это понятно, но задача хитрее, чем может показаться на первый взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:01 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621, А какой кейс не покроется периодами актуальности для каждой сущности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Ревизия закрытого периода. А связанные ревизии - локальная задница. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:34 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257И решением этой задачи будет восстановление системы с бакапа на определенный момент времени - базовый фунционал любого админа. Никаких изменений в коде (стало быть никаких багов, ни для ретроспективных запросов, ни для боевой программы). Минусом будет только время на восстановление для большой базы. Нужен способ спроектировать базу данных так, чтобы задача решалась без бекапа. У бекапа совершенно другие задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:40 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123Вот оно это путешествие в прошлое Слабо выставить дату и увидеть совокупное состояние всей системы в этот момент? А не тыкать в каждую запись, выясняя её прошлое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:41 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621Ревизия закрытого периода. А связанные ревизии - локальная задница. :) Ревизии по опыту себя вообще не оправдывают. Неудобная бесполезная нашлёпка. Чем дата/время не ревизия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:43 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
> Ревизии по опыту себя вообще не оправдывают. Вы не готовы к решению этой задачи. Ревизии и представляют основной аналитический интерес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:46 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttprog123Вот оно это путешествие в прошлое Слабо выставить дату и увидеть совокупное состояние всей системы в этот момент? А не тыкать в каждую запись, выясняя её прошлое. Нарисуйте (можно от руки) достойный экранный интерфейс и если он придется по вкусу собравшимся, то я его реализую. Сама информационная система живет во времени, абсолютно все данные. Большое информационное хранилище с огромным количеством сущностей очень разных по структуре и составу, очень сложно представить как нечто единое целое в историческом контексте, тут надо наверное быть художником. Моя фантазия не идет дальше трёх вкладок: "Вчера" "Сегодня" "Завтра". Ряд информационных объектов по своей природе постоянны, всевозможные классификаторы, справочники и тому подобное, поэтому над ними время не шибко властно:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 20:50 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621Вы не готовы к решению этой задачи. Ревизии и представляют основной аналитический интерес. Могу ошибаться, или понятие "ревизия" мы понимаем по-разному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 21:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123Нарисуйте (можно от руки) достойный экранный интерфейс и если он придется по вкусу собравшимся, то я его реализую. Как выглядит экранный интерфейс, не важно :) prog123Моя фантазия не идет дальше трёх вкладок: "Вчера" "Сегодня" "Завтра". Допустим, пункт меню "Рестропектива", по нажатию открывается форма ввода даты, указываешь дату, нажимаешь ОК, и программа "в прошлом", за исключением какой-нибудь надписи, обозначающей дату. Все функции доступны, кроме создания или изменения. Также, если программа логгирует просмотры, она должна перестать это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 21:24 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Собственно, пока вижу решение на основе исторических записей (копий) и сохранении периодов актуальности. Стоит ли бросаться "в омут" с таким решением, или у кого-то есть ещё предложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 21:27 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Вспомнил такое в 1с версия 7.7 В справочниках у реквизитов есть свойство Периодический, у системы есть свойство РабочаяДата. Можно выбрать любую дату и заполнять или смотреть информацию на эту дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 21:57 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt Стоит ли бросаться "в омут" с таким решением, или у кого-то есть ещё предложения? Вам надо будет принять несколько решений основываясь на 1 Это доделка существующей (смотрящей в настоящее) системы или сразу новая разработка 2 Как часто будут запросы в прошлое. Насколько критична производительность по сравнению с запросами "на настоящее время". 3 Какой объем устаревших версий строк по сравнению с общим объемом данных? Решения которые надо принять - 1 хранить версии в той же таблице myTable (проще и быстрее) или в другой myTable_hist (нет влияния на запросы к "живым данным", все ключи/ограничения работают, но выборка исторических данных сложнее и медленнее) 2 использовать две даты d_from default(до начала времен), d_to default(конец времен) или одну дату d_change (надежнее, но медленнее выборки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 22:25 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257, Спасибо за подробный ответ. Это не доделка. Есть работающая версия 1 (но без ретроспективы). Надо делать версию 2 практически с нуля, но с оглядкой на 1 (т.е. бизнес-процессы, данные -- те же). Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична (т.е. некоторые просадки можно вполне обосновать). Т.е. это не часть бизнес-процесса, это лишь возможность быстрей разобраться при каких-то проблемах и по-ностальгировать начальству. Объём устаревших версий большой, наверное надо будет предусмотреть чистку, или сжатие (т.е. частые изменения со временем надо будет упаковывать в большие, пока даже не знаю как мы это будем делать). Придётся хранить версии в отдельных таблицах, так как к "живым" данным по перфомансу предъявляются высокие требования. Да, две даты, надёжность обеспечивается слоем доступа к данным. Что ж, будем делать. Спасибо за просвещение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 23:40 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttПридётся хранить версии в отдельных таблицах, так как к "живым" данным по перфомансу предъявляются высокие требования. Одно с другим связано слабо. Архивную аналитику выносят в отдельную базу по другим причинам. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 23:46 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt Да, две даты, надёжность обеспечивается слоем доступа к данным. Добавьте в расписание запрос на предмет поиска строк у которых дата конца не совпадает с датой начала при том же ай-ди. В нормальных условиях запрос не должен возвращать данные, ну а если кто накосячил то отловите вы, а не пользователь. Я к тому что верить никому нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 00:11 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОдно с другим связано слабо. Архивную аналитику выносят в отдельную базу по другим причинам. Предлагаете хранить историю в одной таблице? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 00:26 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257Добавьте в расписание запрос на предмет поиска строк у которых дата конца не совпадает с датой начала при том же ай-ди. В нормальных условиях запрос не должен возвращать данные, ну а если кто накосячил то отловите вы, а не пользователь. Я к тому что верить никому нельзя. Благодарю за совет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 00:29 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
> Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична Тогда вы фигней занимаетесь. Держите нужное количество архивных копий, это будет на порядки дешевле редизайна и поддержки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 00:43 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621 Тогда вы фигней занимаетесь. Держите нужное количество архивных копий, это будет на порядки дешевле редизайна и поддержки. Заглянув в хрустальный шар, предположу что hVostt - разработчик и проблему решает как разработчик. когда в руках молоток, все проблемы выглядят как гвозди. (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 01:23 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
> проблему решает как разработчик Так я и пишу для того, чтобы люди не ходили по граблям. Это наиболее серьёзная задача из всех, когда-либо здесь обсуждавшихся. Более того, о решениях промышленного качества я не слышал и не читал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 02:01 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttТакже, если программа логгирует просмотры, она должна перестать это делать. Эт-то почему же? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 05:18 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621> проблему решает как разработчик Так я и пишу для того, чтобы люди не ходили по граблям. Это наиболее серьёзная задача из всех, когда-либо здесь обсуждавшихся. Более того, о решениях промышленного качества я не слышал и не читал . А вы не потрудитесь вкратце сформулировать своё видение проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 07:18 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Вопрос сформулирован некорректно. Все элементы в БД в любой момент времени должны находиться в согласованном состоянии. Так что в общем случае при ведении истории для ВСЕЙ БД нужно при любом изменении любой сущности делать копию всех остальных связанных сущностей. Соответственно, решение ужасно затратное как по дисковому пространству, так и по производительности. Для начала, чем не устраивает решение иметь таблицу истории для каждой сущности отдельно и делать, как уже упоминалось выше по топику, на каждый делете/апдейт копирование удаленных записей в триггере в историческую таблицу? В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 10:46 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
вы посмотрите как реализован механизм Capture Data Source (СDS) в MS SQL 2008 и позднее. там именно история изменений значений атрибутов. заводиться альтернативная таблица и заполняется значениями полей таблицы с историей. что-то можно попробовать сделать на их архитектуре - там здоровенная система наворочена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:09 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Arm79Для начала, чем не устраивает решение иметь таблицу истории для каждой сущности отдельно и делать, как уже упоминалось выше по топику, на каждый делете/апдейт копирование удаленных записей в триггере в историческую таблицу? В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц. Это означает, грубо говоря, держать две копии всех запросов - "с историческими таблицами" и "без исторических таблиц", поскольку вариативность во FROM поддерживается достаточно плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:14 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttИнтересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов, естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных. При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных. доводилось, даже с изменением, ничего сложного, но объем базы больше и запросы надо оптимизировать получше, да и гемора больше суть: * помимо основной таблицы сущности, нужна еще таблица исторических сведений, либо одна таблица и для каждой сущности сквозной ИД + ИД редакции + дата актуальности * с датой актуальности несколько вариантов, гугль подскажет подробное описание, там есть плюсы и минусы у каждого * связи идут по сквозному ИД, а конкретная редакция сведений достается по результатам расчета текущей даты актуальности -вот тут и требуется оптимизация запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:15 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинArm79Для начала, чем не устраивает решение иметь таблицу истории для каждой сущности отдельно и делать, как уже упоминалось выше по топику, на каждый делете/апдейт копирование удаленных записей в триггере в историческую таблицу? В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц. Это означает, грубо говоря, держать две копии всех запросов - "с историческими таблицами" и "без исторических таблиц", поскольку вариативность во FROM поддерживается достаточно плохо. Да ну, не все так плохо. select top 1 from (select from history union select from source) t where t.last_update >= @date order by date desc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:23 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Я помню, что в книге http://www.ozon.ru/context/detail/id/2808650/ в одной из последних глав рассматривается теория - как спроектировать БД с возможностью ретроспективы и есть примеры на Cache. Почитайте, если найдете, может, увидите что-то для себя полезное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:23 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Arm79Кот Матроскинпропущено... Это означает, грубо говоря, держать две копии всех запросов - "с историческими таблицами" и "без исторических таблиц", поскольку вариативность во FROM поддерживается достаточно плохо. Да ну, не все так плохо. 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:36 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Почему все говорят только о данных? В БД куча других объектов, в том числе и реализующих прикладную логику. Иногда при доработках вообще меняются алгоритмы расчета тех или иных величин, то есть на одних и тех же исходных данных, лежащих в таблице вчера выдавалось одно расчитываемое значение, а сегодня выдаётся другое. То есть кроме ретроспективного хранения данных придется еще хранить все изменения КОДА базы данных, реализующего бизнес логику. Включая ошибки, да. Ибо какая-то ошибка в коде могла приводить к совершенно другим результатам каких-то расчетов. Вы же хотите увидеть именно те результаты, которые видели вчера? А не те, которые отображаются сегодня после исправления этой ошибки? Это касается не только уровня пакетов в БД. Это же касается и самой БД, ибо сама СУБД тоже дорабатывается и при очередных релизах бывает меняется какое-то поведение. А еще логика бывает не только в БД зашита, а еще и в клиентском ПО, то есть надо еще и клиентское ПО брать соответствующей версии, чтобы увидеть в точности то, что вывидели "вчера". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:47 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
guest_20040621> Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична Тогда вы фигней занимаетесь. Держите нужное количество архивных копий, это будет на порядки дешевле редизайна и поддержки. Ну хорошо, давайте рассмотрим такой вариант. В приложении есть кнопка "Ретроспектива". Как решить задачу по нажатию на кнопку? Где-то в подвале загорается красная лампочка и бригада админов начинает интенсивно шевелиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:48 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257Заглянув в хрустальный шар, предположу что hVostt - разработчик и проблему решает как разработчик. когда в руках молоток, все проблемы выглядят как гвозди. (с) Именно. А как ещё можно решать эту задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:50 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойhVosttТакже, если программа логгирует просмотры, она должна перестать это делать. Эт-то почему же? :) Нет нужды для ретроспективы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:53 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Arm79Вопрос сформулирован некорректно. Все элементы в БД в любой момент времени должны находиться в согласованном состоянии. Так что в общем случае при ведении истории для ВСЕЙ БД нужно при любом изменении любой сущности делать копию всех остальных связанных сущностей. Соответственно, решение ужасно затратное как по дисковому пространству, так и по производительности. Для начала, чем не устраивает решение иметь таблицу истории для каждой сущности отдельно и делать, как уже упоминалось выше по топику, на каждый делете/апдейт копирование удаленных записей в триггере в историческую таблицу? В принципе, это решение позволит иметь снепшот данных на любой время: нужно просто выбирать из исторических таблиц самые близкие записи к указанному времени, а если их нет - брать значения из актуальных таблиц . Сами себе противоречите, - если ничего не менялось, нафига копировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 11:53 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
soulsurferВам нужен встроенный в СУБД Git чтоли? Ну типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 19:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257Запускается скрипт/процедура по восстановлению исторической базы на время заданное пользователем. После чего происходит переконнент на эту базу. Проблема в том, что восстановление может занимать заметное время (минуты/часы) - какой объем вашей базы? Также надо будет разобраться с протоколом - если историческая база используется, то один из вас будет обломан. Самое плохое решение. Почти тоже самое, что с бекапом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 19:18 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttsoulsurferВам нужен встроенный в СУБД Git чтоли? Ну типа. А может втихушку поделим добычу? Вы там будете долго париться и еще неизвестно что получится, а у меня уже это есть. Предложим заказчегу за полцены, - он не устоит:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 19:48 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Заказчик не только сможет бросить взгляд в прошлое и/или в будущее, но и сможет получить некую "дельту" используя встроенную 16594626 |> http://%5Bmsg=16594626]]скриптовую подсистему (языки программирования), я сейчас этим как раз озабочен:) Всевозможная обработка данных при помощи скриптов, отчетная подсистема, все что хошь:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 19:57 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
о как, разные языки - полная демократия и плюрализм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 20:09 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Поговорите с заказчиком. У меня в одном проекте попросили вдруг добавить такую же функциональность к уже тестирующейся в бете системе. За месяц. После дискуссии сошлись на том, что в системе делается месячный снапшот, и можно увидеть данные на 1 число каждого месяца за последние пять лет. Заказчика это устроило. База была небольшая, архивные снапшоты кидались на дешевые медленные диски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 20:15 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt Самое плохое решение. Почти тоже самое, что с бекапом.Тогда интерфейс к планировщику - когда запустить джоб, на какую дату восстанавливатся и кому прислать уведомление когда база будет восстановлена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 20:19 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Sergei.AgalakovПоговорите с заказчиком. У меня в одном проекте попросили вдруг добавить такую же функциональность к уже тестирующейся в бете системе. За месяц. После дискуссии сошлись на том, что в системе делается месячный снапшот, и можно увидеть данные на 1 число каждого месяца за последние пять лет. Заказчика это устроило. База была небольшая, архивные снапшоты кидались на дешевые медленные диски. Со снапшотами понятно. Они не скажут нам о таки вещах как: "Что у нас в базе есть со сроком окончания через 10 дней" и тому подобных комбинаций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 20:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
SERG1257hVosttСамое плохое решение. Почти тоже самое, что с бекапом.Тогда интерфейс к планировщику - когда запустить джоб, на какую дату восстанавливатся и кому прислать уведомление когда база будет восстановлена. При иных обстоятельствах так бы и сделали. Нужна полная интеграция, часть функциональности системы, на уровне самой модели и реализации, а не путём каких-то нашлёпок. Поэтому я и поднял тему в ветке форума "Проектирование БД" Ну что же вы, разве никому не интересно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 22:53 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Sergei.AgalakovПоговорите с заказчиком. У меня в одном проекте попросили вдруг добавить такую же функциональность к уже тестирующейся в бете системе. За месяц. После дискуссии сошлись на том, что в системе делается месячный снапшот, и можно увидеть данные на 1 число каждого месяца за последние пять лет. Заказчика это устроило. База была небольшая, архивные снапшоты кидались на дешевые медленные диски. Заказчик хочет бомбу, а не унылую хрень Да нам и самим интересно. Думал, может кто-то уже заморачивался, подсказал бы направление. Я не прошу решить эту задачу за нас, просто пару советов, да верное направление вполне бы устроило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 22:56 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123А может втихушку поделим добычу? Вы там будете долго париться и еще неизвестно что получится, а у меня уже это есть. Предложим заказчегу за полцены, - он не устоит:) В смысле, методология или готовая система? Нужна методология, остальное мы как-нибудь осилим. И не такое решали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 22:57 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttprog123А может втихушку поделим добычу? Вы там будете долго париться и еще неизвестно что получится, а у меня уже это есть. Предложим заказчегу за полцены, - он не устоит:) В смысле, методология или готовая система? Нужна методология, остальное мы как-нибудь осилим. И не такое решали. У меня все готовенькое и на блюдечке с голубой каёмочкой, а вот вашу контору надо бы всем составом на овощную базу, на трудовое перевоспитание:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 23:07 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123У меня все готовенькое и на блюдечке с голубой каёмочкой, а вот вашу контору надо бы всем составом на овощную базу, на трудовое перевоспитание:) Согласен, все на картошку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 00:26 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Направление-то понятно: effectivetimestamp, expiredtimestamp, update==delete+insert во всех таблицах... Производительность сильно страдает. JOIN нескольких таблиц с условиями 'в момент времени x' может оказаться таким медленным, что бысто работающая унылая хрень покажется марципанчиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 02:41 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Sergei.Agalakov Направление-то понятно: effectivetimestamp, expiredtimestamp, update==delete+insert во всех таблицах...Не совсем так. alter table mytable add d_from default sysdate() update mytable set d_from='01 Jan 1900' create table mytable_hist as select *, sysdate() as d_to from mytable where 1=0 insert идет штатно d_from принимает default значение при update insert into mytable_hist select *, sysdate() as d_to from mytable -- для всех обновляемых данных update mytable set d_from=sysdate() -- дополнительный update для обновляемых строк собственно update при delete insert into mytable_hist select *, sysdate() as d_to from mytable -- для всех удаляемых строк собственно delete запрос на дату :dselect select * from mytable where ... -- условие and d_from<=:dselect union all select * from mytable_hist where ... условие and :dselect between d_from and d_to -- between для компактности, удобно, но при нем d_to должен быть чутка раньше чем d_from следующей записи либо вьюху create view my_hist_view as select *, '31 Jan 9999' as d_to from mytable union all select * from mytable_hist select * from my_hist_view where ... условие and :dselect between d_from and d_to индексы для mytable_hist должны быть такими же как и для mytable как-то так навскидку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 03:26 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttАнатоЛойпропущено... Эт-то почему же? :) Нет нужды для ретроспективы. Непонятно. Зачем тогда вообще логировать просмотры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 22:35 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойhVosttпропущено... Нет нужды для ретроспективы. Непонятно. Зачем тогда вообще логировать просмотры? тут набежали малолетние чтобы подускутировать про джойны:) Надо говорить прикладным языком(чисто русским), а именно: что, для чего и как должно быть, т.е. что должно скрываться за той единственной кнопкой на экране - "Сделай мне хорошо!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 22:40 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
prog123нучотам? будем делать куда деваться в пятницу остановились на вопросе, можно ли ретроспективу использовать для чего-нибудь ещё, например для отображения активности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 00:11 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt За прикладную логику в БД у нас бьют по рукам. Обоснование должно быть такое, что по-другому просто ну никак. Пока таких случаев не было. Логика в БД -- моветон. Вот полностью не согласен :) Всё очень сильно зависит от конкретного приложения и конкретной СУБД. Видимо у вас такой проект, в котором не требуется 1) Десктопный клиент 2) WEB клиент с точно такой же функциональностью 3) Android клиент, который реализует основные функции приложения 4) iOS клиент, который полностью аналогичен андроидному 5) Вторая версия десктопного клиента специально для техсаппорта, реализующая фичи, недоступные ни в одном из вышеперечисленных, но при этом сохраняющие общий с ними функционал Вот когда вам потребуется при изменении логики какого-то функционала переписывать ПЯТЬ клиентов, вместо того, чтобы поправить один пакет в базе - тогда и посмотрим, моветон логика в БД или не моветон. Так что у нас наоборот, за логику в клиенте руки отрывают :) Плюс запрещая держать логику в БД для, например, Oracle - вы автоматом выбрасываете на помойку половину функционала БД. Для хранения обычных табличек можно взять гораздо более дешевую в лицензировании базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 14:08 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
По моему опыту, такие требования появляются, когда заказчик сам не знает, чего хочет. Чем связываться с полностью версионными данными, имеет смысл понять БИЗНЕС-требования заказчика. Высока вероятность, что его хотелки можно удовлетворить намного более дешевым способом. Например, версионировать не всю базу. Или вообще ему нужна не версионность, а, скажем, возможность прошлогодние отчеты смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 14:55 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt, 1. Ведём две БД: операционную (ОБД) и историческую/версионную (ИБД). 2. Запросы на чтение к ОБД и ИБД от слоя бизнес-логики одинаковы, но проходят "препроцессорную" обработку. 3. Структуры ОБД и ИБД синхронизированы с небольшими поправками: 3.1.У каждой таблицы в ОБД есть поле id - первичный ключ таблицы. 3.2.Для каждой таблицы из ОБД в ИБД последовательно сделано: 0) создана копия структуры таблицы; 1) удалены ограничения целостности; 2) восстановлены все сопровождавшие эти ограничения индексы (уникальные индексы преобразованы в неуникальные); 3) добавлены доп. поля: а) id_original - заполняется значением первичного ключа таблицы в ОБД (но не является альтеративным ключом в ИБД!). б) id - autoinc, первичный ключ в ИБД. в) timestamp - дата и время добавления записи в ИБД. г) is_operation - признак операции CUD в ОБД, приведший к появлению записи в ИБД. 5) все внешние ключи в ИБД восстановлены как в ОБД, но ссылаются не на поле id_original, а на поле id. 4. При любом CUD в ОБД делаем асинхронный insert в ИБД, при котором: для значения каждого внешнего ключа в записи выполняется поиск в связанной таблице актуальной записи на дату этого insert (можно подумать просто про последнее значение - но сейчас лень). 5. Все запросы при обращении к полям используют препроцессорные вызовы функций: 1) обращение к полю первичного ключа таблицы %ActualPK(<table>)% 2) обращение к значению поля со вторичным ключом %ActualFK(<table>.<field>)% 3) обращение к значению поля для сравнения с константой Например: X) SELECT a.*, b.* FROM a join b on %ActualPK(a)% = %ActualFK(b.a_id)% Y) SELECT a.name FROM a WHERE %ConstCompare(a.field_name)% LIKE 'Вау*' 6. Примеры разворачивания запросов: X.ОБД) В ОБД препроцессор делает следующее: SELECT a.*, b.* FROM a join b on a.id = b.a_id; Y.ОБД) SELECT a.name FROM a WHERE a.field_name LIKE 'Вау*' В ИБД у всех шаблонов есть некая константа "точка прошлого" для сессии типа дата-время. X.ИБД) Шаблон разворачивается: SELECT a.*, b.* FROM a join b on GetActualId(a.id_original, %history_time_point%) = b.a_id AND b.id IN (GetActualIds(b, %history_time_point%)) Y.ИБД) SELECT a.name FROM a WHERE a.field_name LIKE 'Вау*' AND a.id IN (GetActualIds(а, %history_time_point%)) Производительность может быстро оказаться в Опе, но это уже другая история :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 13:39 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛой, ой-ой, пару ошибок, в реализации, но думаю, что суть понятна :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 14:50 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttЯ себе это как вижу. В каждой таблице добавить поле типа HistoryId, которое ссылается на оригинальную запись. При любом изменении записи, создаётся копия со значением HistoryId, указывающую на оригинал. На уровне организации доступа к данным, записи с заполненным полем HistoryId игнорируются. В режиме ретроспективы, всегда берётся самая свежая запись, с датой изменения меньше указанного временного штампа. Не понятно только как толком восстанавливать связи, с учётом ретроспективы. Просто. На каждый "обычный" внешний ключ нужно иметь ещё один внешний ключ, ссылающийся на исторически правильную запись. В моём варианте я так и попытался описать. + финт с шаблонами в моём варианте (закрыть проблему логически одинаковых запросов) в этом решении тоже подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 15:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойПросто. На каждый "обычный" внешний ключ нужно иметь ещё один внешний ключ, ссылающийся на исторически правильную запись. Какой в этом смысл? у Вас есть внешний ключ (определяющий множество "версий" обьекта) и дата ретроспективы (глобальная). Этого достаточно, чтобы выбрать исторически правильную версию - зачем нужен дополнительный внешний ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:06 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanohVosttЗа прикладную логику в БД у нас бьют по рукам. Обоснование должно быть такое, что по-другому просто ну никак. Пока таких случаев не было. Логика в БД -- моветон. Вот полностью не согласен :) Всё очень сильно зависит от конкретного приложения и конкретной СУБД. Видимо у вас такой проект, в котором не требуется 1) Десктопный клиент 2) WEB клиент с точно такой же функциональностью 3) Android клиент, который реализует основные функции приложения 4) iOS клиент, который полностью аналогичен андроидному 5) Вторая версия десктопного клиента специально для техсаппорта, реализующая фичи, недоступные ни в одном из вышеперечисленных, но при этом сохраняющие общий с ними функционал Вот когда вам потребуется при изменении логики какого-то функционала переписывать ПЯТЬ клиентов, вместо того, чтобы поправить один пакет в базе - тогда и посмотрим, моветон логика в БД или не моветон. Так что у нас наоборот, за логику в клиенте руки отрывают :) Плюс запрещая держать логику в БД для, например, Oracle - вы автоматом выбрасываете на помойку половину функционала БД. Для хранения обычных табличек можно взять гораздо более дешевую в лицензировании базу.Хм, я в замешательстве. Вы не знаете, что такое ООП? Паттерны и прочая муть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:19 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинАнатоЛойПросто. На каждый "обычный" внешний ключ нужно иметь ещё один внешний ключ, ссылающийся на исторически правильную запись. Какой в этом смысл? у Вас есть внешний ключ (определяющий множество "версий" обьекта) и дата ретроспективы (глобальная). Этого достаточно, чтобы выбрать исторически правильную версию - зачем нужен дополнительный внешний ключ? Странно, я думал что это очевидно: уменьшить затраты "исторического" SELECT на одну из самых частых операций - JOIN... Там и так тормозов будет хватать... Готовим "удобные данные" сразу при загрузке.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:48 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойСтранно, я думал что это очевидно: уменьшить затраты "исторического" SELECT на одну из самых частых операций - JOIN... 1. Далеко не факт, что таким образом будут уменьшены какие-то затраты 2. Более существенно - крайне не факт, что "исторически правильная запись" существует и только в единственном экземпляре 3. Ещё более не факт - что никто и никогда не будет редактировать однажды введённые даты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 17:11 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
skyANAХм, я в замешательстве. Вы не знаете, что такое ООП? Паттерны и прочая муть? И как перечисленное связано с поддержкой бизнес-логики в 5 клиентах под 4 различных платформы, написанных на 4 различных языках программирования? Реализация даже детально проработанного алгоритма на другом ЯП неизбежно сопряжена с вероятностью появления ошибок. Так зачем реализовывать одно и то же на 4-х языках, если достаточно реализовать в одном месте - в БД ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 17:22 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойКот Матроскинпропущено... Какой в этом смысл? у Вас есть внешний ключ (определяющий множество "версий" обьекта) и дата ретроспективы (глобальная). Этого достаточно, чтобы выбрать исторически правильную версию - зачем нужен дополнительный внешний ключ? Странно, я думал что это очевидно: уменьшить затраты "исторического" SELECT на одну из самых частых операций - JOIN... Там и так тормозов будет хватать... Готовим "удобные данные" сразу при загрузке.... Эффективность подобного "уменьшения затрат" зависит от конкретного распределения данных, очевидно - может статься что сработает в минус, а не в плюс. В решении хранения исторических данных "вообще", без привязки к конкретным данным - мне кажется, такие неоднозначные оптимизации малооосмыслены. Не стоит чинить то, что не сломалось (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 17:28 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvano в 5 клиентах под 4 различных платформы, написанных на 4 различных языках программирования? Слушьте, а как вы так ухитрились? Хотя я понимаю, раз у вас для пользователей и для саппорта два разных клиента, можно и не такое... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 17:29 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoВидимо у вас такой проект, в котором не требуется 1) Десктопный клиент 2) WEB клиент с точно такой же функциональностью 3) Android клиент, который реализует основные функции приложения 4) iOS клиент, который полностью аналогичен андроидному 5) Вторая версия десктопного клиента специально для техсаппорта, реализующая фичи, недоступные ни в одном из вышеперечисленных, но при этом сохраняющие общий с ними функционал Я в полнейшем замешательстве. Это что за такая СУБД, которая работает на всех указанных платофрмах, при этом позволяет содержать одинаковую программную логику (уровня T-SQL/PL SQL)? anvanoВот когда вам потребуется при изменении логики какого-то функционала переписывать ПЯТЬ клиентов, вместо того, чтобы поправить один пакет в базе - тогда и посмотрим, моветон логика в БД или не моветон. Бред. При чём тут вообще клиент? anvanoТак что у нас наоборот, за логику в клиенте руки отрывают :) Интересно, а чем программный код у вас пишут, ногами? Задницей? Трудновато наверное без рук-то. anvanoПлюс запрещая держать логику в БД для, например, Oracle - вы автоматом выбрасываете на помойку половину функционала БД. Вы бы почитали для начала, какие задачи должна решать СУБД. Кроме того, наши продукты в основном, не зависят от СУБД (или зависимость крайне слабая). Если бы мы изначально завязывались только на одном вендорном СУБД, мы бы теряли больше половины клиентов. Держать по команде программеров на каждую СУБД по отдельности и писать отдельный код под каждую, это очень накладно. Да и попросту глупо. Возможно, это подходит для одной компании, где разработка ведётся исключительно для себя, можно позволить команде "программистов" делать что угодно и как угодно, т.е. руководству по большему счёту наплевать, лишь бы хоть как-то шевелилось. А таких "разработчиков" лично я собственно к разработчиком, хоть убей, никак причислить не могу. Это лодыри и лентяи, не способные осилить методологию полноценной командной разработки, а также не способные понять что такое база данных, зачем и для чего она нужна. Собственно вести дискуссию на эту тему считаю бессмысленным. Не вижу ничего плохого в наличии T-SQL/PL SQL и прочих скриптовых плюшек в крупных СУБД, часто они могут быть довольно полезными и нужными, но со стороны качественной разработки серьёзных программных продуктов, бабки несущих, программная логики на стороне БД должна быть выпилена, а за попытки туда сунуться, отстрел на месте без суда и следствия. anvanoДля хранения обычных табличек можно взять гораздо более дешевую в лицензировании базу. Глупый и наивный бред, уж извините. Ниче тупее в жизни не слыхал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:07 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoВидимо у вас такой проект, в котором не требуется 1) Десктопный клиент 2) WEB клиент с точно такой же функциональностью 3) Android клиент, который реализует основные функции приложения 4) iOS клиент, который полностью аналогичен андроидному 5) Вторая версия десктопного клиента специально для техсаппорта, реализующая фичи, недоступные ни в одном из вышеперечисленных, но при этом сохраняющие общий с ними функционал И да, забыл сказать, у нас на сегодняшний день таких продуктов даже не одна штука, успешно проданных за очень не смешные деньги. В последнее время успешно осваивается рынок продуктов на WebGL. При чём тут логика в БД -- в упор не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:12 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoИ как перечисленное связано с поддержкой бизнес-логики в 5 клиентах под 4 различных платформы, написанных на 4 различных языках программирования? Реализация даже детально проработанного алгоритма на другом ЯП неизбежно сопряжена с вероятностью появления ошибок. Так зачем реализовывать одно и то же на 4-х языках, если достаточно реализовать в одном месте - в БД ? У вас что, все клиенты напрямую с базой данных общаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVostt бабки несущихПрямо в точку. С технической точки зрения код должен быть ближе к данным, чтобы никто не смог вклинится и накосячить. (аналог - методы у классов ООП, без них можно, но с ними лучше) Но с финансовой точки зрения сразу возникают проблемы 1 Требуется дополнительный программист на процедурном расширение SQL 2 Лишний процессор у СУБД стоит гораздо дороже (по лицензии) чем у аппсервера 3 Лишняя завязка на СУБД мешает продажам коробочного продукта. В общем: бабло побеждает зло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
softwarerАнатоЛойСтранно, я думал что это очевидно: уменьшить затраты "исторического" SELECT на одну из самых частых операций - JOIN... 1. Далеко не факт, что таким образом будут уменьшены какие-то затраты !!! При запросах ВМЕСТО функции "дай запись с таким-то кодом актуальную на такую-то дату" можем сделать этот поиск при сохранении записи в истории. И при работе с историей доя ссылок сразу пользоваться "дай ид записи истории по первичному ключу". Примеры для большего понимания приводить? Да, это не всегда однозначно эффективнее, но я и не догму тут проталкиваю :) 2. Более существенно - крайне не факт, что "исторически правильная запись" существует и только в единственном экземпляре !!! Вы не вчитывались. В идею. Я предлагал менять значения в полях для вторичных ключей. Какая в них может быть не уникальность? ! Ну если не существует, ок, в неё и так нулл запихнуто будет... 3. Ещё более не факт - что никто и никогда не будет редактировать однажды введённые даты. !!! Поменяют даты, поменяются ссылки. Делов-то триггер сгегерировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:35 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛой!!! При запросах ВМЕСТО функции "дай запись с таким-то кодом актуальную на такую-то дату" можем сделать этот поиск при сохранении записи в истории Можем. И получим 1. Далеко не факт, что таким образом будут уменьшены какие-то затраты АнатоЛой!!! Вы не вчитывались. В идею. Вчитывался, к сожалению, куда больше чем она заслуживает. Если пытаться буквально выполнить то, что там написано, то "идея" падает уже на попытке сегодня вставить записи о, например, президентстве Бориса Ельцина - она добросовестно подвяжет "вторичные ключи" на записи, актуальные на 14-й год. Если же предвосхитить громкий крик "да я имел в виду логическую дату инсёрта, ту, что в самой записи", то представьте себе, что в оперативных данных от "президент РФ" протянут внешний ключ к "президент США" и попробуйте использовать свою конструкцию для ответа на вопрос "с кем Ельцин обнимался 10 сентября 98-го года". АнатоЛой!!! Поменяют даты, поменяются ссылки. Делов-то триггер сгегерировать... Ну да, конечно. Итак, 1.09.2014 я вставил запись с date_from = 1.09.2012, date_to = 31.05.2013. 5.09.2014 я отредактировал эту запись, поменяв на date_from = 1.09.2013, date_to = 31.05.2014. Давайте, генерируйте триггер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 00:10 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoskyANAХм, я в замешательстве. Вы не знаете, что такое ООП? Паттерны и прочая муть? И как перечисленное связано с поддержкой бизнес-логики в 5 клиентах под 4 различных платформы, написанных на 4 различных языках программирования? Реализация даже детально проработанного алгоритма на другом ЯП неизбежно сопряжена с вероятностью появления ошибок. Так зачем реализовывать одно и то же на 4-х языках, если достаточно реализовать в одном месте - в БД ?И где Вы выше писали про 4 разных языках программирования? Лично мы пишем все 5 клиентов на одном языке. И я так понимаю, что мобильные клиенты у вас в оффлайн режиме не работают, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 10:53 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
hVosttИнтересует, доводилось ли кому-нибудь проектировать базу данных таким образом, чтобы в программе можно было выбрать дату и посмотреть полное состояние всей системы на это время без артефактов , естественно без возможностей изменения данных? Как будто был произведён откат, но без использования отката, т.е. на уровне данных. При чём в режиме "исторического просмотра" должны полноценно работать все функции системы (просмотр, фильтрация, сортировки и т.д.), кроме создания/изменения данных. hVostt, о каких таких артефактах речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 14:28 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
anvanoВот когда вам потребуется при изменении логики какого-то функционала переписывать ПЯТЬ клиентов, вместо того, чтобы поправить один пакет в базе - тогда и посмотрим, моветон логика в БД или не моветон. зачем переписывать пять клиентов? в таком случае есть сервер приложений, и все клиенты стучатся к одному интерфейсу, и вот за ним стоит бизнес-логика, правишь в одном месте и все работает anvanoПлюс запрещая держать логику в БД для, например, Oracle - вы автоматом выбрасываете на помойку половину функционала БД. Для хранения обычных табличек можно взять гораздо более дешевую в лицензировании базу. зависит от..., например переход с Oracle на MS SQL в вашем случае будет стоить ОЧЕНЬ МНОГО денег и времени, в случае с логикой на сервере приложений - достаточно поменять строку подключения для ORM и при необходимости дописать расширения для преобразования типов данных, в зависимости от типа СУБД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 14:30 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
softwarerАнатоЛой Вы не вчитывались. В идею. Вчитывался, к сожалению, куда больше чем она заслуживает. Э, думаю, моей вины в этом нет, но могу извиниться :). softwarerАнатоЛой!!! Поменяют даты, поменяются ссылки. Делов-то триггер сгегерировать... Ну да, конечно. Итак, 1.09.2014 я вставил запись с date_from = 1.09.2012, date_to = 31.05.2013. 5.09.2014 я отредактировал эту запись, поменяв на date_from = 1.09.2013, date_to = 31.05.2014. Давайте, генерируйте триггер По-моему, я достаточно однозначно определил метод хранения : [b]с одной датой изменения . SERG1257Решения которые надо принять - 1 хранить версии в той же таблице myTable ... или в другой myTable_hist... 2 использовать две даты d_from default(до начала времен), d_to default(конец времен) или одну дату d_change (надежнее, но медленнее выборки) АнатоЛой3.2.Для каждой таблицы из ОБД в ИБД последовательно сделано: ... 3) добавлены доп. поля: ... в) timestamp - дата и время добавления записи в ИБД. ... softwarerАнатоЛой!!! При запросах ВМЕСТО функции "дай запись с таким-то кодом актуальную на такую-то дату" можем сделать этот поиск при сохранении записи в истории Можем. И получим 1. Далеко не факт, что таким образом будут уменьшены какие-то затраты Вы о том, что прогноз по количеству "исторических" обращений должен каким-то образом перекрыть затраты на доп. обработку данных при сохранении? Если да - не возражаю, я с этим согласен. "Практичность" идеи сильно зависит от реальной ситуации, про которую ТС нам сказал очень немного, и это не оценить в количественном выражении: "Путешествия в прошлое планируются не частые, производительность в режиме ретроспективы не критична (т.е. некоторые просадки можно вполне обосновать). Т.е. это не часть бизнес-процесса, это лишь возможность быстрей разобраться при каких-то проблемах и по-ностальгировать начальству." softwarerЕсли пытаться буквально выполнить то, что там написано, то "идея" падает уже на попытке сегодня вставить записи о, например, президентстве Бориса Ельцина - она добросовестно подвяжет "вторичные ключи" на записи, актуальные на 14-й год. Если же предвосхитить громкий крик "да я имел в виду логическую дату инсёрта, ту, что в самой записи", то представьте себе, что в оперативных данных от "президент РФ" протянут внешний ключ к "президент США" и попробуйте использовать свою конструкцию для ответа на вопрос "с кем Ельцин обнимался 10 сентября 98-го года". :) Да, я имел в виду логическую дату инсёрта, ту, что в самой записи. Возможно, я не понял ваш пример. Рассмотрю в отдельном сообщении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 15:04 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
[quot АнатоЛойВы о том, что прогноз по количеству "исторических" обращений должен каким-то образом перекрыть затраты на доп. обработку данных при сохранении? [/quot] Сам "исторический" запрос может работать медленнее (вообще вынося за скобки все сохранение) - за счет того что размер записи больше и данных больше надо поднимать с диска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 15:20 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойhVostt, о каких таких артефактах речь? О будущем. Т.е. ошмётки "будущего" не должны светиться, типа значений справочников, или чего-то ещё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 15:27 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
АнатоЛойПо-моему, я достаточно однозначно определил метод хранения : [b]с одной датой изменения А что такое дата изменения? Скажем, сегодня, 23.09.2014 я хочу вставить в БД информацию о том, что В.В.Путин был президентом РФ с 07.05.2000 по 07.05.2008 и с 07.05.2012 по null. Расскажите, пожалуйста, как эта информация должна лечь в БД? АнатоЛойВы о том, что прогноз по количеству "исторических" обращений должен каким-то образом перекрыть затраты на доп. обработку данных при сохранении? Нет. В первую очередь я о том, что метод выборки "по точной ссылке на версию" вообще не факт что даст какую-то видимую экономию. Это может происходить по двум причинам: а) Интуитивное мнение, что "по точному id найти легче" вовсе не обязано соответствовать действительности. Скажем, индекс по "неточный-id, data" в ряде случаев справится ничуть не хуже б) Отсутствия запросов, где этот заранее просчитанный ключ можно использовать. Скажем, условный сценарий: У нас есть таблицы "Президенты РФ", "Президенты США" и "Кризисы в России". 20.01.1989 строка в таблице ОБД."Президенты США" апдейтится на "Джордж Буш", соответствующий insert уезжает в ИБД. 10.07.1991 в таблицу ОБД."Президенты РФ" вставляется строка "Борис Ельцин", соответствующий insert уезжает в ИБД. Внешний ключ "президент США" при этом указывает на Буша. 20.01.1993 строка в таблице ОБД."Президенты США" апдейтится на "Билл Клинтон", соответствующий insert уезжает в ИБД. 17.08.1998 в таблицу ОБД."Кризисы в России" вставляется строка "Технический дефолт", соответствующий insert уезжает в БД. Внешний ключ "президент России" при этом указывает на Ельцина. 23.09.2014 я получаю задание: для каждого кризиса вывести, кто в это время был президентом РФ и кто - президентом США. Пишу простой запрос и получаю результат: Технический дефолт - Борис Ельцин - Джордж Буш. Чтобы разрулить эту простенькую проблему, придётся дальше насиловать триггера и при вставке Клинтона вставить ещё и другую запись про Ельцина. То есть по факту при изменении любого объекта в БД делать deep copying всех записей, которые прямо или косвенно на него ссылаются. Особенно прикольно это будет в случае циклических ссылок. Размер базы при этом станет таким, что о "ускорении выборки" говорить будет уже просто смешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 15:34 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Мне тоже кажется, что только на пальцах сможем увидеть разногласия. ОК. По 1-му вопросу: softwarerАнатоЛойПо-моему, я достаточно однозначно определил метод хранения : [b]с одной датой изменения А что такое дата изменения? Скажем, сегодня, 23.09.2014 я хочу вставить в БД информацию о том, что В.В.Путин был президентом РФ с 07.05.2000 по 07.05.2008 и с 07.05.2012 по null. Расскажите, пожалуйста, как эта информация должна лечь в БД? Мой вариант под спойлером. softwarer23.09.2014 я хочу вставить в БД информацию о том, что В.В.Путин был президентом РФ с 07.05.2000 по 07.05.2008 и с 07.05.2012 по null. Чтобы проще было работать с примером: 1) идентификаторы записей по всем БД уникальны. 2) для каждой таблицы в первичном идентификаторе есть префикс, уникальный среди всех таблиц 2) В ИБД идентификаторы стартуют со 100. 3) Даты операций отличаются минимум 2 днями, чтобы проще потом демонстрировать запрос на дату между операциями. ОБД: Государства Ид Название (рус) Последняя дата изменения в ОБДГ11 Российская федерация 01.09.2014 Персоны: Ид ФИО Последняя дата изменения в ОБДП21 Путин В.В. 03.09.2014 Главы государств Ид Государство Персона С По Должность Последняя дата изменения в ОБДГГ31 Г11 ГГ21 07.05.2000 07.05.2008 Президент 23.09.2014ГГ32 Г11 ГГ21 07.05.2012 null Президент 23.09.2014 ИБД: Государства Ид Ид (в ОБД) Название (рус) Дата вставки ОперацияИГ111 Г11 Российская федерация 01.09.2014 Insert Персоны: Ид Ид (в ОБД) ФИО Дата вставки ОперацияИП121 П21 Путин В.В. 03.09.2014 Insert Главы государств Ид Ид (в ОБД) Государство (в ОБД) Государство Персона (в ОБД) Персона С По Должность Дата вставки ОперацияИГГ131 ГГ31 Г11 ИГ111 П21 ИП121 07.05.2000 07.05.2008 23.09.2014 Президент InsertИГГ132 ГГ32 Г11 ИГ111 П21 ИП121 07.05.2012 null 23.09.2014 Президент Insert Смело задавайте вопросы :). По второму варианту готовлю отдельное сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 21:03 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
softwarer Нет. В первую очередь я о том, что метод выборки "по точной ссылке на версию" вообще не факт что даст какую-то видимую экономию. Это может происходить по двум причинам: а) Интуитивное мнение, что "по точному id найти легче" вовсе не обязано соответствовать действительности. Скажем, индекс по "неточный-id, data" в ряде случаев справится ничуть не хуже Я уже раза два говорил, что не настаиваю на "полном и безаппеляционном преимуществе" в эффективности моего варианта во всех возможных случаях. Повторюсь ещё раз: да, зависит от СУБД, количества записей, сложности запроса и возможностей оптимизатора. Но зная, что в учётных системах наличие в запросах не больше пары-тройки таблиц или эффективность (или даже возможность!) использования индексов по функции - бааальшой вопрос, предложил вариант решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 21:17 |
|
||
|
Путешествия в прошлое
|
|||
|---|---|---|---|
|
#18+
Без понимания работы ОБД какой бы красивый механизм с ИБД я не придумал, просто объяснить работу ИБД я не смогу. Поэтому прошу уточнить условный сценарий: softwarerСкажем, условный сценарий: 1) [i]У нас есть таблицы "Президенты РФ", "Президенты США" и "Кризисы в России". 2) 20.01.1989 строка в таблице ОБД."Президенты США" апдейтится на "Джордж Буш", соответствующий insert уезжает в ИБД. Уточните: в ОБД строка апдейтится или инсертится? 3) 10.07.1991 в таблицу ОБД."Президенты РФ" вставляется строка "Борис Ельцин", соответствующий insert уезжает в ИБД. Внешний ключ "президент США" при этом указывает на Буша. Речь идёт о внешнем ключе "президент США" из таблицы "Президенты РФ" на таблицу "Президенты США"? Если да - смысл внешнего ключа "А в это время в США президентом был ..."? 4) 20.01.1993 строка в таблице ОБД."Президенты США" апдейтится на "Билл Клинтон", соответствующий insert уезжает в ИБД. Уточните: в ОБД строка апдейтится или инсертится? 5) 17.08.1998 в таблицу ОБД."Кризисы в России" вставляется строка "Технический дефолт", соответствующий insert уезжает в БД. Внешний ключ "президент России" при этом указывает на Ельцина. Уточните: смысл внешнего ключа "А в это время в России президентом был ..."? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 21:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1540795]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
279ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 392ms |

| 0 / 0 |

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