Стратегия генератора случайных имен - помогите мне улучшить ее - PullRequest
4 голосов
/ 05 февраля 2009

У меня есть небольшой проект, который я делаю на Python, используя web.py. Это генератор имен, использующий 4 "части" имени (firstname, middlename, anothername, surname). Каждая часть имени представляет собой набор объектов в базе данных MySQL (name_part (id, part, type_id) и name_part_type (id, description)). Базовые вещи, я думаю.

Мой генератор выбирает случайную запись каждого «типа» и собирает комическое имя. Прямо сейчас я использую select * from name_part where type_id=[something] order by rand() limit 1, чтобы выбрать случайную запись каждого типа (поэтому у меня также есть 4 запроса на просмотр страницы, я подумал, что это лучше, чем один жирный запрос, возвращающий потенциально сотни строк; если у вас есть предложение для как это сделать в одном запросе без sproc, я буду слушать).

Очевидно, я хочу сделать это более случайным. На самом деле, я хочу дать ему лучшее освещение, не обязательно случайность. Я хочу убедиться, что он использует как можно больше возможностей. Вот что я спрашиваю в этом вопросе: , какие стратегии я могу использовать, чтобы охватить большую случайную выборку ?

Моя идея состоит в том, чтобы создать столбец счетчика для каждого name_part и увеличивать его каждый раз, когда я его использую. Мне нужно было бы немного логики, чтобы потом сказать, как: «получить name_part, которая меньше, чем самый высокий« счетчик »для этого« name_part_type », если нет ни одного, затем выберите случайный». Я не очень хорош в SQL, возможна ли такая логика? Единственный способ, которым я могу подумать, это сделать до 3 или 4 запросов для каждой части имени (таким образом, до 12 запросов на просмотр страницы).

Могу ли я получить некоторую информацию о моей логике здесь? Я обдумываю это? На самом деле это звучит идеально для хранимой процедуры ... но можете ли вы, ребята, хотя бы помочь мне решить, как это сделать без sproc? (Я не знаю, смогу ли я даже использовать sproc со встроенной базой данных web.py).

Я надеюсь, что это не очень глупо, но спасибо заранее.

edit: Помимо моей конкретной проблемы, мне все еще любопытно, есть ли какие-нибудь альтернативные стратегии, которые я могу использовать, которые могут быть лучше.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2009

Я думаю, что вы ищете:

select * from name_part
    where type_id=[something]
    order by used_count asc, rand()
    limit 1

Это поместит наименее используемые имена в верхнюю часть списка, и, если есть кратные с тем же самым (самым низким) used_count, они будут сортироваться случайным образом.

1 голос
/ 05 февраля 2009

Я согласен с вашей интуицией, что использование хранимой процедуры - правильный путь, но тогда я почти всегда пытаюсь внедрить в базу данные вещи.

В вашем проце я бы ввел какую-то логику, например, скажем, есть только 30% -ная вероятность того, что возвращение результата фактически увеличит счетчик. Просто для увеличения изменчивости.

...