【问题标题】:What is the right way to store random numbers in my database?在我的数据库中存储随机数的正确方法是什么?
【发布时间】:2013-04-27 23:19:42
【问题描述】:

我正在开发一个应用程序,它会生成唯一的随机数,然后将它们存储到数据库中。我将通过 HTTP 请求检查号码是否存在。一开始,我会使用大约 10,000 个数字。

这是正确的方法吗?

  1. 生成一个随机数,并一个一个的存入一个数组,继续检查数组的唯一性,当数组完成后,将整个数组排序后存入数据库。
  2. 使用数据库检查号码是否存在。

我应该使用哪个数据库,因为该应用程序可以扩展到 100 万个数字。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    这可能更有效,特别是如果您想生成 1000000 个数字,一次只生成一个并在模型/数据库中使用验证来防止重复。

    关于选择数据库,这在一定程度上取决于您的预期应用程序。这里有一些信息:Which is the Best database for Rails application?

    我无法评论直接从没有rails 的ruby 使用数据库,因为我没有这样做。对我来说,rails 的一大优点是它让创建使用数据库的应用程序变得非常容易。

    【讨论】:

    • 那么我将如何对数据库进行排序.. 以加快搜索速度。
    • 为要排序的列添加索引
    【解决方案2】:

    几个想法:

    1. 如果您要存储 10 或 10,000 个“随机”数字,它们是随机进入数据库,还是数据库随机选择 10,000 个连续数字范围内的一个数字,有什么区别?您需要双重随机数选择吗? MySQL、PostgreSQL 和其他 DBM 可以生成随机数,您可以使用它们的随机数生成器来检索一行,因此您可以让它直接从其生成器返回一个值,或者抓取一行。无论哪种方式,您都无需担心 Ruby 会创建随机值——除非您真的想要“三重”随机数。我只需将 (1..10_000) 范围的值粘贴到数据库中,然后调用该部分完成并处理查询以随机获取记录。
    2. 如果你想要真正的随机数,你不能保证唯一性。如果您对伪随机感到满意,那么您仍然会遇到问题,因为您最终可能会从范围内返回重复项,除非您跟踪您之前在特定会话中使用过哪些数字。如果您的网站变得流行,那么如何在大量会话中跟踪唯一性将是一个有趣的问题。

    如果我这样做,我会反转一些过程。我不会在数据库中存储“随机”值,我会使用 Ruby 的 built-in random number generator,然后可能会检查数据库以查看我之前是否为该特定会话生成了该数字。总体而言,数据库中存储的值更少,因此确定唯一性的查找会更快。

    这仍然是一个笨拙的编码系统,并且随着会话的“唯一”记录的增长,效率会随着时间的推移而变得低​​下。

    要在没有数据库的情况下执行此操作,我会使用以下内容创建随机/唯一范围:array = (1..10_000).to_a.shuffle,然后每次我需要一个值时,我都会使用pop 从随机数组中提取最后一个值。我很想从所有会话的值池中提取,直到它用尽,然后重新生成它。此时可能会出现重复的“唯一”值,但同一数字连续出现两次的可能性很小。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 2020-01-19
      • 2011-05-29
      • 2015-03-20
      • 2016-05-31
      • 2019-12-10
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多