Автоматическая генерация ID

2

Мне нужно сгенерировать id с помощью следующие функции:

  • Идентификатор должен быть уникальным

  • Идентификатор состоит из двух частей: "type" и "auto incremented" number

  • 'type' является целым числом, а значение может быть 1, 2 или 3

  • 'auto incremented' number начинается с 10001 и увеличивается каждый раз, когда id .

  • тип выбирается из веб-формы и автоматически увеличивается число из базы данных.

Пример: если выбран тип 2, а число с автоматическим добавлением - 10001

то сгенерированный id = 210001

Могут быть hundrads пользователей, генерирующих id. Теперь мой вопрос: Это можно сделать без хранимой процедуры, чтобы не было идентификатора id.

Я использую ASP.Net(С#), Oracle, NHibernate

Теги:
nhibernate

5 ответов

3

Как вы используете Oracle, вы можете использовать Sequence для этого.

Каждый раз, когда вы вызываете your_sequence.NEXTVAL, возвращается уникальный номер.

1

Самый чистый путь - как сказал Скотт Андерсон, - использовать два столбца. Каждый атрибут должен быть атомарным, т.е. Иметь только одно значение. С многозначным столбцом вам придется применять функции (substr), чтобы показать, например, тип. Ограничений будет сложнее определить. Ничто не сравнится с простой "проверкой (integer_type in (1,2,3))" или "check (id > 10000)".

Как для определения вашего второго атрибута - позвольте называть его "id" - число, начинающееся с 10001, у вас есть две хорошие стратегии:

1) используйте одну последовательность, начиная с 1, и для отображения используйте выражение "10000 + row_number() over (partition by integer_type order by id)", чтобы пользователи могли видеть номер, который они хотят.

2) используйте три последовательности, по одному для каждого integer_type, и пусть они начнут с предложения 10001.

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

Надеюсь, что это поможет.

С уважением, Роб.

1

Почему реализация Hi-Lo не соответствует NHibernate?

Что такое алгоритм Hi/Lo

1

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню