Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Добрый день!
Есть однопользовательская БД, которая нормально спроектирована и работает на SQLite. Сейчас возникла задача сделать её многопользовательской на основе MS SQL Server или чём-то подобном.
Сложность заключается в следующем: есть основная таблица r_objects, где находятся некие объекты, упорядоченные в виде дерева. И есть масса вспомогательных таблиц, данные в которых принадлежат конкретному объекту.
Логика обработки этих данных требует при указании конкретного объекта загрузить их все в память, и там обрабатывать (корректировать, выполнять расчеты, представлять в виде графиков и т.д.)
После выполнения всех действий, если возникли изменения в данных (а они могут кардинально поменяться), необходимо записать данные обратно. Пока это однопользовательская БД, это нормально.
Но в многопользовательской среде 2 оператора могут корректировать один и то же объект (а время коррекции получается достаточно длительное) и каждый может перезаписать свою версию данных. Ситуация усугубляется тем, что пользователи могут быть разнесены на тысячи километров.
Вопрос: как синхронизировать такие коллизии?
3 июн 19, 11:43    [21900247]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
NewBy52,

если не секрет, клиент на чём? В общем случае механизм корректировки данных нужно менять. Кто придумал такую логику работы, не спрашиваю.
3 июн 19, 12:09    [21900293]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

NewBy52
Вопрос: как синхронизировать такие коллизии?

Ответ: выяснить какого чёрта два оператора лезут в один и тот же объект и разнести его на
два разных.

Posted via ActualForum NNTP Server 1.5

3 июн 19, 12:58    [21900372]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
KreatorXXI
NewBy52,
если не секрет, клиент на чём? В общем случае механизм корректировки данных нужно менять.

Я понимаю, что надо менять. Вопрос - как менять. Если данные не загрузить в память, некоторые операции будут считаться о-чень долго. Придумать бы какой-нибудь семафор, говорящий о том, что объект занят. Но 100% надёжного придумать не могу.
3 июн 19, 13:08    [21900382]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

NewBy52
Вопрос - как менять.

Заведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе
та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя
решить какая из них правильнее. Так работают все VCS.

Posted via ActualForum NNTP Server 1.5

3 июн 19, 13:10    [21900388]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
L_argo
Member

Откуда:
Сообщений: 889
NewBy52
Вопрос: как синхронизировать такие коллизии?
Не допускать их.

У вас очень странная работа с данными. Как один и тот же показатель может быть разным у двух юзеров ?
3 июн 19, 13:10    [21900389]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Dimitry Sibiryakov
Ответ: выяснить какого чёрта два оператора лезут в один и тот же объект и разнести его на
два разных.

Ну, право-то имеют. Но не одновременно. Выше написал, что семафор, говорящий: "занято для коррекции", устроил бы. Вопрос - как.
3 июн 19, 13:10    [21900390]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

NewBy52
Ну, право-то имеют. Но не одновременно.

Почему нет? Один-то всегда данные сохранит позже, он и будет прав.

Posted via ActualForum NNTP Server 1.5

3 июн 19, 13:13    [21900394]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
L_argo
У вас очень странная работа с данными. Как один и тот же показатель может быть разным у двух юзеров ?

Может.
автор
Есть многое на свете, друг Горацио...
3 июн 19, 13:15    [21900398]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Dimitry Sibiryakov
Почему нет? Один-то всегда данные сохранит позже, он и будет прав.

Не обязательно. Если юзер более высокого статуса (в плане знаний предмета) сохранит данные, а юзер более низкого статуса (находящийся порой за тысячи километров) сохранит их позже, и затрёт данные первого пользователя, это будет нехорошо. Поэтому, второй пользователь должен видеть, что сейчас стоит отказаться от сохранения данных.
3 июн 19, 13:20    [21900404]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Dimitry Sibiryakov
Заведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе
та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя
решить какая из них правильнее. Так работают все VCS.

А вот это мысль очень полезная для меня. Спасибо, надо будет обдумать.
3 июн 19, 13:21    [21900408]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
NewBy52
Dimitry Sibiryakov
Заведи поле "версия объекта". Перед попыткой сохранения - проверяй, что эта версия в базе
та же, что была при загрузке объекта. Если нет - грузи новую версию и проси пользователя
решить какая из них правильнее. Так работают все VCS.

А вот это мысль очень полезная для меня. Спасибо, надо будет обдумать.

Да, это решит проблему. Ещё раз спасибо.
3 июн 19, 13:31    [21900423]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
L_argo
Member

Откуда:
Сообщений: 889
Нужно вообще пересмотреть схему работы с данными.
Текущая схема ущербна.
3 июн 19, 13:42    [21900445]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
NewBy52,

надо всё-таки исходить из того, что разные пользователи могут одновременно править разные данные одного объекта. Почему нет? Таблицы же разные. Вот когда два пользователя правят одну и ту же запись в одной и той же таблице, то тогда должно быть сообщение пользователям о проблеме. Но это стандартный механизм работы с БД. Почему я и спрашиваю о клиенте.
3 июн 19, 13:43    [21900449]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
KreatorXXI
NewBy52,
надо всё-таки исходить из того, что разные пользователи могут одновременно править разные данные одного объекта. Почему нет? Таблицы же разные. Вот когда два пользователя правят одну и ту же запись в одной и той же таблице, то тогда должно быть сообщение пользователям о проблеме. Но это стандартный механизм работы с БД. Почему я и спрашиваю о клиенте.

Я знаю стандартный механизм работы с БД. Но тут "правка" может подразумевать удаление 1000+ записей вспомогательной таблицы и заполнение её 2000+ других записей (или наоборот). И так по всем вспомогательным таблицам. Потому что многие записи расчетные. Но одновременно их можно и индивидуально править. Таково было ТЗ.
3 июн 19, 14:01    [21900485]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Компьютеры на Win7. СУБД пока не выбрана.
3 июн 19, 14:04    [21900493]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
NewBy52,

какое-то противоречивое ТЗ. Наверно рано говорить о практической реализации. Надо понять какие данные могут одновременно редактироваться. Можно пойти, например, таким путём. Один пользователь "взял" объект (в каком-нибудь поле главной таблицы появляется идентификатор "взявшего"). Всем остальным отлуп до тех пор пока "взявший" не внесёт все изменения.
3 июн 19, 14:09    [21900506]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
KreatorXXI
NewBy52,
Один пользователь "взял" объект (в каком-нибудь поле главной таблицы появляется идентификатор "взявшего"). Всем остальным отлуп до тех пор пока "взявший" не внесёт все изменения.

Это не сработает. Свет отключили у пользователя, и объект завис для всех.
3 июн 19, 14:11    [21900511]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
А вот схема, предложенная Дмитрием, проблему закрывает. Собственно, я уже получил ответ на вопрос.
3 июн 19, 14:17    [21900517]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

KreatorXXI
Почему нет?

Потому что это проклятая проблема компетенции, лежащая за пределами компьютеров. Данные
которого из пользователей правильные? Если они говорит "небо голубое", а другой "небо
серое" - кто врёт?

Posted via ActualForum NNTP Server 1.5

3 июн 19, 14:22    [21900527]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 780
Dimitry Sibiryakov,

была бы одна/несколько таблиц, то с версионностью можно было бы жить. А если масса подчинённых таблиц, да ещё удаления/добавления тысячами, проверка перед записью будет занимать нехилое время. Ещё где-то "старые" данные нужно хранить. Я поэтому и говорю - может ТЗ чуть подправить?
3 июн 19, 14:38    [21900546]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7827
KreatorXXI
Ещё где-то "старые" данные нужно хранить

Зачем старые данные? Номера версии вполне достаточно

Банальное сравнение номера версии перед UPDATE'ом. Если не совпадает - ошибка и транзакция ROLLBACK.

IMHO Так обычно оптимистичная блокировка и работает.
3 июн 19, 14:41    [21900547]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7827
NewBy52
Это не сработает. Свет отключили у пользователя, и объект завис для всех.

Жесть какая. Блокировки обычно отслеживаются на уровне ОС (ну или СУБД).

Отключение света никак не мешает. Свет отключился, сетевая карта выключилась, сеанс прервался, блокировки снялись

p.s. SQLLite блокировками OS пользуется. AFAIK по гуглю.
3 июн 19, 14:46    [21900552]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
NewBy52
Member

Откуда: Воронеж
Сообщений: 24
Leonid Kudryavtsev
NewBy52
Это не сработает. Свет отключили у пользователя, и объект завис для всех.

Жесть какая. Блокировки обычно отслеживаются на уровне ОС (ну или СУБД).

Отключение света никак не мешает. Свет отключился, сетевая карта выключилась, сеанс прервался, блокировки снялись

Вы невнимательно прочитали цепочку ответов.
3 июн 19, 15:24    [21900605]     Ответить | Цитировать Сообщить модератору
 Re: Сложность при проектировании многопользовательской БД на основе однопользовательской.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7827
Ну, право-то имеют. Но не одновременно. Выше написал, что семафор, говорящий: "занято для коррекции", устроил бы. Вопрос - как.

Семафор в нормальных SQL Server'ах обычно:
SELECT FOR UPDATE
но блокировать на долгое время не есть айс + некоторые СУБД блокируют не запись, а страницу AFAIK

Если не хочется стандартные семафоры, то 95% СУБД предоставляют возможность пользовательских семафоров (вроде, не точно: Oracle DBMS_LOCK, PostgreSQL - Advisory Locks, MS SQL не знаю).

Проблемы с "выключили питание" быть не должно

Если хранить дополнительную информацию, то наверное отдельная табличка + автономные транзакции

Но сначала стоит определится, что же хочется:

писсимистик блокировку - "семафор, говорящий: "занято для коррекции", устроил бы"
или ему писсимистичной не хватает, и хочется оптимистичную - версия
или какую-то помесь писсимистик + оптимистик
3 июн 19, 15:41    [21900621]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Проектирование БД Ответить