Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> generation id, Генерация id 
:(
    Опции темы
CBEPX4EJIOBEK
Дата 19.5.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.4.2008

Репутация: нет
Всего: нет



как можно менее затратно сгенерировать значение, имея список значений, в который полученное значение не должно входить.
Более частная задача: есть таблица, необходимо написать генератор который бы генерировал значения для id (таблица уже заполнена, есть как id = 1 так и id = 99999 (max 99999))
PM MAIL   Вверх
amigooo
Дата 19.5.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Код

    private int pointer=1;

    public int getNextId(){
        while(isExist(pointer)){
            pointer++;
        }
        return pointer++;
    }
    
    private boolean isExist(int id){
        if(id>MAX){
            throw new IllegalStateException("No more valid id");
        }        
         return is_exist;//depends on env
    }

PM MAIL   Вверх
CBEPX4EJIOBEK
Дата 19.5.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.4.2008

Репутация: нет
Всего: нет



ну этот способ очевиден, но вот например если не инкремировать поинт а генерировать рандомно... что быстрее работать будет?
PM MAIL   Вверх
LSD
Дата 19.5.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(CBEPX4EJIOBEK @  19.5.2010,  18:30 Найти цитируемый пост)
ну этот способ очевиден, но вот например если не инкремировать поинт а генерировать рандомно... что быстрее работать будет? 

Зависит от соотношения занятых к общему числу ключей и их распределения.


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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
CBEPX4EJIOBEK
Дата 19.5.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.4.2008

Репутация: нет
Всего: нет



необходимо генерить ключи для субд... единственное что таблица уже заполнена некоторыми значениями (id без порядка (есть записи с id = 5 и 100 и 899, но нету например записи с id=6, 7, 102)) и не известно с какого момента начинать инкримент или т.п. 
PM MAIL   Вверх
godvinn
Дата 19.5.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 4.4.2008
Где: possibility of mo ving to Kyiv

Репутация: нет
Всего: 1



А если при генерации этих чисел, на каждой итерации проверять -  если ли такое чисто в базе, если нет то инсертить.



--------------------
Everything happens in life.
user posted image
PM MAIL   Вверх
amigooo
Дата 20.5.2010, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Цитата(CBEPX4EJIOBEK @ 19.5.2010,  17:30)
ну этот способ очевиден, но вот например если не инкремировать поинт а генерировать рандомно... что быстрее работать будет?

Чем проше тем лучше.
Из вашего условия следует что так или иначе придёться узнавать занятость всех id, инкрементный способ в любом случае позволяет для каждого id сделать только одну проверку.  способ с рандомной генерацией будет так работать в самом лучшем случае, что мало вероятно. Когда 90% id  будет уже заняты попробуйте рандомно попасть в оставшиеся 10%. Я уже не говорю о простоте/скорости операции инкремент по сравнению с генерацией псевдо случайных чисел. 



PM MAIL   Вверх
lBugl
Дата 20.5.2010, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



если таблица досталась в наследство  и её нуна интегрировать в базу, то предлагаю следующее:
создать в базе идентичную таблицу такой же структуры "+" поле автоинкремент (мб праймари кей) и "-" твоё поле (которое как бы является разбросанными ключами). а далее при добавлении в базу записей id будет сам генериться и заполняться...

зы: мб ляпнул чёта не то... =)
PM MAIL   Вверх
Aikus
Дата 20.5.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 29.11.2007

Репутация: нет
Всего: 1



Если БД способна сама генерировать id, то лучше порыться в ней. Если не способна (да и такие бывают), думаю можно вычислить наибольшее число, записать его в ту же базу плясать от него:
1. взял значение, которое ты считаешь самым большим
2. прибавил 1
3. записал новое значение
4. сохранил объект

в пп. 2 и 4 надо ещё предусмотреть исключения и их обработку
PM MAIL   Вверх
LSD
Дата 21.5.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Aikus @  20.5.2010,  13:26 Найти цитируемый пост)
Если не способна (да и такие бывают)

Хоть один пример БД (современной) которая не умеет генерировать гарантировано-уникальные ключи.

Цитата(Aikus @  20.5.2010,  13:26 Найти цитируемый пост)
1. взял значение, которое ты считаешь самым большим
2. прибавил 1
3. записал новое значение
4. сохранил объект

5. Получил ошибку, потому как паралельная сессия уже успела занять этот ID smile 


Цитата(lBugl @  20.5.2010,  09:20 Найти цитируемый пост)
если таблица досталась в наследство  и её нуна интегрировать в базу, то предлагаю следующее:
создать в базе идентичную таблицу такой же структуры "+" поле автоинкремент (мб праймари кей) и "-" твоё поле (которое как бы является разбросанными ключами). а далее при добавлении в базу записей id будет сам генериться и заполняться...

Хороший вариант. В любом случае ключи лучше всего генрировать самой СУБД.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1101 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.