|
Как сделать откат или применение изменений к SQL базе (не 1С) | ☑ | ||
---|---|---|---|---|
0
D_Pavel
09.05.16
✎
18:50
|
Один человек редактирует данные, в базу отправляются запросы, человек видит результат сразу.
Второй человек проверяет что сделал первый человек, и подтверждает или отклоняет изменения. Как такое реализовать бы? |
|||
1
D_Pavel
09.05.16
✎
18:52
|
База MySQL если это важно
|
|||
2
Звездец
09.05.16
✎
19:19
|
1-й изменяет данные в одной таблице, второй подтверждает, тогда процедура переносит данные в основную таблицу, нет - замещает из основной неизменными или просто удаляет данные в первой
|
|||
3
Pistol
09.05.16
✎
19:27
|
(0) Использовать версионность записей.
Дальнейшая логика зависит от политики обработки. Например, если новые данные должны быть доступны сразу, то последующее "утверждение" сводится к удалению всех поколений кроме нужного. "Отклонение" - к удалению временного поколения. Или разнос по разным таблицам, как в (2) |
|||
4
Звездец
09.05.16
✎
19:35
|
(3) только ничего штатного для версионности в mysql вроде нет. Так что придется ее изобрести. Или может я ошибаюсь
Вот интересная статейка https://habrahabr.ru/post/136202/ как отправная точка для осмысливания. Есть там еще ряд интересных комментариев. А так дай больше подробностей, какие данные нужно версионировать. Я пока понимаю, что нужно некое подобие премодерации изменений на сайте? |
|||
5
D_Pavel
09.05.16
✎
19:51
|
(2) Если использовать вторую таблицу, то не понятно что делать если вдруг возникнет такая ситуация: Одно изменение отклонили, следующее изменение связано с отклоненным и без него будет ошибочным. Как такое отследить и не дать накатывать конфликтующие изменения?
|
|||
6
D_Pavel
09.05.16
✎
19:52
|
(3) Я не совсем поннимаю что значит версионность записей.
|
|||
7
D_Pavel
09.05.16
✎
19:55
|
(3) А, понял. То есть если мне нужно отклонить какое-то изменение, то все изменения сделанные после него тоже отклонятся? Таким образом избегаем конфликтов.
Но это не подходит, потому что последующие изменения не все нужно отменить. |
|||
8
D_Pavel
09.05.16
✎
19:57
|
(4) Данные - это каталог клиентов. Их нужно редактировать, удалять, переносить в категории, объединять дубли (вместе с их подчиненными элементами)
|
|||
9
Pistol
09.05.16
✎
20:04
|
(7) Введи сущность "изменение", возможно синтетическую. Идентификатор этой сущности будет версией записи.
|
|||
10
D_Pavel
09.05.16
✎
20:13
|
(9) Опять таки не понятно как отследить взаимосвязанные изменения которые нельзя отклонять по отдельности, а можно только вместе.
|
|||
11
Звездец
09.05.16
✎
20:24
|
(10) начни с более точной постановки задачи, далеко не всегда, отклонив более раннее изменение возможно сохранить более позднее ввиду разрушения взаимосвязей. Может лучше модерацию изменений проводить в обратном порядке: если тебя устраивает самая новая версия, то зачем тебе сдались промежутки?
|
|||
12
D_Pavel
09.05.16
✎
20:29
|
(11) Как раз если устраивает самая новая версия то проблем никаких нет.
Плохое начинается когда она не устраивает по причине какого-то изменения которое далеко не последнее. |
|||
13
Звездец
09.05.16
✎
20:34
|
(12) значит отбрасываешь последнюю и переходишь к предпоследней и так далее
|
|||
14
D_Pavel
09.05.16
✎
20:56
|
(13) И все нужные изменения оказываются выброшены. Это плохо. Писал уже в (7).
|
|||
15
Pistol
09.05.16
✎
21:14
|
(10) Взаимосвязанные изменения будут иметь одинаковый идентификатор. Все модификации таблицы сводятся к добавлению записей с нужной версией. Ну, еще флаг удаления придется сделать - или прямо в таблице или в сущности "изменение". Которое как раз является предметом "утверждения" или "отклонения".
|
|||
16
Звездец
09.05.16
✎
21:19
|
(14) как это нужные выброшены? если самая новая редакция не нужна и ты ее отбросил и перешел к предпоследней, что в данном случае выброшено нужного?
|
|||
17
D_Pavel
09.05.16
✎
21:50
|
(15) Осталось придумать как присваивать одинаковый идентификатор взаимосвязанным изменениям. Точнее, как вычислить что изменения взаимосвязаны. Если это вычислить нельзя, и другим способом задачу решить нельзя, тогда задача не решаема.
|
|||
18
D_Pavel
09.05.16
✎
21:52
|
(16) Не то чтобы вся новая редакция не нужна. Она нужна, но не вся. Частично. За вычетом не нужных изменений.
|
|||
19
Звездец
09.05.16
✎
21:54
|
(18) то есть версионировать нужно тебе не весь объект в целом, а его реквизиты скажем так?
|
|||
20
Pistol
09.05.16
✎
22:19
|
(17) Кажется, ты путаешь понятия "изменения" и "версия". Оперировать надо не изменениями в состоянии от версии к версии, а "срезом". Записывай все изменения при "утверждении" одной транзакцией с одним идентификатором.
|
|||
21
D_Pavel
10.05.16
✎
07:14
|
Вы кажется не поняли. Объясню на пальцах:
Оператор удалил клиента "ООО Винторг" Оператор объединил клиента "ООО Варадат" и "Варадат ООО" Проверяющий решил что "удалять" того клиента не нужно и отменил это изменение, но при этом "объединение" одобрил и оставил. По вашему же получается что проверяющий отменяет все изменения как "удаление" так и "объединение", а это не подходит. |
|||
22
Pistol
10.05.16
✎
07:21
|
(21) Значит у тебя, согласно твоей теории об утверждениях и отклонениях было два изменения, а не одно Одно удаление, второе - объединение. Одно утверждено, второе - отклонено.
|
|||
23
D_Pavel
10.05.16
✎
07:33
|
(22) Конечно. Я так и написал
|
|||
24
Pistol
10.05.16
✎
07:37
|
(23) Тогда еще раз и медленно.
У тебя. Было. Два. Изменения. Значит. В базе появится. Два. Идентификатора "среза" или "версии". Записи. По каждому. Из них. Можно. Утвердить - оставить. Или удалить - отклонить. |
|||
25
D_Pavel
10.05.16
✎
07:40
|
(24) Все верно, я так и написал.
|
|||
26
Pistol
10.05.16
✎
07:42
|
(25) Ок. Тогда можешь приступать.
|
|||
27
D_Pavel
10.05.16
✎
09:46
|
(26) как только найду ответ на свой вопрос
|
|||
28
Звездец
10.05.16
✎
09:54
|
(21) клиент винторг это один элемен его и версионируй
варадат - это другой. Зачем смешивать 2 независимых элемента в версионировании между собой? Версии существуют только в зоне одного элемента БД, и если ты отклонил версию первого, то причем тут второй, они ни коим образом не должны быть связаны |
|||
29
D_Pavel
10.05.16
✎
10:20
|
(28) "ООО Варадат" и "Варадат ООО" - это один объект или разные? У них еще подчиненные элементы справочника торговых точек имеются.
|
|||
30
Звездец
10.05.16
✎
10:23
|
(29) это 2 объекта, которые станут одним. И пока не будет подтверждения, второй из базы физически не удаляется. Все подчиненные тоже обрабатываешь в при изменении и версионируешь независимо, при откате также выбираешь и откатываешь. Каждый в отдельности.
|
|||
31
D_Pavel
10.05.16
✎
12:29
|
(30) Так не подойдет. Оператор должен видеть результат сразу, иначе запутается что сделал, а что нет.
|
|||
32
Звездец
10.05.16
✎
12:33
|
(31) какой результат? он видит что объединены 2 элемента, видеть подчиненные ему не надо, их нужно обрабатывать на программном уровне. То есть оператору ты показываешь только объекты инициаторы, объекты измененные программно не показываешь
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |