【问题标题】:Include Account info in Users Database在用户数据库中包含帐户信息
【发布时间】:2011-01-06 23:48:46
【问题描述】:

我正在构建我的第一个 Rail 应用程序并开始设置我的数据库。我有一个简单的用户表,其中包含姓名、电子邮件(登录名)、密码等。

该网站允许用户互相下注(使用垄断资金),因此我需要将有关用户当前奖金和其他敏感事项的信息添加到数据库中。

问题:我应该将这些信息放在用户表中还是应该创建一个帐户表并在其中插入信息。我不知道在用户表中插入信息是否应该引发任何安全问题。

亲切的问候

肯尼斯
丹麦

【问题讨论】:

  • 我希望您没有推出自己的安全系统。如果你这样做了,你应该考虑用github.com/thoughtbot/clearance之类的东西替换它。
  • 嗨.. 谢谢.. 使用 Authlogic :)

标签: ruby-on-rails database security user-accounts


【解决方案1】:

他们的行为与实际用户本身是不同的实体。将用户信息(例如个人资料信息)保存在一张表中。所有其他实体应分开。因此,您希望将其分离到另一个表中,并创建一个返回用户表的外键,以确定该帐户表中的哪一行属于该用户。

【讨论】:

  • 嗨,谢谢。正是我想要的。很高兴我当时问:)
【解决方案2】:

从事务的角度来看,拥有跟踪操作的附属记录比修改单个记录要好得多。

例如,如果您有一个用户可以下“赌注”的系统,那么理所当然会有某种 Bet 类定义两个人之间的赌注。随着用户创建投注,相关列表将会增长。在 Rails 中,它看起来像这样:

class User < ActiveRecord::Base
  has_many :bets
  has_many :bet_pools,
    :through => :bets
end

class Bet < ActiveRecord::Base
  belongs_to :user
  belongs_to :bet_pool
end

class BetPool < ActiveRecord::Base
  has_many :bets
  belongs_to :winning_bet
  belongs_to :winning_user,
    :class_name => 'User',
    :through :winning_bet,
    :source => :user
end

每个赌注的金额存储在赌注记录中,赌注代表对特定赌注的总赌注,尽管您可能有不同的术语。

当投注结算时,可以通过分配 bet_pool.winning_user 关联来指定获胜者。

如果您想知道用户的“中奖记录”,那么只需将他们中奖的所有投注池汇总并加起来即可。

您不想不断调整用户记录上的某些属性的原因是,两个独立的进程可能想要调整该值,如果 SQL 没有正确实施,您最终可能会出现竞争条件。例如,用户可能会在很短的时间内下注并赢得赌注。

如果用户以 1000 美元开始并且同时进行两项操作,那么可能会发生这种情况:

# Process A intending to add $500
user.balance = user.balance + 500
user.save

# Process B intending to deduct $100
user.balance = user.balance - 100
user.save

按顺序完成,您希望余额从 1000 变为 1500,然后下降到 1400,但第二个过程在加载时以原始值 1000 开始,然后调整为 900 并保存,覆盖结果第一个。

有一些方法,如increment 和 ActiveRecord 的减量,可以帮助解决这类问题,但最好的结果是根据需要简单地制表。

【讨论】:

  • 嗨,伙计,非常感谢您的详细回答——您肯定明白不要经常调整用户或帐户记录中的属性。我只是认为循环所有的赌注来总结用户的奖金会更慢:) 但再次感谢你。你的回答一定会被使用。
  • 实际上,如果使用适当的索引,您会惊讶于数据库可以如此快速地将此类内容制成表格。添加几千个条目几乎是瞬时的,并且只有在您同时为大量用户显示结果时才会减慢速度。如果您需要对此进行扩展,您需要制作一个中间汇总表,其中包含不时更新的账户余额,如果需要,可以从头开始重新计算。
猜你喜欢
  • 2016-12-20
  • 2020-08-15
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多