随机名称生成器策略 - 帮助我改进它

时间:2009-02-05 04:51:25

标签: python mysql random web.py

我使用web.py在Python中做了一个小项目。它是一个名称生成器,使用名称(firstname, middlename, anothername, surname)的4“部分”。名称的每个部分都是MySQL数据库(name_part (id, part, type_id)name_part_type (id, description))中的entites集合。基本的东西,我想。

我的生成器选择每个“类型”的随机条目,并组装一个滑稽的名称。现在,我正在使用select * from name_part where type_id=[something] order by rand() limit 1来选择每种类型的随机条目(所以我还有4个查询,每个页面视图运行,我认为这比一个胖查询返回可能有数百行;如果你有一个关于如何在一个查询中解决这个问题的建议我会听。)

显然我想让这更随意。实际上,我想给它更好的报道,不一定是随机性。我想确保它尽可能多地使用它们。这就是我在这个问题中提出的问题,我可以用什么样的策略来覆盖大量的随机样本

我的想法是在每个name_part上实现一个计数器列,并在每次使用时递增它。我需要一些逻辑然后说:“为这个”name_part_type“获得一个小于最高”name“的name_part,除非没有,然后选择一个随机的”。我不是很擅长SQL,这种逻辑是否可能?我认为这样做的唯一方法是对名称的每个部分最多需要3或4个查询(每页面浏览最多12个查询)。

我可以在这里获得一些逻辑输入吗?我是否在思考它?这实际上对于存储过程来说听起来很理想......但是你们能不能帮我解决如何在没有存储过程的情况下做到这一点? (我不知道我是否可以使用带有web.py的内置数据库内容的sproc。)

我希望这不是非常愚蠢,但要提前感谢。

编辑:除了我的具体问题,我仍然很好奇,如果有任何可以使用的替代策略可能会更好。

2 个答案:

答案 0 :(得分:4)

我认为你所追求的是:

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

这会将较少使用的名称放在列表的顶部,如果有倍数和相同(最低)的used_count,它们将随机排序。

答案 1 :(得分:1)

我同意你的直觉,即使用存储过程是正确的方法,但是,我几乎总是尝试在数据库中实现数据库内容。

在你的过程中,我会介绍某种逻辑,比如说,只有30%的几率返回结果会实际增加计数器。只是为了增加可变性。