![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимальный способо генерации 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, самый простой и надежный по реализации