powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выдача уникальных номеров из ограниченного списка и по кругу.
7 сообщений из 7, страница 1 из 1
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39126424
vladgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день(вечер,утро).

Подскажите, пожалуйста, как сделать следующее:

Есть задача создавать некие элементы конфигурации. Количество этих элементов ограничено, допустим от 1 до 500.
Т.е. когда приложение создает элемент конфигурации, то оно должно в БД записать индекс этого элемента (1..500).
Индекс элемента не должен повторяться с другими элементами, при этом запись элемента можно пометить на удаление и тогда можно создать еще один элемент с таким же индексом (другая запись с таким же числом, т.е. уникальность поля очень не желательно использовать).
Еще одно условие, что все выдаваемые значения индексов должны увеличиваться, и только когда достигнут верхней границы снова переходят по кругу к 1. Естественно, занятые индексы использовать нельзя. Если свободных нет, то просто сообщение об ошибке.
Свободным считается или индекс помеченный на удаление или отсутствующий в таблице с элементами конфигурации.

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

Но вот, думаю, что такой подход в корне неправильный при многопользовательской работе, только вот как правильно сделать пока не придумал.

Нужно, чтобы в многопользовательском режиме разные пользователи могли создавать элементы конфигурации и индексы этих элементов не пересекались.

Подскажите как можно поступить в данном случае.

P.S.
БД - Firebird 2.5


...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39126432
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgulПодскажите как можно поступить в данном случае.
Транзакцией, которая будет всё это делать ставишь лок на запись на таблицу выданных
значений и работа механизма сводится к однопользовательской.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39126438
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgul,

Модуль получения очередного индекса автономный, возможно резидентный, на вход старый индекс + еще чего, на выходе новый индекс... обслуживает очередь...
Можно попробовать организовать через таблицу:
- ид (счетчик)
- старый индекс
- новый индекс
- признак (0 - не обработан, 1- обработан)
Клиентское приложение создаёт новую запись и запоминает ид
Модуль анализирует признаки с нулем от начала, пишет новые индексы и меняет признаки на 1
Клиент ждет пока у ид ноль не изменится на 1 и забирает новый индекс
Если есть возможность использования триггеров на сервере БД, то можно сделать еще проще, но имхо без резидента и очереди уйти от перехлестов будет трудновато...
...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39126461
vladgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще сразу не сказал, что после того как пользователь добавляет новый элемент у него транзакция открыта до тех пор, пока он не кликнет по кнопке "Сохранить" (читай commit). Также есть возможность все откатить. Так сделано, потому что пользователь может изменить сразу несколько записей (Multiselect) в таблице и у него должна быть возможность отменить изменения.

Dimitry SibiryakovvladgulПодскажите как можно поступить в данном случае.
Транзакцией, которая будет всё это делать ставишь лок на запись на таблицу выданных
значений и работа механизма сводится к однопользовательской.

Все дело в том, что нужно реализовать именно многопользовательский режим работы. Т.к. насколько я понял, в предложенном варианте, пока пользователь на подтвердит изменения все остальные не смогут выполнять аналогичные действия.

vmagvladgul,

Модуль получения очередного индекса автономный, возможно резидентный, на вход старый индекс + еще чего, на выходе новый индекс... обслуживает очередь...
Не совсем понял, резидентный модуль это что? процедура на стороне сервера, которая выполняется все время? Тут моих знаний не хватает.
Или это вообще отдельное приложение, которое именно этим и занимается (т.е. по факту еще один клиент БД)?

vmagМожно попробовать организовать через таблицу:
- ид (счетчик)
- старый индекс
- новый индекс
- признак (0 - не обработан, 1- обработан)
Клиентское приложение создаёт новую запись и запоминает ид
Модуль анализирует признаки с нулем от начала, пишет новые индексы и меняет признаки на 1
Клиент ждет пока у ид ноль не изменится на 1 и забирает новый индекс
Если есть возможность использования триггеров на сервере БД, то можно сделать еще проще, но имхо без резидента и очереди уйти от перехлестов будет трудновато...
Также, не уловил идею.
Допустим, приложение определило какой в текущий момент времени индекс свободен и записывает его в "старый индекс".
Затем, "что-то монопольное со стороны БД" проходит таблицу и подтверждает первую запись с таким индексом, если встречает такой же дублированный номер, то ищет следующий свободный индекс и подтверждает его. Не нашла, также в "признак" - 2
А как с триггерами? На какие события?
...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39127336
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgul,

vladgul...

1. Табличка Элементов Конфигураций (ITEMS):
id - первичный ключ
...
idxs_id - ссылка на id записи таблицы индексов. Значение должно быть not null.


2. Табличка Индексов (IDXS) со списком всех индексов: 500 записей.
id - первичный ключ
Index_Value - символическое имя индекса (например, номер от 1 до 500).
items_id - ссылка на id записи таблицы Элементов конфигураций. Допустимо значение null.

(id и index_value могут быть одним полем)
~~~~~~~~~~~
Таким образом, каждый индекс может ссылаться только на один элемент конфигурации.
А каждый элемент конфигурации может ссылаться на один и более индексов.

Выборка всех items:
select * from items
join idxs on items.idxs_id = idxs.id

Если в выборке items.id == idxs.items_id, => это рабочий элемент, иначе считаем, что он помечен на удаление.

Выборка очередного незанятого индекса - по признаку idxs.items_id is null.
В цикле, пока либо не останется незанятых индексов, либо пока попытка записи (insert item+update idxs) не завершится с успехом.

~~~~~~~~~~~
crate items
и
update idxs
- лучше производить в одной транзакции, иначе может оказаться ситуация, когда только что созданный item будет переведен в разряд "помечен на удаление".
...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39127343
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgulЕще сразу не сказал, что после того как пользователь добавляет новый элемент
у него транзакция открыта до тех пор, пока он не кликнет по кнопке "Сохранить" (читай
commit). Также есть возможность все откатить. Так сделано, потому что пользователь может
изменить сразу несколько записей (Multiselect) в таблице и у него должна быть возможность
отменить изменения.
Ну так ничего не мешает при нажатии на кнопку "Сохранить" стартовать ещё одну транзакцию с
нужными параметрами, получить номера, а потом присвоить их.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выдача уникальных номеров из ограниченного списка и по кругу.
    #39149420
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет vladgul

Не очень понятно конечное использование данного механизма, когда код занят записью помеченной на удаление - что видит конечный пользователь?

vladgulИндекс элемента не должен повторяться с другими элементами, при этом запись элемента можно пометить на удаление

и как много записей типа: код=250, удалить=да
могут существовать в таблице?
почему сразу не удалить? или к примеру не переместить в архивную таблицу для дальнейших разборов полетов?

vladgulЕще одно условие, что все выдаваемые значения индексов должны увеличиваться, и только когда достигнут верхней границы снова переходят по кругу к 1. Естественно, занятые индексы использовать нельзя. Если свободных нет, то просто сообщение об ошибке.

Ну как бы это не сложная задача, обычный счетчик, из которого выделяется остаток от деления на 500 и увеличивать его пока выдается ошибка использования - "данный код присутствует".


vladgulПодскажите как можно поступить в данном случае.


1. Удалять все записи сразу,а не помечать их на удаление, на крайний случай переносить записи в архив
2. использовать обычный генератор, но значение брать в виде остатка от деления на 500, чтобы алгоритм не был бесконечным, запоминается начальное значение и если снова получаем его - то все занято
3. описать что именно должен получить конечный пользователь и почему (хоть приблизительно :) )
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выдача уникальных номеров из ограниченного списка и по кругу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]