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