es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué sucede con el id cuando se borra una fila con una clave externa en SQLite?

Tengo estas dos tablas:

class User(Base):
    """Entrada de usuario en la base de datos"""
    __tablename__ = "users"
    # ID identifica de forma única
    id             = Column(Integer, primary_key=True, index=True)
    kerberos       = Column(String, unique=True, index=True)
    hashpass       = Column(String)
    is_active      = Column(Boolean, default=True)
    creation_date  = Column(DateTime, default=None)

    scores = relationship("Score", back_populates="owner")

class Score(Base):
    """Almacena las puntuaciones de cada usuario"""
    __tablename__ = "scores"

    id    = Column(Integer, primary_key=True, index=True)
    user_id = Column(String, ForeignKey("users.id"), index=True)
    score = Column(Integer)
    time = Column(DateTime)

    owner = relationship("User", back_populates="scores")

He leído que añadir nuevos “Usuarios” incrementará automáticamente el campo “id”.
Ahora cada entrada en la tabla “scores” tiene una clave externa que apunta a users.id. Esto significa (corrígeme si me equivoco), que cada entrada “score” se mapea a un único Usuario (por lo que la relación score:usuario es a varios:uno).

Me pregunto si esto es un buen diseño, especialmente si elimino un usuario, ¿qué ocurre?
¿Eliminar un usuario invalida/elimina automáticamente las puntuaciones correspondientes que están vinculadas a través del id del usuario eliminado (clave externa para esas puntuaciones)? Me preocupa que al eliminar un usuario, todos los id de usuario posteriores se desplacen hacia abajo en uno, por lo que habría un problema de desajuste por uno al mirar las puntuaciones de un usuario.

¿Es este un buen diseño? Siéntete libre de vincular recursos o redirigir a otra pregunta (no pude encontrar ninguna específicamente).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En general, se considera un buen diseño tener una relación de clave externa entre tablas para garantizar la integridad y consistencia de los datos. En el caso de las tablas proporcionadas, tener una relación de clave externa entre las puntuaciones y los usuarios asegura que cada puntuación esté asociada a un usuario único.

    Sin embargo, eliminar a un usuario podría resultar en puntuaciones huérfanas que no estén asociadas a ningún usuario. Este problema se puede solucionar configurando eliminaciones en cascada en el esquema de la base de datos. Esto significa que cuando se elimine a un usuario, todas las puntuaciones correspondientes también se eliminarán automáticamente.

    En cuanto al problema del desfase por uno, es importante tener en cuenta que la clave primaria (id) en la tabla de usuarios no debería usarse como punto de referencia en la lógica de la aplicación. En su lugar, se debería utilizar un identificador único separado para identificar a los usuarios y evitar cualquier problema al eliminar o agregar usuarios.

    En general, el diseño es bueno, pero es importante configurar eliminaciones en cascada y utilizar identificadores únicos para los usuarios en la lógica de la aplicación para garantizar la consistencia y la integridad de los datos.

Comments are closed.