Форум: "Базы";
Текущий архив: 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