Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
ANB ©   (2005-12-30 12:10) [0]

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

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

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


 
Vlad ©   (2005-12-30 12:48) [1]


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

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


 
Sergey13 ©   (2005-12-30 13:03) [2]

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


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

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


 
Vlad ©   (2005-12-30 13:08) [4]


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

Это почему?


 
ANB ©   (2005-12-30 13:56) [5]


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

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


 
ANB ©   (2005-12-30 13:59) [6]


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

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


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

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


 
Reindeer Moss Eater ©   (2005-12-30 14:06) [8]

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

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


 
Reindeer Moss Eater ©   (2005-12-30 14:13) [9]

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


 
ANB ©   (2005-12-30 14:14) [10]


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

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


 
ANB ©   (2005-12-30 14:15) [11]


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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
8-1121002218
Mr.Devil
2005-07-10 17:30
2006.02.26
Уровень сигнала на LineIn


2-1139525949
veb
2006-02-10 01:59
2006.02.26
re: fkCalkulated


15-1139114134
HTML
2006-02-05 07:35
2006.02.26
Рисунок в ячейке


9-1124602201
fastG
2005-08-21 09:30
2006.02.26
Share ware игры


15-1139174677
kilonet
2006-02-06 00:24
2006.02.26
Инструмент для автоматической замены имён переменных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский