Esquema de base de datos#
Diseño y relaciones de bases de datos en Construbot.
Descripción general#
Base de datos: PostgreSQL 12+
Grupos de modelos clave:
Usuarios y Autenticación: Usuario, Empresa, Cliente, NivelAcceso
Contratos: Contrato (jerárquico), Contraparte, Sitio
Finanzas: Estimación, Concepto, Retenciones
Configuración: Configuración de cuenta, Unidades
Relaciones centrales#
Estructura de arrendamiento múltiple#
Customer (1)
└── Company (N)
└── User (N via M2M)
All business data → Company (FK)
Claves externas:
Empresa → Cliente
Usuario ↔ Empresa (ManyToMany a través de UserCompany)
Todos los modelos de negocio → Empresa
Jerarquía de contratos#
Contrato (uses django-treebeard)
├── path (Materialized Path)
├── depth
└── numchild
Parent Contract
├── Subcontract 1
│ └── Sub-subcontract 1.1
└── Subcontract 2
Operaciones de árbol:
get_children()get_ancestros()get_descendientes()mover(objetivo, pos)
Relaciones contractuales#
Contrato
├── company (FK) → Company
├── contraparte (FK) → Contraparte
├── sitio_trabajo (FK) → Sitio
├── destinatario (FK) → Destinatario
└── estimates (reverse FK) ← Estimate
Referencia de modelos clave#
Usuarios y Empresas#
Cliente:
class Customer(models.Model):
nombre = CharField(max_length=200)
slug = SlugField(unique=True)
activo = BooleanField(default=True)
Compañía:
class Company(models.Model):
customer = FK(Customer)
nombre = CharField(max_length=200)
slug = SlugField()
# unique_together = ('customer', 'slug')
Usuario:
class User(AbstractUser):
email = EmailField(unique=True) # USERNAME_FIELD
companies = M2M(Company, through='UserCompany')
active_company = FK(Company, null=True)
nivel_acceso = FK(NivelAcceso)
Contratos y Contrapartes#
Contrato:
class Contrato(MP_Node): # Materialized Path tree
company = FK(Company)
folio = CharField(max_length=100)
contraparte = FK(Contraparte)
monto = DecimalField(max_digits=20, decimal_places=2)
anticipo = DecimalField(...) # Advance payment
# unique_together = ('company', 'folio')
Contraparte:
class Contraparte(models.Model):
company = FK(Company)
nombre = CharField(max_length=200)
tipo = CharField(choices=TIPO_CONTRAPARTE)
# TIPO: CLIENTE, DESTAJISTA, SUBCONTRATISTA
Sitio:
class Sitio(models.Model):
company = FK(Company)
cliente = FK(Contraparte, limit_choices_to={'tipo': 'CLIENTE'})
nombre = CharField(max_length=200)
direccion = TextField()
Estimaciones y conceptos#
Estimar:
class Estimate(models.Model):
company = FK(Company)
contrato = FK(Contrato)
numero_estimacion = IntegerField()
fecha = DateField()
monto = DecimalField(...)
Concepto:
class Concept(models.Model):
company = FK(Company)
contrato = FK(Contrato)
code = CharField(max_length=50)
descripcion = TextField()
unidad = FK(Units)
precio_unitario = DecimalField(...)
cantidad = DecimalField(...)
Índices y restricciones#
Índices#
Patrones comunes:
class Contrato(MP_Node):
class Meta:
indexes = [
models.Index(fields=['company', 'folio']),
models.Index(fields=['company', 'fecha_inicio']),
models.Index(fields=['path']), # Tree queries
]
Restricciones únicas#
Singularidad en el ámbito de la empresa:
class Meta:
unique_together = [
('company', 'folio'), # Unique per company
]
Consultas de bases de datos#
Consultas de árbol#
Datos jerárquicos:
# Get all descendants
contract.get_descendants()
# Get children only
contract.get_children()
# Get ancestors
contract.get_ancestors()
Migraciones#
Migraciones clave:
Inicial: crear todos los modelos
django-treebeard: Agregar campos de ruta/profundidad/numchild
Alcance de la empresa: agregar la empresa FK a todos los modelos
Restricciones únicas: agregue Unique_together
Ejecutar migraciones:
python manage.py makemigrations
python manage.py migrate
Optimización de la base de datos#
Agrupación de conexiones#
# In production settings
DATABASES['default']['CONN_MAX_AGE'] = 600 # 10 minutes
Transacciones atómicas#
# Enabled by default
DATABASES['default']['ATOMIC_REQUESTS'] = True
Análisis de consultas#
# Django Debug Toolbar shows queries
# Or use django-silk for profiling
Ver también#
Multi-inquilino - Multi-tenant architecture
Modelos - Model documentation
Descripción general - System architecture