Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимальный способо генерации ID (Оракл)


ANB ©   (2005-12-30 12:10:00) 

Если БД одна, то все просто - крутим сиквенс с 1 и не паримся.
Сложнее, если инстансов много и нужна репликация. Тогда очень желательно обеспечить уникальность ID даже в разных базах.
Видел следующие подходы :
1. Собственно ID должен влезать в первые N (7) разрядов. В старшие разряды прописывается номер сервера/экземпляра. Шаг 1, сивквенс зацикливается.
2. Номер сервера пишем в N младших разрядов. Шаг соответствующий.
3. Номер сервера выносим в отдельное поле.
4. В качестве ID используем GUID.

Есть ли у кого мысли, как лучше сделать, или еще какой способ ?

ЗЫ. Ветку можно вынести в Потрепаться.


Sergey Masloff   (2005-12-31 00:50:00) [1]

ANB ©   (30.12.05 13:59) [6]
>Второй вариант мне самому нравится больше всего. Но там, если отведешь >мало разрядов, сильно ограничишь количество серверов, а если мало - ID >очень быстро выйдут из Integer. Да и из Int64 можно умудриться вылезти. И >в результате ID придется как строку на клиента доставать.
Какой такой интежер-шминтеджер у тебя оракл и все 38 разрядов в твоем распоряжении. Работай с ним как с double на клиенте а на серваке хошь держи в дробной части номер сервера хошь в младших разрядах все опробовано и никаких проблем. Так что вариано 2 и не парься ;-) Такое мое скромное мнение независимого эксперта.


Reindeer Moss Eater   (2005-12-30 14:22:00) [2]

Да фиг знает.
Тысячи серверов наверное достаточно.
Итого:  (сикванс * 1000) + номер сервера


ANB   (2005-12-30 14:15:00) [3]


> Reindeer Moss Eater ©   (30.12.05 14:13) [9]

И сколько разрядов оптимально зарезервировать ?


ANB   (2005-12-30 14:14:00) [4]


>
> Reindeer Moss Eater ©   (30.12.05 14:06) [8]

Я обычно с Int64 работаю. А Integer - только для справочников.
А number - это да. 38 значащих цифр - это что то.


Reindeer Moss Eater   (2005-12-30 14:13:00) [5]

В общем второй вариант самый простой и удобный.


Reindeer Moss Eater   (2005-12-30 14:06:00) [6]

а если мало - ID очень быстро выйдут из Integer.

Есть очень хорошее правило никогда не работать с integer на клиенте с использованием Oracle. А за апределы number вряд ли успеешь выйти до конца жизни.


Sergey13   (2005-12-30 14:00:00) [7]

2[3] ANB ©   (30.12.05 13:03)
[5] ANB ©   (30.12.05 13:56)
Ну и что? Зато все просто и наглядно. ИМХО.


ANB   (2005-12-30 13:59:00) [8]


> Vlad ©   (30.12.05 13:08) [4]

Второй вариант мне самому нравится больше всего. Но там, если отведешь мало разрядов, сильно ограничишь количество серверов, а если мало - ID очень быстро выйдут из Integer. Да и из Int64 можно умудриться вылезти. И в результате ID придется как строку на клиента доставать.


ANB   (2005-12-30 13:56:00) [9]


> ANB ©   (30.12.05 13:03) [3]

Упс. Это про 3-й.


Vlad   (2005-12-30 13:08:00) [10]


> Потом надо будет все FK делать составными

Это почему?


Sergey13   (2005-12-30 13:03:00) [11]

Мне больше 3 вариант нравится.
Можно еще диапазоны ИД-шникам выделить если серверов немного и их количество неизменно.


ANB   (2005-12-30 13:03:00) [12]

2-й вариант не очень удобен при проектировании БД. Потом надо будет все FK делать составными, начнутся прочие бяки.


Vlad   (2005-12-30 12:48:00) [13]


> 3. Номер сервера выносим в отдельное поле.

в этом случае первичный ключ должен быть составной из 2-х полей.
Я бы предпочел вариант №2. IMHO, самый простой и надежный по реализации


Наверх

Титульная страница Поиск, карта сайта Написать письмо