Question

Je construis mon premier App Rail et commencent à installer ma base de données. J'ai un Simpel table utilisateurs nom containg, e-mail (login), mot de passe et ainsi de suite.

Le site permet aux utilisateurs parient les uns des autres (avec de l'argent de monopole), donc je besoin d'ajouter des informations sur les utilisateurs actuels gains et d'autres questions délicates à la base de données.

Question: Dois-je placer ces informations dans la table des utilisateurs ou devrais-je créer un tableau de compte et insérez les informations disponibles. Je manque les connaissances nécessaires pour voir si elle devrait soulever des problèmes de sécurité pour insérer les informations dans le tableau des utilisateurs.

Cordialement

Kenneth
Danemark

Était-ce utile?

La solution

D'un point de vue transactionnel, il est préférable d'avoir des registres auxiliaires qui assurent le suivi des opérations que de modifier un seul enregistrement en place.

Par exemple, si vous avez un système où les utilisateurs peuvent placer « paris », alors il va de soi qu'il y aurait une sorte de classe Bet qui définit un pari entre deux personnes. Comme utilisateurs de créer des paris, la liste associée augmentera. Dans le langage Rails, il ressemble à ceci:

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

Le montant de chaque pari est stocké dans le dossier Bet, et le BetPool représente les paris globaux réalisés vers un pari particulier, si vous pouvez avoir un autre terme pour une telle chose.

Un gagnant peut être désigné en affectant l'association bet_pool.winning_user si et quand les paris sont.

Si vous voulez savoir « dossier gagnant » d'un utilisateur, il est aussi facile que toutes les piscines tabuler de paris qu'ils ont gagné et en additionnant les montants.

La raison pour laquelle vous ne voulez pas être constamment ajuster une propriété sur l'enregistrement utilisateur est parce que deux processus indépendants peuvent vouloir modifier cette valeur et vous pouvez retrouver avec une condition de course si le SQL n'est pas mis en œuvre correctement. Par exemple, un utilisateur peut placer un pari et gagner un pari sur une période de temps très court.

Si un utilisateur a commencé avec 1000 $ et deux opérations se déroulent en même temps, cela pourrait se produire:

# 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

Effectué séquentielle vous attendez l'équilibre pour passer de 1000 à 1500 et puis à 1400, mais le deuxième processus a commencé avec la valeur initiale de 1000 quand il chargé, puis ajusté à 900 et enregistré, sur-écriture du résultat de la première.

Il existe des méthodes comme

Autres conseils

Leurs actions sont une entité différente, l'utilisateur réel themself. Gardez les informations utilisateur telles que des informations de profil dans une table. Toutes les autres entités devraient être séparés. Donc, vous voulez séparer que dans une autre table et créer une clé étrangère à la table des utilisateurs pour déterminer quelle ligne dans ce tableau des comptes appartient à l'utilisateur.

scroll top