from app.database import db class Persona(db.Model): __tablename__ = 'personas' cod_id = db.Column(db.Integer, primary_key=True) cod_nombre = db.Column(db.String(255), nullable=False) fecha_nacimiento = db.Column(db.Date, nullable=True) sexo = db.Column(db.String(1), nullable=True) # 'M', 'F' u otros # Relación inversa: Una persona puede tener varias huellas registradas huellas = db.relationship('Huella', backref='persona', cascade='all, delete-orphan', lazy=True) class OrigenHuella(db.Model): __tablename__ = 'origen_huellas' id = db.Column(db.Integer, primary_key=True) descripcion = db.Column(db.String(255), nullable=False) # Ej: Índice, pulgar lado = db.Column(db.String(50), nullable=True) # Ej: Derecho, izquierdo huellas = db.relationship('Huella', backref='origen', lazy=True) #Tipo fundamental para la clasificación dactilar, con relaciones a subclasificaciones y fichas de clasificación class TiposF(db.Model): __tablename__ = 'tipos_f' id = db.Column(db.Integer, primary_key=True, autoincrement=True) nombre = db.Column(db.String(255), nullable=False) # Ej: Arco, Presilla, Verticilo foto = db.Column(db.LargeBinary, nullable=True) # Almacenamiento binario eficiente en Postgres descripcion = db.Column(db.Text, nullable=True) subclasificaciones = db.relationship('Subclasificacion', backref='tipo_f', lazy=True) fichas = db.relationship('FichaClasificacion', backref='tipo_f', lazy=True) class Subclasificacion(db.Model): __tablename__ = 'subclasificaciones' id = db.Column(db.Integer, primary_key=True, autoincrement=True) nombre = db.Column(db.String(255), nullable=False) # Ej: Arco simple, Presilla derecha tipo_f_id = db.Column(db.Integer, db.ForeignKey('tipos_f.id', ondelete='RESTRICT'), nullable=False) fichas = db.relationship('FichaClasificacion', backref='subclasificacion', lazy=True) class Huella(db.Model): __tablename__ = 'huellas' id = db.Column(db.Integer, primary_key=True, autoincrement=True) descripcion = db.Column(db.String(255), nullable=True) origen_hd = db.Column(db.String(255), nullable=True) # Ej: Escáner, Tinta foto = db.Column(db.LargeBinary, nullable=True) # Imagen de la huella dactilar (Fichero RAW/WSQ) persona_cod_id = db.Column(db.Integer, db.ForeignKey('personas.cod_id', ondelete='CASCADE'), nullable=False) origen_huella_id = db.Column(db.Integer, db.ForeignKey('origen_huellas.id', ondelete='RESTRICT'), nullable=False) # Relaciones Muchos a Muchos mediante tabla intermedia con atributos compuestos puntos_caracteristicos = db.relationship('HuellaPuntoCaracteristico', backref='huella', cascade='all, delete-orphan', lazy=True) fichas = db.relationship('FichaClasificacion', backref='huella', cascade='all, delete-orphan', lazy=True) class PuntoCaracteristico(db.Model): __tablename__ = 'puntos_caracteristicos' id = db.Column(db.Integer, primary_key=True, autoincrement=True) nombre = db.Column(db.String(255), nullable=False) # Ej: Bifurcación, Final de cresta foto = db.Column(db.LargeBinary, nullable=True) # Gráfico patrón del punto huellas_asociadas = db.relationship('HuellaPuntoCaracteristico', backref='punto', cascade='all, delete-orphan', lazy=True) class HuellaPuntoCaracteristico(db.Model): """ Tabla pivote relacional con atributos de coordenadas geo-espaciales (X, Y) y ángulo de la minucia """ __tablename__ = 'huella_punto_caracteristico' huella_id = db.Column(db.Integer, db.ForeignKey('huellas.id', ondelete='CASCADE'), primary_key=True) punto_id = db.Column(db.Integer, db.ForeignKey('puntos_caracteristicos.id', ondelete='CASCADE'), primary_key=True) # Coordenadas numéricas precisas para algoritmos de correspondencia (Matching) x = db.Column(db.Numeric(10, 6), nullable=False) y = db.Column(db.Numeric(10, 6), nullable=False) angulo = db.Column(db.Numeric(5, 2), nullable=False) class FichaClasificacion(db.Model): __tablename__ = 'fichas_clasificacion' id = db.Column(db.Integer, primary_key=True, autoincrement=True) huella_id = db.Column(db.Integer, db.ForeignKey('huellas.id', ondelete='CASCADE'), nullable=False) subclasificacion_id = db.Column(db.Integer, db.ForeignKey('subclasificaciones.id', ondelete='RESTRICT'), nullable=False) tipos_f_id = db.Column(db.Integer, db.ForeignKey('tipos_f.id', ondelete='RESTRICT'), nullable=False) fecha = db.Column(db.Date, nullable=False, default=db.func.current_date())