Автоматическая генерация ID - PullRequest
2 голосов
/ 01 февраля 2010

Мне нужно создать идентификатор с следующие функции:

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

  2. Идентификатор состоит из двух частей 'тип' и 'автоинкрементное' число

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

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

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

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

, тогда сгенерированный идентификатор = 210001

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

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

Ответы [ 5 ]

3 голосов
/ 01 февраля 2010

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

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

1 голос
/ 01 февраля 2010

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

Что касается определения вашего второго атрибута - давайте назовем его «id» - число, начинающееся с 10001, у вас есть две хорошие стратегии:

1) используйте одну последовательность, начинающуюся с 1, а для отображения используйте выражение «10000 + row_number () over (разделение по порядку integer_type по id)», чтобы пользователи могли видеть нужное число.

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

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

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

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

1 голос
/ 01 февраля 2010

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

1 голос
/ 01 февраля 2010

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

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

0 голосов
/ 01 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...