我正在构建我的第一个Rail App并开始设置我的数据库。我有一个simpel Users表包含名称,电子邮件(登录),密码等。
该网站允许用户互相投注(使用垄断资金),因此我需要将有关用户当前奖金和其他微妙事项的信息添加到数据库中。
问题:我应该将这些信息放在Users表中,还是应该创建一个Account Table并在那里插入信息。我缺乏知识,看它是否应该引起任何安全问题,以便在Users表中插入信息。
亲切的问候
肯尼斯
丹麦
答案 0 :(得分:2)
他们的行为是与实际用户不同的实体。将用户信息(如个人资料信息)保存在一个表中。所有其他实体应分开。因此,您希望将其分隔到另一个表中,并创建一个返回到users表的外键,以确定此accounts表中的哪一行属于该用户。
答案 1 :(得分: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
每次投注的金额都存储在投注记录中,而BetPool表示对特定投注的总投注,尽管您可能对这样的投注有不同的期限。
如果投注结算,可以通过指定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的减量可以帮助解决这类问题,但最好的结果是通过简单地按需制表来实现。