
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.09.2015, 18:45:38
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Пусть есть таблица Код: sql 1. При этом логика нашего клиентского приложения предполагает хранение в этой таблице айдишников, которые больше 100000 и меньше 999999, то есть всегда шестизнак. В данный момент, при вставке записи мы генерим рандомное число, проверяем существует ли такая запись, если не существует, то создаем запись, если существует, то генерим новое число. В этом цикле защита на 10 тыс. попыток. Если так и не удалось, то типа, сорри, не судьба... Как все мы понимаем, чем больше записей уже в этой таблице, тем больше будет требоваться попыток для поиска свободного рандомного ключа. Вопрос: может есть какие-то секретные шняжки для решения подобной задачи? Типа как бы аналог auto_increment, только типа как бы типа такого Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 18:48:34
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
а надо "настоящий" ранодом или и псевдо устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 18:50:18
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
генерить рандомное число, выбирать первое несуществующее больше него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 18:55:34
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
ScareCrowгенерить рандомное число, выбирать первое несуществующее больше него.так со временем образуются заполненные интервалы я почему и спрашиваю ТСа о допустимости псевдослучайности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 18:57:42
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
tanglirа надо "настоящий" ранодом или и псевдо устроит? вопрос не понятен.... прошу уточнить... ScareCrowгенерить рандомное число, выбирать первое несуществующее больше него. а каким запросом узнать первое несуществующее число больше 463504? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 19:11:03
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 19:54:36
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
tanglir Код: sql 1. 2. 3. 4. Благодарю! Тут ещё ограничитель сверху до кучи Код: sql 1. 2. 3. собственно мой изначальный вопрос был в том, что существуют ли в мускуле какие-нибудь штатные инструменты для решения подобных задач? или рандомные айдишники - это только через клиента мутить? неужели мускул не дает в этом случае никаких рандомных инструментов? PS. кстати, а просто для общего развития, что имелось ввиду под настоящий или псевдо-рандом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 20:06:09
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Если действовать только средствами MySQL, то я бы заготовил заранее перемешанную таблицу на нужное количество записей. Перемешать можно с помощью ORDER BY RAND(). Это очень не быстро, но для разового выполнения сойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 21:17:23
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
miksoftЕсли действовать только средствами MySQL, то я бы заготовил заранее перемешанную таблицу на нужное количество записей. Перемешать можно с помощью ORDER BY RAND(). Это очень не быстро, но для разового выполнения сойдет. ОООО!!! Идея прикольная, тем более в данном случае мы точно знаем, что записей у нас всего 899999. 1) Для меня это новая идея, что создание некой новой сущности в системе - это не insert + update, а такая разновидность update, которая скидывает флаг "isBlank" в ноль.... правда теперь придется обмозговать какие это внесет дополнения в стиль работы например, теперь вместо select * from t придется делать select * from t where isBlank = false просто для того чтобы узнать количество записей 2) order by rand() тут наверное лишний, потому что для создания такой таблицы лучше на клиенте создать массив и перемешать его, а затем уже проинсертить все 899999 пар (id, seqId) и для активации ("создания") новой записи просто искать минимальный seqId с флагом isBlank = true ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 21:32:26
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumix1) Для меня это новая идея, что создание некой новой сущности в системе - это не insert + update, а такая разновидность update, которая скидывает флаг "isBlank" в ноль....Можно и так. А можно просто удалять из таблицы использованные значения. Lumix2) order by rand() тут наверное лишний, потому что для создания такой таблицы лучше на клиенте создать массив и перемешать его, а затем уже проинсертить все 899999 пар (id, seqId) и для активации ("создания") новой записи просто искать минимальный seqId с флагом isBlank = trueorder by rand() позволяет всю подготовку выполнить средствами MySQLбуквально в пару-тройку команд. Конечно, можно то же самое сделать и на клиенте, но кодить придется чуток побольше. Кстати, а зачем тут поле id? не вижу в нем необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 22:11:34
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
miksoftМожно и так. А можно просто удалять из таблицы использованные значения. miksoftКстати, а зачем тут поле id? не вижу в нем необходимости. может я опять криво объяснил с самого начала ситуация такая допустим у нас есть таблица, которая ведет учет животных в зоопарке Код: sql 1. все круто, все как обычно... но в этой задаче номер животного может быть только [100000, 999999), то есть только шестизначным числом (это полбеды, ведь можно было бы просто прокрутить auto_increment до 100000 и поехали... в этой задаче важно новым животным присваивать номера случайным образом поступила например лошадь Код: sql 1. только вместо null нам важно присвоить какой-то случайный номер из диапазона [100000, 999999) и чтобы этого номера ещё не было бы в этой таблице вот в чем ситуация... поэтому я думал вы предлагаете сразу в этой таблице создать 8999999 животных, у которых id будет распределен случайно, а вот seqId будет последовательным и когда мы хотим занести в таблицу новое животное мы будем брать запись по номеру seqId (минимальный номер у которого флаг isBlank = true), затем по этому номеру получать id (который и является уже заранее занесенным случайным числом, затем скидываем флаг isBlank в false и по этому id прописываем все данные на новое животное я думал вы именно такой вариант предлагаете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 22:36:10
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumixtanglir Код: sql 1. 2. 3. 4. Благодарю! Тут ещё ограничитель сверху до кучи Код: sql 1. 2. 3. собственно мой изначальный вопрос был в том, что существуют ли в мускуле какие-нибудь штатные инструменты для решения подобных задач? или рандомные айдишники - это только через клиента мутить? неужели мускул не дает в этом случае никаких рандомных инструментов? PS. кстати, а просто для общего развития, что имелось ввиду под настоящий или псевдо-рандом? не существует таких средств. поедите всего потому что они никому не нужны. ключ должен быть уникальным, больше на него не надо накладывать никаких ограничений. если ты делаешь ключ случайным, то ты навязываешь ему дополнительно еще какую то семантику помимо идентификации записи, а этого ключи не должны делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 22:46:12
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumixпоэтому я думал вы предлагаете сразу в этой таблице создать 8999999 животныхТак тоже можно, наверное, но зависит от задачи. Но я предлагал сделать отдельную табличку-генератор только из одних номеров. И черпать их оттуда по мере необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 23:25:37
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
miksoft, ок, теперь понятно. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.09.2015, 23:37:50
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumixmiksoft, ок, теперь понятно. Код: sql 1. 2. Нет, тут уже order by rand() не нужен. Перемешивание должно было быть сделано один раз на этапе создания таблицы. Только поле id не надо делать первичным ключом, а то InnoDB записи отсортирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 08:49:06
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumixв этой задаче важно новым животным присваивать номера случайным образом Так мы увидим обоснование того, что ID должен быть СЛУЧАЙНЫМ? С точки зрения логики, надо взять фразу Lumixid будет распределен случайно, а вот seqId будет последовательным и сделать строго наоборот. LumixТут ещё ограничитель сверху до кучи Код: sql 1. 2. 3. Если есть свободные значения, но все они меньше 463504, приключится облом... таблицу надо завернуть в кольцо. Тогда если есть хотя бы одно незанятое значение - оно будет найдено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 10:03:10
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
AkinaЕсли есть свободные значения, но все они меньше 463504, приключится облом... Lumixа каким запросом узнать первое несуществующее число больше 463504?Всё ч0тко по заданию. Если формулировка задания чего-то не учитывает - все претензии к ТСу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 10:08:41
|
|||
|---|---|---|---|
|
|||
Рандомный автоиндекс |
|||
|
#18+
Lumix, а какой физический смысл получения РАНДОМНОГО уникального числа в диапазоне? Т.е. каково дальнейшее применение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:15:50
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Alex_Ustinovфизический смысл Что означает термин физический смысл ? Я от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом , а тут вы ещё какой-то физический смысл... развели тут зоопарк терминов ) Alex_UstinovТ.е. каково дальнейшее применение? Вместо того, чтобы создать новую запись с последовательным номером, мы создаем новую запись с этим рандомным номером. Что-ж не понятного-то? Ну например, если бы у нас таблице был бы автоинкемент, начинающийся от 100000 и было бы уж 500 животных, то если мы создавали обычным бы макром, то 501 животное получило бы номер 100501, а в нашем случае номер будет какой-нибудь типа 430564 или 676133, а животных все равно 501. Есть же разница: либо у вас в клетке живет 5 попугаев 100354, 100355, 100356, 100357, 100403 или у вас в клетке живет 5 попугаев 156105, 679313, 456321, 546689, 901636. Вот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:35:02
|
|||
|---|---|---|---|
|
|||
Рандомный автоиндекс |
|||
|
#18+
Lumix, вы ответьте без эмоций, пожалуйста. авторНу например, если бы у нас таблице был бы автоинкемент, начинающийся от 100000 и было бы уж 500 животных, то если мы создавали обычным бы макром, то 501 животное получило бы номер 100501, а в нашем случае номер будет какой-нибудь типа 430564 или 676133, а животных все равно 501. Есть же разница: либо у вас в клетке живет 5 попугаев 100354, 100355, 100356, 100357, 100403 или у вас в клетке живет 5 попугаев 156105, 679313, 456321, 546689, 901636. Для меня нет разницы и для базы данных нет разницы кто у вас живет в клетке - попугай 100505 или 676133 и они от этого не подохнут ) Зачем именно РАНДОМНЫЕ "бирки"? обзовем их так (это точно не id в понятии СУБД) Дальше для чего эта рандомность? Если это просто так - так и скажите, "Это просто так" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:45:13
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
LumixЯ от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом Это потому что я нестрого эти термины использовал - вообще-то даже то, что я называл настоящим рандомом по сути псевдорандом :) "Настоящий" - это когда невозможно выявить закономерности в случайных данных, даже если эти закономерности НСД имеются в нашем ГСЧ. Насколько я знаю, большая часть ГСЧ в писюковых ЯП - это по сути псевдорандом. Сид у них ещё может быть по-настоящему случайным, а вот дальнейшая последовательность строго определена сидом. Хотя "на глаз" она вроде как случайна. А "псевдо" - это когда метод генерации СЧ настолько хреновый, что эти закономерности видно, как говорится, невооружённым глазом. Вот сравните ваш вариант (генерим разные СЧ пока не найдём незанятое) и предложенный вариант (берём наименьший из тех незанятых, что больше одного сгенерённого СЧ). Допустим, заполнили мы половину имеющегося диапазона тем и другим методом, ну и что исходный ГСЧ - хороший, "настоящий". Так в первом случае распределение будет такое же, как у исходного ГСЧ - более-менее равномерное. А вот во втором случае у вас будет много непрерывных последовательностей, много дырок между ними и немножко отдельно стоящих чисел. То есть распределение будет не сказать чтобы такое уж случайное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:47:04
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Alex_UstinovЗачем именно РАНДОМНЫЕ "бирки"? Потому что когда бирки слишком похожие, то очень часто сотрудники зоопарка путают особей между собой, особенно там, где плохая освещенность и размеры особей небольшие, а сами особи на внешний вид хрен отличишь между собой. Например, те же зеленые попугайчики отличаются тремя перышками и, конечно, вечером, уставшая баба Нюра в очках -3 может легко перепутать 100503 и 100505, даже если она очень ответственная женщина. Перепутать 654321 и 467963 гораздо сложнее. Мозгу физически труднее спутать эти два числа даже не читая их по отдельным цифрам. Alex_Ustinov(это точно не id в понятии СУБД) ой, а это где это вы это такое понятие СУБД встетили?? по мне так очень даже себе id... просто видимо вы за всю жизнь привыкли, что айдишники всегда последовательные вот и не мыслите себе иную природу айдишников... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:54:17
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
tanglirLumixЯ от tanglir до сих пор не получил ответа что значат его термины "настоящий" рандом и пседорандом Это потому что я нестрого эти термины использовал - вообще-то даже то, что я называл настоящим рандомом по сути псевдорандом :) "Настоящий" - это когда невозможно выявить закономерности в случайных данных, даже если эти закономерности НСД имеются в нашем ГСЧ. Насколько я знаю, большая часть ГСЧ в писюковых ЯП - это по сути псевдорандом. Сид у них ещё может быть по-настоящему случайным, а вот дальнейшая последовательность строго определена сидом. Хотя "на глаз" она вроде как случайна. А "псевдо" - это когда метод генерации СЧ настолько хреновый, что эти закономерности видно, как говорится, невооружённым глазом. Вот сравните ваш вариант (генерим разные СЧ пока не найдём незанятое) и предложенный вариант (берём наименьший из тех незанятых, что больше одного сгенерённого СЧ). Допустим, заполнили мы половину имеющегося диапазона тем и другим методом, ну и что исходный ГСЧ - хороший, "настоящий". Так в первом случае распределение будет такое же, как у исходного ГСЧ - более-менее равномерное. А вот во втором случае у вас будет много непрерывных последовательностей, много дырок между ними и немножко отдельно стоящих чисел. То есть распределение будет не сказать чтобы такое уж случайное. я не совсем понял глубину вашего объяснения, но из всего что я понял, мне показалось, что вы утверждаете, что в выдаче Код: sql 1. невооруженным взглядом можно заметить закономерность... либо вы Линус Торвальдс с лурки ) либо мои аналитические способности находятся на уровне хоббита с Флореса... потому что для меня эти данные являются достаточно рандомными... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 11:54:40
|
|||
|---|---|---|---|
Рандомный автоиндекс |
|||
|
#18+
Lumixкогда бирки слишком похожиеЕсли визуальная схожесть в текстовом написании - это реальная причина, то такие вещи делаются другими способами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.09.2015, 12:06:04
|
|||
|---|---|---|---|
|
|||
Рандомный автоиндекс |
|||
|
#18+
Lumix, я же просил без эмоций ) вы почитайте свой первоначальный вопрос. Это id - в вашем контексте: Код: sql 1. primary key (id) - это не поле для хранения "бирок" когда вы это поймете - вопросов и к вам и ваших будет меньше. а в моей жизни "id" вообще неприменимо, primary key (id) - Понятие СУБД насчет "визульного" разброса можно было сразу озвучить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&mobile=1&tid=1832690]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 338ms |

| 0 / 0 |
