1

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

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

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

亲切的问候

丹麦
_

4

2 回答 2

2

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

于 2010-01-19T20:16:51.253 回答
1

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

例如,如果您有一个用户可以下“赌注”的系统,那么有理由将某种类型的 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 并保存,覆盖第一个过程的结果.

有一些方法,如ActiveRecord 的增量 和减量,可以帮助处理这类事情,但最好的结果是通过根据需要简单地制表来实现。

于 2010-01-19T20:30:20.127 回答