|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Добрый день! Есть однопользовательская БД, которая нормально спроектирована и работает на SQLite. Сейчас возникла задача сделать её многопользовательской на основе MS SQL Server или чём-то подобном. Сложность заключается в следующем: есть основная таблица r_objects, где находятся некие объекты, упорядоченные в виде дерева. И есть масса вспомогательных таблиц, данные в которых принадлежат конкретному объекту. Логика обработки этих данных требует при указании конкретного объекта загрузить их все в память, и там обрабатывать (корректировать, выполнять расчеты, представлять в виде графиков и т.д.) После выполнения всех действий, если возникли изменения в данных (а они могут кардинально поменяться), необходимо записать данные обратно. Пока это однопользовательская БД, это нормально. Но в многопользовательской среде 2 оператора могут корректировать один и то же объект (а время коррекции получается достаточно длительное) и каждый может перезаписать свою версию данных. Ситуация усугубляется тем, что пользователи могут быть разнесены на тысячи километров. Вопрос: как синхронизировать такие коллизии? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 11:43 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52, если не секрет, клиент на чём? В общем случае механизм корректировки данных нужно менять. Кто придумал такую логику работы, не спрашиваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 12:09 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Вопрос: как синхронизировать такие коллизии? Ответ: выяснить какого чёрта два оператора лезут в один и тот же объект и разнести его на два разных. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 12:58 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
KreatorXXINewBy52, если не секрет, клиент на чём? В общем случае механизм корректировки данных нужно менять. Я понимаю, что надо менять. Вопрос - как менять. Если данные не загрузить в память, некоторые операции будут считаться о-чень долго. Придумать бы какой-нибудь семафор, говорящий о том, что объект занят. Но 100% надёжного придумать не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:08 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Вопрос - как менять. Заведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя решить какая из них правильнее. Так работают все VCS. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:10 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Вопрос: как синхронизировать такие коллизии?Не допускать их. У вас очень странная работа с данными. Как один и тот же показатель может быть разным у двух юзеров ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:10 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovОтвет: выяснить какого чёрта два оператора лезут в один и тот же объект и разнести его на два разных. Ну, право-то имеют. Но не одновременно. Выше написал, что семафор, говорящий: "занято для коррекции", устроил бы. Вопрос - как. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:10 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Ну, право-то имеют. Но не одновременно. Почему нет? Один-то всегда данные сохранит позже, он и будет прав. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:13 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
L_argoУ вас очень странная работа с данными. Как один и тот же показатель может быть разным у двух юзеров ? Может. авторЕсть многое на свете, друг Горацио... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:15 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovПочему нет? Один-то всегда данные сохранит позже, он и будет прав. Не обязательно. Если юзер более высокого статуса (в плане знаний предмета) сохранит данные, а юзер более низкого статуса (находящийся порой за тысячи километров) сохранит их позже, и затрёт данные первого пользователя, это будет нехорошо. Поэтому, второй пользователь должен видеть, что сейчас стоит отказаться от сохранения данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:20 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЗаведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя решить какая из них правильнее. Так работают все VCS. А вот это мысль очень полезная для меня. Спасибо, надо будет обдумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:21 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Dimitry SibiryakovЗаведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя решить какая из них правильнее. Так работают все VCS. А вот это мысль очень полезная для меня. Спасибо, надо будет обдумать. Да, это решит проблему. Ещё раз спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:31 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Нужно вообще пересмотреть схему работы с данными. Текущая схема ущербна. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:42 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52, надо всё-таки исходить из того, что разные пользователи могут одновременно править разные данные одного объекта. Почему нет? Таблицы же разные. Вот когда два пользователя правят одну и ту же запись в одной и той же таблице, то тогда должно быть сообщение пользователям о проблеме. Но это стандартный механизм работы с БД. Почему я и спрашиваю о клиенте. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 13:43 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
KreatorXXINewBy52, надо всё-таки исходить из того, что разные пользователи могут одновременно править разные данные одного объекта. Почему нет? Таблицы же разные. Вот когда два пользователя правят одну и ту же запись в одной и той же таблице, то тогда должно быть сообщение пользователям о проблеме. Но это стандартный механизм работы с БД. Почему я и спрашиваю о клиенте. Я знаю стандартный механизм работы с БД. Но тут "правка" может подразумевать удаление 1000+ записей вспомогательной таблицы и заполнение её 2000+ других записей (или наоборот). И так по всем вспомогательным таблицам. Потому что многие записи расчетные. Но одновременно их можно и индивидуально править. Таково было ТЗ. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:01 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Компьютеры на Win7. СУБД пока не выбрана. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:04 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52, какое-то противоречивое ТЗ. Наверно рано говорить о практической реализации. Надо понять какие данные могут одновременно редактироваться. Можно пойти, например, таким путём. Один пользователь "взял" объект (в каком-нибудь поле главной таблицы появляется идентификатор "взявшего"). Всем остальным отлуп до тех пор пока "взявший" не внесёт все изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:09 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
KreatorXXINewBy52, Один пользователь "взял" объект (в каком-нибудь поле главной таблицы появляется идентификатор "взявшего"). Всем остальным отлуп до тех пор пока "взявший" не внесёт все изменения. Это не сработает. Свет отключили у пользователя, и объект завис для всех. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:11 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
А вот схема, предложенная Дмитрием, проблему закрывает. Собственно, я уже получил ответ на вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:17 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
KreatorXXIПочему нет? Потому что это проклятая проблема компетенции, лежащая за пределами компьютеров. Данные которого из пользователей правильные? Если они говорит "небо голубое", а другой "небо серое" - кто врёт? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:22 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, была бы одна/несколько таблиц, то с версионностью можно было бы жить. А если масса подчинённых таблиц, да ещё удаления/добавления тысячами, проверка перед записью будет занимать нехилое время. Ещё где-то "старые" данные нужно хранить. Я поэтому и говорю - может ТЗ чуть подправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:38 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
KreatorXXIЕщё где-то "старые" данные нужно хранить Зачем старые данные? Номера версии вполне достаточно Банальное сравнение номера версии перед UPDATE'ом. Если не совпадает - ошибка и транзакция ROLLBACK. IMHO Так обычно оптимистичная блокировка и работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:41 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
NewBy52Это не сработает. Свет отключили у пользователя, и объект завис для всех. Жесть какая. Блокировки обычно отслеживаются на уровне ОС (ну или СУБД). Отключение света никак не мешает. Свет отключился, сетевая карта выключилась, сеанс прервался, блокировки снялись p.s. SQLLite блокировками OS пользуется. AFAIK по гуглю. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 14:46 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevNewBy52Это не сработает. Свет отключили у пользователя, и объект завис для всех. Жесть какая. Блокировки обычно отслеживаются на уровне ОС (ну или СУБД). Отключение света никак не мешает. Свет отключился, сетевая карта выключилась, сеанс прервался, блокировки снялись Вы невнимательно прочитали цепочку ответов. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 15:24 |
|
Сложность при проектировании многопользовательской БД на основе однопользовательской.
|
|||
---|---|---|---|
#18+
Ну, право-то имеют. Но не одновременно. Выше написал, что семафор, говорящий: "занято для коррекции", устроил бы. Вопрос - как. Семафор в нормальных SQL Server'ах обычно: SELECT FOR UPDATE но блокировать на долгое время не есть айс + некоторые СУБД блокируют не запись, а страницу AFAIK Если не хочется стандартные семафоры, то 95% СУБД предоставляют возможность пользовательских семафоров (вроде, не точно: Oracle DBMS_LOCK, PostgreSQL - Advisory Locks, MS SQL не знаю). Проблемы с "выключили питание" быть не должно Если хранить дополнительную информацию, то наверное отдельная табличка + автономные транзакции Но сначала стоит определится, что же хочется: писсимистик блокировку - "семафор, говорящий: "занято для коррекции", устроил бы" или ему писсимистичной не хватает, и хочется оптимистичную - версия или какую-то помесь писсимистик + оптимистик ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2019, 15:41 |
|
|
start [/forum/topic.php?fid=32&msg=39821622&tid=1539914]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 166ms |
0 / 0 |