Имя: Пароль:
IT
Админ
Как сделать откат или применение изменений к 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 элемента, видеть подчиненные ему не надо, их нужно обрабатывать на программном уровне. То есть оператору ты показываешь только объекты инициаторы, объекты измененные программно не показываешь
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан