|
|
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
Есть таблица NUMS с диапазонами номеров, которая содержит поля: NUM_FROM number(10,0) - номер с NUM_TO number(10,0) - номер по PREFIX varchar2(12) - префикс POSTFIX varchar2(12) - постфикс LENGTH number(2,0) - длина Каждая запись в этой таблице - это диапазон номеров с NUM_FROM по NUM_TO, к каждому номеру добавляется префикс PREFIX и постфикс POSTFIX (если есть) и дополняется нулями слева до нужной длины LENGTH. Т.е. например запись вида: NUM_FROM=1, NUM_TO=1000000, PREFIX=ТЕСТ/, POSTFIX=/2017, LENGTH=7 описывает номера: ТЕСТ/0000001/2017 ТЕСТ/0000002/2017 ТЕСТ/0000003/2017 ... ТЕСТ/0999999/2017 ТЕСТ/1000000/2017 На всякий случай скажу, что диапазоны не пересекаются, т.е. нельзя создать другую запись, номера которой будут входить в уже ранее созданный диапазон, например, NUM_FROM=1, NUM_TO=2000000, PREFIX=ТЕСТ/, POSTFIX=/2017 создать нельзя. Итого, есть таблица с диапазоном номеров и есть 5 других таблиц (T1, T2, T3, T4, T5), никак не связанных между собой, в каждой из которых есть поле NUM типа varchar2(50). Этот номер пользователь может как ввести руками, так и выбрать из любого диапазонов номеров, описанных выше. Если пользователь выбирает номер из диапазона, то ему нужно предложить первый (минимальный) свободный номер, т.е. номер из выбранного диапазона, которого нет ни в одной из 5 таблиц (T1, T2, T3, T4, T5). Как это организовать наиболее оптимально? Попробовал написать что-то типа такого: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Т.е. из всего массива номеров диапазона вычитаем занятые и находим минимальный из полученных номеров (после для полученного числа добавим префикс и постфикс). Работает, но не быстро. Мне кажется, можно все сделать как-то оптимальнее и элегантнее. Есть идея сделать еще одну таблицу NUMS_CONT, где при создании нового диапазона будут создаваться все номера из этого диапазона, а на таблицы T1, T2, T3, T4, T5 повесить триггера, чтобы они при создании/обновлении/удалении данных помечали записи в таблице NUMS_CONT как занятые/свободные. Тогда нахождение свободного номера сведется к запросу из одной таблицы. Или можно сделать как-то иначе (проще/оптимальнее/эффективнее)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 09:01 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
flu4u ему нужно предложить первый (минимальный) свободный номересли пользователей более одного, занятие бесполезное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:19 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
flu4u, если я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5) ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:30 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
Нормальное занятие, что не так? Есть такое требование. Если кто-то успеет занять номер, то при сохранении ругнется, что такой номер уже занят и предложит следующий первый свободный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:32 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
Stax если я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5) В T1, T2, T3, T4, T5 могут быть любые номера из любых диапазонов, там не содержится последовательности (всего набора номеров), она описана в таблице NUMS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:35 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
Создайте своим пяти таблицам "папу" с искомыми номерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:35 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСоздайте своим пяти таблицам "папу" с искомыми номерами. Номер не обязательно привязывается и выбирается из диапазона, он может быть просто номером, введенным руками. Но если он вдруг удовлетворяет диапазону, то его тоже нужно учесть при расчете первого свободного номера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:40 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
flu4uandrey_anonymousСоздайте своим пяти таблицам "папу" с искомыми номерами. Номер не обязательно привязывается и выбирается из диапазона, он может быть просто номером, введенным руками. Но если он вдруг удовлетворяет диапазону, то его тоже нужно учесть при расчете первого свободного номера. Создайте своим пяти таблицам "папу" с искомыми номерами. И Вам придется дополнить "папу" "просто номером, введенным руками", что сведет "его тоже нужно учесть" к общему алгоритму. А все вычисления будут выполняться на "папой", при этом грамотно использованные select for update или update returning решат вопрос многопользовательской обработки, а аккуратно подобранная схема индексирования "папы" даст приемлемую производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:50 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
flu4u, Создавайте по сиквенсу на каждый диапазон и их и используйте форматируя согласно правил(префиксы/постфиксы/длина) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:54 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
Храня занятые номера, быстрее ifs не прыгнешь. В телекоме принято формировать пул свободных номеров. Тогда алгоритм наполнения может быть вдумчивым. А алгоритм резервирования требует очень краткосрочную блокировку. Естественно, о полной бездыркости речи не идет, так как потенциальный абонент может отказаться от резерва, но рано или поздно номер подберет следующий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 11:08 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
flu4uStaxесли я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5) В T1, T2, T3, T4, T5 могут быть любые номера из любых диапазонов, там не содержится последовательности (всего набора номеров), она описана в таблице NUMS. чесно говоря я не понял как T1, T2, T3, T4, T5 связаны с NUMS но до NUMS добавить поле nextval и его палить в автономке с учетом существующих номеров в T1, T2, T3, T4, T5 получим аля пользовательская sequence ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 11:26 |
|
||
|
Выдача свободного номера из диапазона
|
|||
|---|---|---|---|
|
#18+
дырки в папеВ телекоме принято формировать пул свободных номеров. В телекоме существует "отстой" для номера - заданный промежуток времени между освобождением номера и его присвоением следующему абоненту. Как часть жизненного цикла номера. Потому номерная емкость ведется целиком, без "дырок". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2017, 00:56 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=133&tid=1884745]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 430ms |

| 0 / 0 |
