Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 сиквенс или глобальный контекст ?  [new]
4uko
Member

Откуда:
Сообщений: 276
Добрый день.
Ситуация:
Имеем 50000 тыс складов. Имеем 20 типов документов. На каждом складе с каждым типом документа идет своя нумерация. Сейчас для получения нового номера документа на опрелделенном складе и типа документа выбирается максимальное значение и инкрементится. Понятно что этовызывает ряд проблем с дублированием номеров в случае одновременного создания документов.
Как я вижу решение:
1. создание 20 сиквенсов(по кл-ву типов), но это приведет к большым "дырам". Пример: на одном складе с одним типом документа создается их оклол 1000 в день а на другом складе с таким типом документа создается по 1 в месяц. Соответсвенно заказчику непонравится что на втором складе после документа №10 идет №7843539504050. (дыры могут быть но не столь существенные)
2. ипользование глобальнго контекста где будет резервироваться номер пока создание документа незакончено.
3. Функия где по комбинации даты и склада будет создаватся документ с мин. разрывом.

Вообщем разрыв допускается но он не должен быть велик для связки склад+тип. док.

У кого естиь каие либо наработки?

Заранее спасибо.
11 май 07, 12:10    [4125070]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
db-man
Guest
Может, табличка эмулятор сиквенса с полями (номер_склада, значение_сиквенса)?
11 май 07, 12:13    [4125099]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64029
Блог
4uko
Имеем 50000 тыс складов.

Нехило.

4uko
Как я вижу решение:

Начать стоит с постановки задачи - какая все же нумерация нужна. А то так получается, что выбираете это Вы, и если так - используйте сиквенсы и не заботьтесь о дырках :)

Далее, если предположить, что создавать по сиквенсу на склад+тип лениво, придется их эмулировать.
11 май 07, 12:24    [4125182]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
Elic
Member

Откуда:
Сообщений: 29991
4uko
Имеем 50000 тыс складов. Имеем 20 типов документов. На каждом складе с каждым типом документа идет своя нумерация.
Эмулятор последовательности (но только с ключом из двух столбцов) + STFF Вопрос по Sequence
11 май 07, 12:27    [4125209]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
4uko
Member

Откуда:
Сообщений: 276
Спасибо. Применил самописный сиквенс на автономной транзакции
11 май 07, 13:39    [4125835]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
trak
Member

Откуда: spb.ru
Сообщений: 802
4uko
Спасибо. Применил самописный сиквенс на автономной транзакции

Только не забудьте учесть, что при PQ могут быть проблемы с sys_context.
В доке написано, на что обратить внимание!!!
11 май 07, 13:51    [4125955]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5931
Специальной операцией в монопольном режиме генерить пронумерованные бланки документов (в таблице бланков записи с номерами). Тогда и дыры в нумерации можно исключить даже в случае отката транзакции.
11 май 07, 14:57    [4126483]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
4uko
Member

Откуда:
Сообщений: 276
trak
4uko
Спасибо. Применил самописный сиквенс на автономной транзакции

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

Можно точную ссылочку? что такое PQ ? ;-)
14 май 07, 17:22    [4135490]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
4uko
что такое PQ ? ;-)
ParallelQuery

4uko
Можно точную ссылочку?
тынц
14 май 07, 17:25    [4135515]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
4uko
Member

Откуда:
Сообщений: 276
mcureenab
Специальной операцией в монопольном режиме генерить пронумерованные бланки документов (в таблице бланков записи с номерами). Тогда и дыры в нумерации можно исключить даже в случае отката транзакции.

Пример можно?
14 май 07, 22:38    [4136434]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64029
Блог
4uko
Пример можно?

Примерно так (набрано в форуме, просто принцип):

create table Numbers ( n# integer ) ;

create sequence Number_seq ;

create function GetNextNumber return integer is

  cursor crNumber is
    select n#
      from ( select * from Numbers order by n# )
      where rownum = 1
      for update skip locked ;

  procedure MakeNextNumbers is
    pragma autonomous_transaction ;
  begin
    insert into Numbers ( n# )
      select Number_seq.nextval from dual connect by level <= 100 ;
    commit ;
  end ;

begin
  loop
    for cr in crNumber loop
      delete from Numbers where n# = cr.n# ;
      return cr.n# ;
    end loop ;
    MakeNextNumbers ;
  end loop ;
end ;
/
14 май 07, 22:52    [4136453]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
4uko
Имеем 50000 тыс складов.

50 млн складов? и все это доверили автоматизировать Вам?
14 май 07, 23:01    [4136464]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
igorek04
Member

Откуда:
Сообщений: 106
Как вариант можно и так.
У тебя есть типы документов с идентификаторами - приходная накладная(ПН - WO), расходная накладная(РН - WI),накладная на перемещение(НП - IW) и т.д. Склады с идентификаторами - склад1 (СК1), склад2 (СК2), склад1 (СК2) и т.д.
У тебя 2 таблицы - в 1 все заголовки документов(doc), в 2 спецификации документов(specdoc).
Вешаешь тригер на таблицу doc на вставку записи для определения мах-значения для каждого склада.
Когда у тебя склад2 (СК2) создает расходную накладную(РН-WI), определяешь мах для этого склада и создаешь документ РН-СК1-0000(max)+1 (- для разделения). Получится типа РНСК21024
И все.
15 май 07, 06:20    [4136729]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
Elic
Member

Откуда:
Сообщений: 29991
igorek04
Вешаешь тригер на таблицу doc на вставку записи для определения мах-значения для каждого склада.
Наивный В лучшем случае это ORA-00001, в худшем - конфликты.
igorek04
И все.
Да. Для систем с подобным подходом это полный трындец
15 май 07, 08:32    [4136870]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
igorek04
Member

Откуда:
Сообщений: 106
Elic
igorek04
Вешаешь тригер на таблицу doc на вставку записи для определения мах-значения для каждого склада.
Наивный В лучшем случае это ORA-00001, в худшем - конфликты.
igorek04
И все.
Да. Для систем с подобным подходом это полный трындец


Когда склад1 создает расходную накладную(РН) то для него все расходные документы будут РНСК1XXXXX, для склад2 расходные документы будут РНСК2XXXXX. Для склад1 приходные накладные будут ПНСК1XXXXX, для склад2 приходные накладные будут ПНСК2XXXXX. И т.д. для всех типов документов с инкриментальным увеличением на 1 в разрезе каждого склада.
И где именно будет нарушена целлочность?

А трындец - это когда тебе говорят что система с которой работает ~300 пользователей, 25 филиалов не соответствует нормализации БД- вот это полный трындец. 2Elic Просьба читать внимальнее, а не через слово, дабы не быть уличенным в невежестве.
15 май 07, 09:07    [4136968]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
Elic
Member

Откуда:
Сообщений: 29991
igorek04
И где именно будет нарушена целлочность?
При одновременной работе пользователей одного и того же склада.
igorek04
А трындец - это когда тебе говорят что система с которой работает ~300 пользователей, 25 филиалов не соответствует нормализации БД- вот это полный трындец.
Эта "система" "работает" вопреки разработчикам, а не благодаря Просто пока ещё звезды не стали раком :)
igorek04
2Elic Просьба читать внимальнее, а не через слово, дабы не быть уличенным в невежестве.
Повеселил :) Но я оставляю за тобой право "уличать". Интересно, как это у тебя получится
15 май 07, 09:46    [4137123]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
OraDen
Member

Откуда:
Сообщений: 828
Не совсем понятно что же нужно 4uko.
1. Генерить первичный ключ для документа или номер документа, который выводится в печатный документ?
2. Документы для этой кучи складов создаются на одном сервере или на каждом складе стоит по серверу.
3. Нужна ли уникальность номера (вообще, в пределах склада или в пределах склада и типа документа).

Если предположить что генерить надо номер документа для вывода на печать, все происходит на одном сервере, номера уникальны в пределах склада и типа, и желательно чтобы они шли последовательно без больших дыр в пределах склада и типа, то хороший вариант уже предлагали:
Elic
4uko
Имеем 50000 тыс складов. Имеем 20 типов документов. На каждом складе с каждым типом документа идет своя нумерация.
Эмулятор последовательности (но только с ключом из двух столбцов) + STFF Вопрос по Sequence
15 май 07, 10:19    [4137311]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
OraDen
Member

Откуда:
Сообщений: 828
to igorek04

Мне почему то кажется, что вы предложили вариант от которого автор темы как раз хотел уйти

4uko
Сейчас для получения нового номера документа на опрелделенном складе и типа документа выбирается максимальное значение и инкрементится. Понятно что этовызывает ряд проблем с дублированием номеров в случае одновременного создания документов.
15 май 07, 10:27    [4137373]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
Ildjarn
Member

Откуда: Mordor
Сообщений: 50
А если 4uko оставить все как было раньше, то есть иметь на каждом складе свою нумерацию для каждого типа документа? Но получение нового номера документа отложить до момента непосредственной вставки в таблицу и последующего COMMIT. Номер нового документа пожно получить прежим способом - выбирается максимальное значение и инкрементится.
Думаю, при одновременном создании документов дублей не будет, если очень быстро будет определяться номер нового документа (это уже другой вопрос).
15 май 07, 22:30    [4141520]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
db-man
Guest
Думаю, при одновременном создании документов дублей не будет, если очень быстро будет определяться номер нового документа (это уже другой вопрос).

Там, заметьте, 50000 тыс складов и сответственно 50000 тыс складских сотрудников вбивают накладные со страшной силой. Так что можно нарваться и на дублирование...
Другое дело, если ловить exception и повторять чтение-вставку, пока не повезёт.
Но не кажется ли вам этот подход извращением?
15 май 07, 22:54    [4141562]     Ответить | Цитировать Сообщить модератору
 Re: сиквенс или глобальный контекст ?  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5931
Ildjarn
Думаю, при одновременном создании документов дублей не будет, если очень быстро будет определяться номер нового документа (это уже другой вопрос).


Если неприятность может случиться, то она случается.

Неприятность случается в самое неподходщее время.
15 май 07, 23:07    [4141579]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить