Pregunta

Estoy construyendo mi primera aplicación ferroviario y que se empieza a configurar mi base de datos. Tengo una tabla simpel Usuarios containg nombre, e-mail (login), contraseña y así sucesivamente.

El sitio permite a los usuarios apuestan entre sí (con dinero de monopolio), por lo que necesito para añadir información sobre los usuarios actuales ganancias y otros asuntos delicados a la base de datos.

Pregunta: ¿Debo lugar esta información en la tabla de usuarios o debería crear una tabla de cuentas e insertar la información allí. Me falta el conocimiento para ver si se debería plantear problemas de seguridad para insertar la información en la tabla de usuarios.

Saludos cordiales

Kenneth
Dinamarca

¿Fue útil?

Solución

Desde el punto de vista transaccional, es mucho mejor tener registros auxiliares que las operaciones de pista que modificar un registro único en su lugar.

Por ejemplo, si va a ser un sistema donde los usuarios pueden realizar "apuestas", entonces es lógico pensar que habría algún tipo de clase de apuesta que define una apuesta entre dos personas. A medida que los usuarios crean las apuestas, la lista asociada crecerá. En la jerga de los carriles, que se ve así:

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

La cantidad de cada tipo de apuesta se almacena en el registro de apuesta, y la BetPool representa la apuesta combinada tomada hacia una apuesta particular, aunque es posible que tenga un término diferente para tal cosa.

Un ganador se puede designar mediante la asignación de la asociación bet_pool.winning_user si y cuando las apuestas se resuelven.

Si usted quiere saber "marca ganadora" de un usuario, entonces es tan fácil como la tabulación de todas las polla que han ganado y sumando las cantidades.

La razón por la que no quiere estar ajustando constantemente alguna propiedad en el registro del usuario se debe a dos procesos independientes pueden querer modificar ese valor y se puede terminar con una condición de carrera si el SQL no se aplica correctamente. Por ejemplo, un usuario podría hacer una apuesta y ganar una apuesta en un período muy corto de tiempo.

Si un usuario inició con $ 1000 y dos operaciones se producen simultáneamente, entonces esto podría suceder:

# 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

Hecho secuencialmente uno esperaría que el equilibrio al pasar de 1000 a 1500 y luego hasta 1400, pero el segundo proceso iniciado con el valor original de 1000 cuando se carga, después se ajustó a 900 y salvo, sobre-escribiendo el resultado de la primera.

Existen métodos como de incremento y decremento de ActiveRecord que pueden ayudar con este tipo de cosas, pero los mejores resultados se consiguen simplemente tabular según sea necesario.

Otros consejos

Sus acciones son una entidad diferente, entonces el usuario real de sí mismos. Mantener la información del usuario como la información del perfil en una tabla. Todas las demás entidades deben ser separados. Por lo que desea separar de que en otra tabla y crear una copia de la clave externa a la tabla de usuarios para determinar qué fila de esta tabla de cuentas pertenece al usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top