92 lines
4.5 KiB
Python
92 lines
4.5 KiB
Python
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()) |